PHPMailer无法正确处理多部分邮件 求助解决方案
PHPMailer发送多部分邮件变为纯文本显示的问题
我用PHPMailer给群组发邮件多年,之前一直正常,但上周开始,发送的多部分邮件全部以纯文本形式显示。更新到最新版PHPMailer后问题依然存在,所有邮件客户端(Gmail、Outlook、Yahoo Mail)都出现这个情况。
我的PHP脚本
<?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require '/fullpath/public_html/tmp/PHPmailer.php'; require '/fullpath/public_html/tmp/SMTP.php'; require '/fullpath/public_html/tmp/Exception.php'; $body = $_POST['msgText']; $mail = new PHPMailer(); $mail->setFrom('MY WEB SITE EMAIL', 'ME'); $mail->addReplyTo('MY EMAIL', 'ME'); $mail->addAddress('MY EMAIL', 'ME'); $mail->Subject = $_POST['subjectText']; $mail->isHTML(true); $mail->SMTPDebug = 2; $mail->Body = $body; $mail->CharSet = 'UTF-8'; $a = $_POST['toText']; // For output display echo "<!DOCTYPE html>\n<html lang=en><head><title>My Test PHP Mailer</title></head>\n<body>\n<h1>My Test PHP Mailer</h1>\n<h4>Sending Emails to:</h4>\n<ul>"; foreach ($mail->parseAddresses($a) as $address) { $mail->addBCC($address['address'], $address['name']); // for release // $mail->addAddress($address['address'], $address['name']); // for testing echo "<li>Name: " . $address['name'] . " - address: [" . $address['address'] . "]</li>\n"; } echo "</ul>\n"; if(!$mail->Send()) { echo "Mailer Error: " . $mail->ErrorInfo; echo "<br>" . $_POST['toText']; } else { echo "<form><textarea name=ta>" . $body . "'></textarea></form>"; } echo "<p><a href='index.php'>Back to index.php</a></p>\n</body>\n</html>"; ?>
收到的邮件显示内容
This is a multi-part message in MIME format. --b1_5S1Pr6ILOHSPuOiGgJGQzPfIPsBjnsOmX6MAuoro Content-Type: text/plain; charset=us-ascii Good luck to all, and thanks for participating, --b1_5S1Pr6ILOHSPuOiGgJGQzPfIPsBjnsOmX6MAuoro Content-Type: text/html; charset=us-ascii <HTML><HEAD> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></HEAD> <BODY bgColor="#ffffff"> <div style="max-width:800px;border:1px solid #666666; padding:9px; background-color:white;"> <DIV><FONT face="Arial" color="#000080" size="6"><B><I>NFL <FONT color="#C80000">Challenge</FONT> 2022</I></B></FONT></DIV> <DIV><FONT face="Arial, Helvetica" color="#ff0000" size="4"><B>Hey Sportsfans,</B></FONT></DIV> <br> <DIV><FONT face="Arial" size="2">Good luck to all, and thanks for participating,</FONT></DIV> <br> </DIV></div> </BODY> </HTML> --b1_5S1Pr6ILOHSPuOiGgJGQzPfIPsBjnsOmX6MAuoro--
补充信息
- 使用PHPMailer 6.1.1版本
- 测试过Gmail、Outlook、Yahoo Mail客户端
- 附上正常与异常邮件的原始源代码:
正常邮件原始内容
Subject: NFL Challenge 2022 - Week 18 Reminder X-PHP-Script: xxxxxxxxxxxx/file.php for 162.252.247.224 X-PHP-Originating-Script: 1002:PHPmailer.php Date: Fri, 6 Jan 2023 01:02:03 +0000 From: NFL Challenge <me@myserver> Message-ID: <GdssaiyhOGwE5lgWdOnRMleJbhKIfeZQPc4TpJB74@www.starbase47.com> X-Mailer: PHPMailer 6.1.1 (https://github.com/PHPMailer/PHPMailer) MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_GdssaiyhOGwE5lgWdOnRMleJbhKIfeZQPc4TpJB74" Content-Transfer-Encoding: 8bit X-CMAE-Envelope: MS4xfNLwjf/lI+ECbHq2uNTaPo2pDBlT0LgWHZfm+1mtCGh1qLdFoViGjgSHemmT9C8buRCOrt1A4pAvnGulYNkPiO6cJBSDRVv2s9yqB3tUM/GOH02Idbpt 4uA8x2WkhDDGrE1gBk+cE3ZeAWqXwfQWDQznYq5N7InVD9s4UlutNmMlACjSidhnEIrzVJHFZsR3gvGOSiEZDf8Xg4jjk51comuqnF4hLvF9slMWKexfPYfp 6Xxsb7BqWoHfbmSTB0WrMR6wzG3e0ybFGe3HDiMIPPCsHfCHUzaLjXMSfUCI8xcbnScfTz9t/00yLtSwLj4nu+sganzgBI433vpvFj28Aw7bDlm4K0iERspz shEaDRpZwHKD44xwCTSsa/zjvrXAdsOo39EuWLtn25QSOT3QYuEKmpe4M1mMGS6BH/oP3rxUGu89rDzc7fBcav7MtnNLI7Wz2kWAnBvuyrZWhKM/vBzLUUd/ uWtz/nhTNzzItSy1rm8ObR+cm6RuWil0uilXF9nF/gg5TzFOixzNgTuvexbclXCl198ACnro7gQfxMM47NeRuZkhQUjjOuhm+k0TeJyRKWD7S1ujA3qfndH/ 8LI= --b1_GdssaiyhOGwE5lgWdOnRMleJbhKIfeZQPc4TpJB74 Content-Type: text/plain; charset=us-ascii NFL Challenge 2022 Hey Sportsfans, ...
异常邮件原始内容
Subject: NFL Challenge 2022 - Playoffs Test X-PHP-Script: www.starbase47.com/mytest_mail.php for 162.252.247.224 X-PHP-Originating-Script: 1002:PHPmailer.php Date: Thu, 12 Jan 2023 21:33:09 +0000 From: NFL Challenge <me@myserver> Message-ID: <5S1Pr6ILOHSPuOiGgJGQzPfIPsBjnsOmX6MAuoro@www.starbase47.com> X-Mailer: PHPMailer 6.1.1 (https://github.com/PHPMailer/PHPMailer) MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_5S1Pr6ILOHSPuOiGgJGQzPfIPsBjnsOmX6MAuoro" Content-Transfer-Encoding: 8bit Message-Id: <E1pG5C9-0006pY-1D@192.222.167.72.host.secureserver.net> From: me@myserver X-CMAE-Envelope: MS4xfI/De/t+kmwbb6eY2xWVi89UxsAiJ5qMwBEnzqpJBSwnrpHKLYrLpRjMnFUNxqZVwAckeapMXSEzXsK71DSiMO5WP0VZxM0iNr0qMiD/lOxS2Sp5+Vb0 4nUe/KgwmKZcA8v6BUI5N0fFqt5Ha2nrzlg4ouBiPrZTTYgrTQ+UQoHWyWWl/LWrhDX5AUYdRYL/DI0Q7u5H+LjjhdKhAOdTeKAPsa+EEkVMxWbX/z27TF2m jzATQVQbCe7u4en0+gEgDg== This is a multi-part message in MIME format. --b1_5S1Pr6ILOHSPuOiGgJGQzPfIPsBjnsOmX6MAuoro Content-Type: text/plain; charset=us-ascii NFL Challenge 2022 Hey Sportsfans, ...
修复方案
对比正常和异常邮件的原始内容,能发现几个核心问题:
- 邮件头格式损坏:异常邮件的多个头字段(Date、From、Message-ID等)未正确换行,挤在同一行,导致客户端无法解析MIME结构。
- 重复头字段:异常邮件出现了两次Message-ID和From字段,是服务器中间代理改写邮件头导致的。
- Content-Type头格式错误:该字段被拆分为两行,边界值前的缩进不符合MIME规范,客户端无法识别正确的分隔边界。
针对这些问题,执行以下修复步骤:
- 强制使用SMTP发送:当前代码默认用PHP的
mail()函数发送,易被服务器邮件程序修改格式。添加SMTP配置,直接通过SMTP服务器发送:$mail->isSMTP(); $mail->Host = 'your-smtp-host.com'; // 填写你的SMTP主机地址 $mail->SMTPAuth = true; $mail->Username = 'your-email@myserver.com'; $mail->Password = 'your-email-password'; $mail->SMTPSecure = 'tls'; // 或ssl,根据服务器配置选择 $mail->Port = 587; // tls对应587,ssl对应465 - 手动设置AltBody:虽然
isHTML(true)会自动生成纯文本版本,但手动设置可避免自动生成的潜在问题,确保双版本内容正确:$mail->AltBody = strip_tags($body); // 从HTML内容中提取纯文本 - 联系主机提供商:确认近期是否修改了邮件服务器配置(如添加过滤、改写头信息的服务),导致邮件格式被破坏。
- 确保PHPMailer为最新稳定版:重新从官方渠道获取最新版本,排除版本兼容问题。
内容的提问来源于stack exchange,提问作者Einstein47
相关产品推荐
相关产品推荐

