WordPress 6.9 改进邮件发送功能,要求发件人地址和邮箱地址一致

先简单介绍一个邮件系统中的一个概念:发件人地址,也称为 Envelope-FromMAIL 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_from Filter 来过滤发件人地址。

所以我们需要在 #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。


©我爱水煮鱼,本站推荐使用的主机:阿里云,国外主机建议使用BlueHost

本站长期承接 WordPress 优化建站业务,请联系微信:「chenduopapa」。