本文档详细阐述了为 WordPress 设置本地邮件环境的哲学理念、运行机制及推荐实践。

前置要求

开始之前,您需要对 SMTP 协议 以及三个邮件代理的角色(MUA、MTA 和 MDA)有基本的了解。

WordPress 的邮件处理哲学

WordPress 默认从未提供 MUA 或 MTA。它仅提供一个包装器,用于语言 API 库,该库负责将消息提交给 MTA,而该 MTA 可以与 PHP mail() 函数或 SMTP 扩展进行交互。

这意味着,服务器管理员有责任正确配置 MTA 及相关邮件环境,以便与所选的语言 API 进行交互。历史上,PHPMailer 一直是首选的库。WordPress 不参与发送邮件的过程,仅参与格式化消息以提交给该邮件 API 的过程。

WordPress 开箱即用的邮件运行机制

目前,WordPress 使用 wp_mail() 包装函数。在默认配置下,该包装器指示 PHPMailer 库使用 PHP 内部的 mail() 函数,这需要存在一个充当 MTA 的 sendmail 兼容二进制文件。因此,为了让 WordPress 能够开箱即用,必须正确配置相关的本地邮件环境。

如果您使用的是托管服务,这通常不是问题;但如果您运行自己的服务器且未设置 SMTP 服务器(MTA)和/或未正确配置相关邮件环境,则除非配置 WordPress 的包装器以使用远程 SMTP 服务器,否则无法发送出站邮件。

推荐操作

除了技术方面外,根据不同的场景概述推荐的解决方案也是值得的,以免管理员最终选择不适合他们的方案。

如果您的 WordPress 站点位于托管主机上,通常无需执行额外操作即可发送邮件,但可能需要采取一些额外的措施以确保送达率,如下所述。源自您的 WordPress 安装的邮件应能开箱即用。所有与邮件相关的问题都应咨询您的网络主机,您可能还需要检查主机是否提供通过其管理面板配置 SMTP 中继的选项。

如果您使用的是自托管平台(即运行自己的服务器),通常有三种方式可以设置您的邮件服务:

  • 设置本地 MTA 或专用邮件服务器以直接发送邮件。使用此方法,作为管理员您需负责一切。请注意,即使您已正确配置了所有相关软件,仍可能遇到问题,因为邮件送达率还涉及超出您控制范围的因素,例如 IP 声誉。由于需要大量的开销和持续的维护,这种方法通常仅限于在该领域有经验的管理员使用,因为它可能导致严重的送达率问题。
  • 设置本地 MTA 并将其邮件中继到第三方邮件服务。这是大多数自托管设置的推荐方法,因为它比前一种方法更容易实施,并且仍然保持与 WordPress 哲学的兼容性。如果您不想处理运行完整 MTA 时邮件送达率问题的复杂性,这是最佳选择。事实上,一些小型网络主机也使用此方法(他们与第三方邮件服务提供商持有商业账户,并将所有邮件中继到邮件服务)。如果您托管并管理自己的网站,并通过 WordPress 发送大量电子邮件,这种方法也非常理想,因为它将责任委托给了第三方邮件服务。与第一种方法一样,请注意,正如下一节所解释的那样,此选项并非没有风险。设置 MTA 始终需要一定程度的服务器管理经验,即使您依赖第三方邮件服务。

  • 通过代码配置 SMTP 中继以利用第三方邮件服务。如果您不打算处理大量电子邮件,或者不想处理运行自托管 MTA 时邮件送达率问题的复杂性,这是推荐的方法。请注意,出于多种原因,此方法 会导致性能下降。

设置您自己的 MTA

如果您选择设置 MTA,无论是用于本地还是第三方中继,本节简要介绍了在 *NIX 和 Windows 环境中设置 MTA 的基础知识。在深入了解细节之前,请注意这种方法存在一些风险。端口 25 必须开放,如果不小心可能会造成问题,因为它是最常见的攻击向量之一。如果您未能正确保护 SMTP 中继认证,可能会导致安全问题,甚至导致您的服务器被用于垃圾邮件发送。

*NIX 服务器基础

如果您运行自己的 *NIX 服务器,您的机器上应该已经安装了最流行的 MTA,如 postfix、exim、qmail 或 sendmail,只需进行设置即可(您可以在网上搜索相关教程)。如果您希望使用第三方邮件服务,推荐的做法是设置本地 MTA 以将邮件中继到远程 SMTP 服务器,这样可以防止页面加载时间受到影响。

Windows 主机服务器特定设置

检查 SMTP 虚拟服务器上的“中继”设置。授予 127.0.0.1 访问权限。然后在您的 php.ini 文件中,将 SMTP 设置设置为相同的 IP 地址。还将 smtp_port 设置为 25。

在 Windows 机器上,尝试使用像 支持 TLS v1.2 的 Windows Fake sendmail 这样的 sendmail 模拟器。

MTA 设置的替代方案

如果您不想在本地手动设置完整的 MTA,还有一些其他选项:

  • 使用中继 MTA 代替功能齐全的本地 MTA:例如,msmtp-mta 是一个简化的 MTA,可用于使用远程 SMTP 服务器(即远程 MTA)中继电子邮件。该软件包提供了一个指向 msmtp 的 /usr/sbin/sendmail 符号链接,并具有其他软件可以直接使用的 sendmail 兼容接口。
  • 使用 SMTP 插件:您可以从 WP.org 插件目录安装 SMTP 插件。这类插件会覆盖 wp_mail() 的默认设置,以使用 PHPMailer 或其他任何他们选择的邮件库,这些库利用远程第三方邮件服务代表您的域名发送邮件。

