速修 WordPress 6.9 SMTP 邮件发送问题

WordPress最新版会导致网站SMTP发信失败的原因以及修复方式,技术宅发现网站升级到WordPress6.9版本后网站的SMTP发信会失败,报错如下:

MAIL FROM command failed,mail from address must be same as authorization user ,501

图片[1]-速修 WordPress 6.9 SMTP 邮件发送问题-三尾狐

1 、邮件发送失败:WordPress 6.9 已修复核心邮件函数中的信封发件人问题,但如果问题持续,可能源于服务器配置或插件冲突。建议优先配置 SMTP 服务以提升可靠性。下面是以腾讯云的 SMTP 配置为例,将其添加到主题 function.php 或者保存为 .php 放到插件目录即可。

<?php
/**
* Fix SMTP Sender to match From address
* This ensures Aliyun SMTP authentication works correctly
*/
 
add_action('phpmailer_init', function($phpmailer) {
// Only fix if using SMTP
if ($phpmailer->Mailer === 'smtp') {
// Set Sender to match From address to satisfy Aliyun SMTP requirements
if (empty($phpmailer->Sender) || $phpmailer->Sender !== $phpmailer->From) {
$phpmailer->Sender = $phpmailer->From;
}
}
}, 10002); // Run after (999) and other plugins

以上方式来源于网络,我们可以改造自己的STMP代码。

原来的代码:

//WordPress免插件配置SMTP邮件
    function mail_smtp( $phpmailer ) {
    $phpmailer->FromName = '三尾狐'; //发件人名称
    $phpmailer->Host = 'gz-smtp.#####.com'; //修改为你使用的邮箱SMTP服务器
    $phpmailer->Port = 465; //SMTP端口
    $phpmailer->Username = 'no-reply@###########'; //邮箱账户
    $phpmailer->Password = '邮箱密码或授权码'; //邮箱授权码(此处填写QQ邮箱生成的授权码)
    $phpmailer->From = 'no-reply@######'; //邮箱账户
    $phpmailer->SMTPAuth = true;
    $phpmailer->SMTPSecure = 'ssl'; //tls or ssl (port=25时->留空,465时->ssl)
    $phpmailer->IsSMTP();
}
add_action('phpmailer_init', 'mail_smtp');

修复后的代码:

function mail_smtp( $phpmailer ) {
    // 基础配置修正
    $phpmailer->isSMTP(); // 替换旧的IsSMTP(),小写开头
    $phpmailer->FromName = '####';
    $phpmailer->Host = 'gz-smtp.qcloudmail.com';
    $phpmailer->Port = 465;
    $phpmailer->Username = 'no-reply@######';
    $phpmailer->Password = '邮箱密码或授权码';
    $phpmailer->From = 'no-reply@#######';
    
    // 关键兼容性配置
    $phpmailer->SMTPAuth = true;
    $phpmailer->SMTPSecure = 'ssl';
    $phpmailer->CharSet = 'UTF-8'; // 解决中文乱码
    $phpmailer->Sender = 'no-reply@nanjingcunba.cn'; // 保证Sender与From域名一致,通过SPF/DKIM验证
    
    // 调试与错误处理(可选,测试时开启)
    // $phpmailer->SMTPDebug = 2;
    // $phpmailer->Debugoutput = 'html';
}
add_action('phpmailer_init', 'mail_smtp');
 
// 可选:记录邮件发送错误(帮助排查问题)
function log_email_errors( $wp_error ) {
    if ( $wp_error->get_error_code() ) {
        $error = '邮件发送失败:' . $wp_error->get_error_message();
        error_log( $error, 3, WP_CONTENT_DIR . '/email-errors.log' );
    }
}
add_action( 'wp_mail_failed', 'log_email_errors', 10, 1 );

修改说明

  • 方法名修正:将IsSMTP()改为isSMTP()(新版 PHPMailer 的方法命名规范)。
  • Sender 字段补充:新增$phpmailer->Sender并与From地址保持一致,确保邮件通过 SPF、DKIM 等验证。
  • 字符编码设置:添加CharSet = ‘UTF-8’,避免中文发件人名称或邮件内容乱码。
  • 调试与日志:可选开启SMTPDebug和错误日志功能,方便快速定位配置问题(如授权码错误、端口不通等)。

原因分析:WordPress 6.9 邮件发送逻辑变更与SMTP失败核心诱因

WordPress 6.9 作为重大更新版本,围绕后端性能与兼容性进行了深度优化,核心变更包括 JavaScript 模块体系重构(非向后兼容)、交互 API 增强、块样式按需加载等,旨在降低服务器负载并提升站点响应速度。这些底层调整虽经官方提前公示(开发者字段指南),但部分依赖旧版 API 的插件/自定义代码未及时适配,导致邮件发送等依赖第三方服务的功能出现异常。

关键背景:官方修复与潜在冲突点

针对早期版本(如 5.4)中 wp_mail() 函数因未明确信封发件人(Envelope-From) 导致邮件被拒收、标记为垃圾邮件的问题,WordPress 官方通过工单 #49687 推进修复,在 6.9 版本中通过变更集 61010 移除了 setFrom() 方法的 false 参数——这一调整允许 PHPMailer 自动将信封发件人默认设为 wordpress@<站点域名>,并已通过 Postfix、Qmail、Sendmail、Exim 等主流邮件传输代理(MTA)测试,理论上应提升邮件投递率与 DMARC 兼容性。

SMTP 发信失败的核心诱因(与 6.9 变更直接相关)

尽管官方优化旨在改善邮件发送,但实际场景中仍出现失败案例,本质是旧版 SMTP 配置与 6.9 新逻辑的冲突,而非更新本身导致问题,具体包括:

  1. PHPMailer 方法弃用冲突:旧代码中使用的 IsSMTP() 方法(大写开头)已被新版 PHPMailer 弃用,需替换为小写 isSMTP(),否则无法初始化 SMTP 协议;
  2. 信封发件人(Sender)强制验证:6.9 强化了 From 与 Sender 字段的一致性要求,若自定义代码未显式设置 Sender,或其域名与 From 地址不一致,会触发 SPF/DKIM 验证失败,导致邮件被拦截;
  3. 插件/代码优先级冲突:部分未适配 6.9 的邮件插件会覆盖 phpmailer_init 钩子配置,与自定义 SMTP 代码争夺执行优先级,导致配置失效;
  4. 字符编码与协议兼容缺失:旧代码未指定 CharSet = 'UTF-8',可能因中文乱码触发邮件服务器拒收,同时 6.9 对 SSL/TLS 协议的验证更严格,未明确 SMTPSecure 或端口不匹配(如 465 端口未对应 SSL)会导致连接失败。

简言之,WordPress 6.9 本身优化了邮件发送逻辑,SMTP 发信失败的本质是旧版配置未适配新版 API 规范与验证机制,而非更新引入的新问题。

版权声明

站内部分内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请 联系我们 一经核实,立即删除。并对发布账号进行永久封禁处理。


本站仅提供信息存储空间,不拥有所有权,不承担相关法律责任。
© 版权声明
THE END
喜欢就支持一下吧
点赞1124 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容