WordPress 6.9 改进邮件发送功能,要求发件人地址和邮箱地址一致
先简单介绍一个邮件系统中的一个概念:发件人地址,也称为 Envelope-From、MAIL FROM 或者 Return-Path 等,它是其他邮件服务器在无法投递邮件时发送“退信”的地址。
自 WordPress 4.7.0 以来,该值由外发邮件服务器设置(默认使用 wordpress@home_url()),常常导致配置错误,这听起来似乎不是大问题,站点可能只是收不到投递失败的通知。
但由于防止垃圾邮件传播的发件人策略框架(SPF) 和 DMARC 系统的存在,它变成了一个更严重的问题,SPF 和 DMARC 系统旨在阻止垃圾邮件的传播,它们会完全拒绝这些邮件。
比如在 WordPress 6.9,使用 #WPJAM Basic# 的 SMTP 功能进行测试,就会报错,大概意思就是发件人地址和 SMTP 邮箱地址不一致:

WordPress 6.9 以可扩展的方式设置发件人地址:
- 如果邮件头中存在 From 地址,则使用该地址。
- 否则,默认使用
wordpress@home_url(),其中home_url()就是博客首页地址。 - 如果推断出的或默认的地址不正确,插件随后可以通过
wp_mail_fromFilter 来过滤发件人地址。
所以我们需要在 #WPJAM Basic# 的 SMTP 扩展中加入一行:
add_filter('wp_mail_from', fn()=> self::get_setting('user'));
然后 WordPress 就把把这个发件人地址设置成 SMTP 邮箱地址。
此外 WordPress 6.9 还修复了两个发信相关的问题,对于不太使用邮箱的同学来说,可能没有察觉到,这里简单提一下。
修复了邮件编码在多次调用间意外保持的问题
wp_mail()调用全局的 $phpmailer对象来实际发送邮件,这意味着在同一个 PHP 请求中的多次调用会共享某些状态。PHPMailer 类内部的逻辑会检查消息中的某些因素,用以设置或更改外发邮件的编码头。因为该对象是全局的,这些编码更改会持续存在,在某些情况下会应用到后续邮件中,导致阅读邮件时出现问题。
6.9 版本则改成在发送每封邮件之前,内部编码都会被重置,以便 PHPMailer 能够仅根据服务器配置和该特定消息的细节,为每封邮件发送适当的编码类型。
为多部分邮件分配了正确的内容类型
在过去的十七年里,WordPress 与 PHPMailer 在处理多部分消息时存在一个潜伏的 Bug,WordPress 向 PHPMailer 发送了损坏的 ContentType,在这些情况下,由于这个无效的内容类型,PHPMailer 会进一步损坏外发消息。在极少数情况下,这会导致重复的 Content-Type 头,但更常见的问题是破坏了多部分邮件的边界。
6.9 版本通过依赖 PHPMailer 自身的功能来设置内容类型,而不是(错误地)尝试手动指定该头,从而简化了之前的修复。
WPJAM Basic 会很快更新新版,让「SMTP 发信」功能兼容 WordPress 6.9。