确保送达率

一旦我们的系统开始发送邮件,我们需要确保它们实际上已送达收件人。我们需要检查以下几点:

确保使用了正确的返回地址

默认情况下,WordPress 包装器会将 From: 字段填充为 wordpress@example.com,并将 From: 名称填充为 WordPress。如果这是一个有效的电子邮件地址,这是可以的。例如,如果您的域是 example.com,您的主机将把 wordpress@example.com 传递出去进行投递。只要 example.com 已设置为发送和接收邮件,它很可能会发送您的邮件,即使 wordpress 不是一个有效的邮箱。一些旧的邮件交付代理会检查 From: 地址是否有效且可以接收邮件。这种检查在当今变得越来越少见,但我们建议确保使用有效的电子邮件地址,并且该邮箱存在于您的接收邮件服务器中。如果您使用默认的 From: 地址,只需验证您能否在 wordpress@example.com 邮箱中接收邮件。请记住,example.com 是您 WordPress 安装的域。

如果您不想从与您安装中显示的相同域发送邮件,那么您必须在 WordPress 中进行一些代码更改。例如,如果您的 WP 域是 example.org,但您想从 mail.example.org 发送邮件,邮件可能无法发送,因为 example.org 的 DNS 记录可能不会授权由您的邮件服务器处理邮件,因为默认的 From: 地址将是 wordpress@wordpress.org。要更改默认的 From: 地址,您的 WordPress 可以 使用 wp_mail_from 过滤器。对于名称,您可以使用 wp_mail_from_name 过滤器。

也可能在您配置的 MTA 服务器中强制设置 From: 地址配置。请参阅您 MTA 的相关文档。

回复地址

WordPress 包装器会忽略 Reply-To:,因此它将默认与 From: 地址一致,如上文示例所示,默认为 wordpress@example.com。如果您希望用户能够回复发送的电子邮件,请确保您的接收邮件服务器上存在该邮箱。除非您在邮件头中明确将其设置为不同的地址,否则默认的 Reply-To: 将始终与 From: 地址相同。

仅在一种情况下会自动设置 Reply-To: 地址:当我们向在帖子下发表评论的用户发送邮件时。在这种情况下,Reply-To: 地址将设置为评论者明确指定的电子邮件地址。

解决垃圾邮件投递问题

您的电子邮件消息可能被路由到垃圾邮件文件夹,甚至更糟的是被直接作为恶意邮件丢弃。您可以采取一些措施来说服收件人的邮件服务器您的消息是合法的,并应按地址进行投递。设置 SPF、DKIM 和 DMARC 记录是确保投递的关键步骤。网上有多份指南可帮助您设置这些记录。以下是解释为什么这些记录有益。

SPF(发件人策略框架)

这是最常用的反垃圾邮件措施。MDA 会检查发件人域名的 SPF 记录,以查看其是否被授权为该域名发送邮件。SPF 是一个 TXT DNS 记录,您需要添加它,或检查您的主机是否已为您添加,其中列出了被授权为该域名发送邮件的 IP 地址或主机名。这确保了邮件不是来自未授权的来源。例如,如果未知服务器 IP 地址使用您域名中的名称在 From: 字段中发送邮件,得益于 SPF DNS 记录,MDA 会将该邮件作为垃圾邮件拒绝。但是,如果您未在 DNS 记录中正确配置此内容,您的邮件也可能被作为垃圾邮件拒绝。

请记住,如果您通过不同的服务器发送邮件(包括您的 WordPress 安装),您需要将所有地址添加到 SPF 记录中。

DKIM(域名密钥识别邮件)

这种反垃圾邮件完整性身份验证检查在过去几年中获得了广泛关注,并已被大多数主要电子邮件提供商采用。您可以在同一封邮件中同时使用 SPF 和 DKIM。同样,就像 SPF 一样,您可以通过检查邮件头来确认您的接收邮件服务器是否验证了您主机的域名密钥。与 SPF 一样,如果您可以编辑 TXT DNS 记录,您可以自行设置 DKIM 凭证。如果您处于托管环境中,请咨询您的主机提供商是否已为您设置此功能,因为这已成为常见做法。

如果您必须自行管理,有多种方法可以在邮件中发送正确的 DKIM 签名:

  • 配置您的 MTA 使用 DKIM 签名对邮件进行签名。
  • 某些 SMTP 插件具有 DKIM 签名选项。

  • 使用 PHPMailer 库设置 DKIM 签名。为此,您可能需要 挂钩到 phpmailer_init 操作 并遵循 PHPMailer 库的文档(这不是官方文档,有关更多详细信息,请查看 此帖子)。

此外,请确保使用正确的域名信息生成您的 DKIM 密钥,并相应地发布 DNS 记录。当您将 DKIM 公钥添加到 DNS 记录时,MDA 将检查您的邮件头 DKIM-Signature 并验证签名。如果签名无效,MDA 会将该邮件作为垃圾邮件拒绝。这是为了防止邮件被伪造并从未经授权的来源发送。DKIM 和 SPF 一起使用以确保邮件合法并按地址投递。

DMARC(基于域的邮件认证、报告和一致性)

DMARC 记录是另一个您需要添加或检查您的主机是否已为您添加的 TXT DNS 记录,其中列出了当邮件未通过 SPF 或 DKIM 检查时应采取的操作。DMARC 几乎成为强制要求,为了确保投递,我们建议设置它。您可以在此处阅读更多关于它的信息 这里。