Office365 SMTP搭配PHPMailer邮件投递不稳定问题咨询
Office365 SMTP配合PHPMailer投递不稳定解决方案
核心问题排查与修复方案
- 修正循环变量bug:原代码中
foreach($recipients as $recipients)会覆盖原始收件人数组,多收件人场景下会出现投递逻辑异常,仅单收件人时可正常运行,是偶发成功的常见原因,修改为:foreach($recipients as $recipient){ $mail->addBCC($recipient); } - 校验发件人一致性:Office365强制要求发件人地址
$mail->From必须与SMTP认证用户名$mail->Username完全一致,不一致的邮件会被微软后台静默拦截,既不会送达也不会产生退信。 - 确认SMTP配置适配Office365规则:使用STARTTLS加密时必须固定端口为587,同时添加配置关闭自动TLS升级避免兼容性问题:
$mail->Port = 587; $mail->SMTPAutoTLS = false; - 控制发件频率与收件人数量:Office365商用账号默认限制单分钟发件不超过30封,单封邮件密送收件人不超过100个,超出限制的邮件会被临时拦截。
- 升级PHPMailer到6.0以上稳定版本:旧版本PHPMailer对Office365的TLS握手、SMTP协议适配存在缺陷,会出现身份验证通过但投递中断的偶发问题。
- 配置退信头字段:添加自定义头获取拦截原因:
被拦截的邮件会产生退信到发件人邮箱,可通过退信内容确认具体拦截规则。$mail->addCustomHeader('Return-Receipt-To', $from_email);
修正后完整代码
$mail = new PHPMailer(true); // 调整调试等级为2即可,3会输出多余连接日志 $mail->SMTPDebug = 2; $mail->CharSet = "utf-8"; $mail->isSMTP(); $mail->Host = $host; $mail->SMTPAuth = true; $mail->AuthType = 'LOGIN'; $mail->Username = $user; $mail->Password = $pass; $mail->SMTPSecure = "STARTTLS"; // 关闭自动TLS升级适配Office365 $mail->SMTPAutoTLS = false; // 固定Office365 SMTP端口为587 $mail->Port = 587; // 确保此处$from_email与$user完全一致 $mail->From = $from_email; $mail->FromName = $from_name; // 修正循环变量 foreach($recipients as $recipient){ $mail->AddBcc($recipient); } $mail->isHTML(true); $mail->Subject = $subject; $mail->msgHTML($message); // 可选添加退信头 $mail->addCustomHeader('Return-Receipt-To', $from_email);
内容的提问来源于stack exchange,提问作者Arc_mHack
相关产品推荐
相关产品推荐

