WordPress邮件发送在使用第三方SMTP时因SPF与DKIM配置错误而失败的排查

好的,我们现在开始。

WordPress邮件发送:第三方SMTP与SPF/DKIM配置排查

各位朋友,大家好!今天我们来聊聊WordPress邮件发送中一个常见但又容易让人头疼的问题:使用第三方SMTP服务时,由于SPF和DKIM配置不当导致的邮件发送失败。这个问题不仅仅是简单的配置错误,它涉及到邮件安全、域名验证以及邮件服务器之间的信任关系。希望通过今天的讲解,大家能够对这个问题有一个更深入的理解,并能够独立排查和解决相关问题。

一、邮件发送的基本原理

在深入SPF和DKIM之前,我们先来简单回顾一下邮件发送的基本原理。当你在WordPress网站上执行一个邮件发送操作(例如,用户注册、找回密码、评论通知等)时,通常会发生以下步骤:

  1. WordPress生成邮件: WordPress利用PHP的mail()函数或者第三方邮件插件(例如WP Mail SMTP by WPForms, Easy WP SMTP等)生成邮件内容,包括收件人、发件人、主题、正文等。

  2. 邮件传递给SMTP服务器: WordPress将邮件交给配置好的SMTP服务器。这个SMTP服务器可以是你的主机提供商提供的,也可以是第三方的,例如Gmail, SendGrid, Mailgun等。

  3. SMTP服务器发送邮件: SMTP服务器根据收件人的域名,将邮件路由到收件人邮件服务器。

  4. 收件人邮件服务器接收邮件: 收件人邮件服务器接收邮件,并进行一系列的安全检查,例如SPF, DKIM, DMARC等,以判断邮件是否可信。

  5. 邮件投递到收件箱或垃圾箱: 如果邮件通过了安全检查,就会被投递到收件人的收件箱。否则,可能会被投递到垃圾箱,甚至直接被拒绝接收。

二、SPF:邮件发送者策略框架

SPF(Sender Policy Framework)是一种用于防止邮件伪造的技术。它的工作原理是:

  1. 域名所有者发布SPF记录: 域名所有者在其域名的DNS记录中添加一条TXT类型的SPF记录。这条记录声明了哪些IP地址或域名是被授权从该域名发送邮件的。

  2. 收件人邮件服务器检查SPF记录: 当收件人邮件服务器收到一封邮件时,它会查找发件人域名(例如@example.com)的SPF记录。

  3. 验证IP地址: 收件人邮件服务器会检查发送邮件的服务器IP地址是否在SPF记录中被允许。

  4. 判断邮件是否合法: 如果IP地址在SPF记录中,则认为邮件是合法的;否则,认为邮件可能是伪造的。

SPF记录的语法:

一个典型的SPF记录如下所示:

v=spf1 include:_spf.google.com ~all
  • v=spf1:指定SPF的版本,目前通常是spf1
  • include:_spf.google.com:包含_spf.google.com域名的SPF记录。这通常用于使用第三方邮件服务的情况,例如Gmail。
  • ~all:表示如果IP地址不在前面的规则中,则视为软失败。其他选项包括:
    • +all:允许任何IP地址发送邮件(非常不安全,不推荐使用)。
    • -all:拒绝任何不在前面规则中的IP地址发送邮件。
    • ?all:中立,表示不对IP地址进行判断。
    • a:允许域名解析到IP地址发送邮件。
    • mx:允许MX记录指向的服务器发送邮件。
    • ip4:允许指定的IPv4地址发送邮件。例如:ip4:192.168.1.1
    • ip6:允许指定的IPv6地址发送邮件。例如:ip6:2001:db8::1

示例:

假设你的域名是example.com,并且你使用以下方式发送邮件:

  • 你的网站服务器IP地址是192.168.1.100
  • 你使用Gmail作为备用SMTP服务器。

那么你的SPF记录可能如下所示:

v=spf1 ip4:192.168.1.100 include:_spf.google.com ~all

重要提示:

  • 一个域名只能有一条SPF记录。
  • SPF记录必须是TXT类型。
  • SPF记录的长度有限制(通常是255个字符),如果超过限制,需要使用多个include语句。

排查SPF错误:

  1. 检查DNS记录: 使用dig命令(Linux/macOS)或在线DNS查询工具检查你的域名是否有SPF记录,以及SPF记录是否正确。

    dig txt example.com
  2. 分析SPF记录: 仔细分析SPF记录,确保包含了所有需要授权的IP地址和域名。

  3. 测试SPF记录: 使用在线SPF测试工具(例如https://www.mail-tester.com/spf/)测试你的SPF记录是否生效。

三、DKIM:域名密钥识别邮件

DKIM(DomainKeys Identified Mail)是一种使用数字签名来验证邮件发送者身份的技术。它的工作原理是:

  1. 域名所有者生成DKIM密钥对: 域名所有者生成一个公钥和一个私钥。私钥保存在邮件服务器上,公钥发布到DNS记录中。

  2. 邮件服务器使用私钥签名邮件: 当邮件服务器发送邮件时,它会使用私钥对邮件的内容进行签名,并将签名添加到邮件头中。

  3. 收件人邮件服务器使用公钥验证签名: 收件人邮件服务器收到邮件后,会查找发件人域名的DKIM记录,获取公钥,并使用公钥验证邮件的签名。

  4. 判断邮件是否被篡改: 如果签名验证成功,则认为邮件是合法的,并且没有被篡改;否则,认为邮件可能是伪造的或被篡改的。

DKIM记录的语法:

DKIM记录也是TXT类型,通常以selector._domainkey.example.com的形式存在。其中,selector是一个用于区分不同DKIM密钥的字符串。

一个典型的DKIM记录如下所示:

v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlOJu[...]AQAB; s=email
  • v=DKIM1:指定DKIM的版本,目前通常是DKIM1
  • k=rsa:指定密钥类型,通常是RSA。
  • p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlOJu[...]AQAB:公钥。
  • s=email:指定selector,这里是 "email"。

示例:

假设你的域名是example.com,并且你的selector是email。那么你的DKIM记录应该发布到email._domainkey.example.com

生成DKIM密钥:

生成DKIM密钥的方式取决于你使用的邮件服务器或SMTP服务。以下是一些常见的生成DKIM密钥的方法:

  • 使用OpenSSL:

    openssl genrsa -out private.key 2048
    openssl rsa -in private.key -pubout -out public.key
    openssl dkim -extract public.key -domain example.com -selector email > dkim.txt

    然后从 dkim.txt 文件中获取DKIM记录,添加到你的DNS中。

  • 使用SMTP服务提供商的工具: 许多SMTP服务提供商(例如SendGrid, Mailgun)都提供了在线工具来生成DKIM密钥。

排查DKIM错误:

  1. 检查DNS记录: 使用dig命令或在线DNS查询工具检查你的域名是否有DKIM记录,以及DKIM记录是否正确。

    dig txt email._domainkey.example.com
  2. 验证DKIM签名: 发送一封测试邮件,然后查看邮件头,找到DKIM签名。使用在线DKIM验证工具(例如https://www.mail-tester.com/spf/dkim-check)验证签名是否有效。

    DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com;
     s=email; t=1678886400; bh=...; h=From:To:Subject;
     b=...
  3. 检查邮件服务器配置: 确保你的邮件服务器配置正确,能够使用私钥对邮件进行签名。

四、WordPress配置第三方SMTP

现在,我们来讨论如何在WordPress中配置第三方SMTP服务,以便利用SPF和DKIM来提高邮件的可靠性。

1. 选择SMTP插件:

WordPress有很多SMTP插件可供选择,例如WP Mail SMTP by WPForms, Easy WP SMTP, Post SMTP Mailer/Email Log等。这些插件都提供了友好的界面,方便你配置SMTP服务器。

2. 安装并激活插件:

在WordPress后台搜索并安装你选择的SMTP插件,然后激活它。

3. 配置SMTP设置:

进入插件的设置页面,填写以下信息:

字段 说明 示例
发件人邮箱 用于发送邮件的邮箱地址。 [email protected]
发件人姓名 发件人姓名,显示在收件人的邮箱中。 WordPress网站
SMTP主机 SMTP服务器的地址。 smtp.gmail.com (Gmail), smtp.sendgrid.net (SendGrid)
SMTP端口 SMTP服务器的端口号。通常是25, 465, 587。 465 (SSL), 587 (TLS)
加密方式 连接SMTP服务器的加密方式。通常是SSL或TLS。 SSL, TLS
SMTP用户名 SMTP服务器的用户名。 你的Gmail邮箱地址, SendGrid用户名
SMTP密码 SMTP服务器的密码。 重要: 对于Gmail,建议使用应用专用密码,而不是你的主密码。 你的Gmail应用专用密码, SendGrid密码
认证方式 (Auth) 有些SMTP服务器需要认证,有些不需要。选择"是"或"否"。

代码示例(以WP Mail SMTP by WPForms为例):

虽然WP Mail SMTP插件主要通过GUI配置,但我们可以通过代码来进一步自定义一些设置。例如,可以使用wp_mail_smtp_options过滤器来修改SMTP选项:

<?php
/**
 * 修改WP Mail SMTP选项.
 *
 * @param array $options SMTP选项.
 *
 * @return array 修改后的SMTP选项.
 */
function my_custom_wp_mail_smtp_options( $options ) {
    // 强制使用TLS加密
    $options['encryption'] = 'tls';

    // 设置调试模式
    $options['debug'] = true;

    return $options;
}
add_filter( 'wp_mail_smtp_options', 'my_custom_wp_mail_smtp_options' );

这段代码会将SMTP的加密方式强制设置为TLS,并启用调试模式。调试模式可以帮助你查看邮件发送的详细日志,从而更好地排查问题。

4. 发送测试邮件:

配置完成后,发送一封测试邮件,检查是否能够成功发送。如果发送失败,请查看插件的日志,并根据错误提示进行排查。

5. 检查邮件头:

如果测试邮件发送成功,查看邮件头,确认SPF和DKIM验证是否通过。

五、DMARC:基于SPF和DKIM的邮件认证、报告和一致性

DMARC(Domain-based Message Authentication, Reporting & Conformance)是一种建立在SPF和DKIM之上的邮件认证协议。它允许域名所有者指定当SPF和DKIM验证失败时,收件人邮件服务器应该如何处理邮件。同时,DMARC还提供了报告机制,让域名所有者可以了解其域名的邮件使用情况。

DMARC记录的语法:

DMARC记录也是TXT类型,通常发布到_dmarc.example.com

一个典型的DMARC记录如下所示:

v=DMARC1; p=none; rua=mailto:[email protected]; ruf=mailto:[email protected]; adkim=r; aspf=r;
  • v=DMARC1:指定DMARC的版本,目前是DMARC1
  • p=none:指定当SPF和DKIM验证失败时,收件人邮件服务器应该采取的策略。选项包括:
    • none:不对邮件进行任何处理(仅报告)。
    • quarantine:将邮件放入垃圾箱。
    • reject:拒绝接收邮件。
  • rua=mailto:[email protected]:指定接收聚合报告的邮箱地址。聚合报告包含关于邮件流量的统计信息。
  • ruf=mailto:[email protected]:指定接收失败报告的邮箱地址。失败报告包含关于未通过DMARC验证的邮件的详细信息。
  • adkim=r:DKIM对齐模式。r表示宽松模式,s表示严格模式。宽松模式下,只需要组织域名匹配即可;严格模式下,域名必须完全匹配。
  • aspf=r:SPF对齐模式。r表示宽松模式,s表示严格模式。

DMARC的工作流程:

  1. 域名所有者发布DMARC记录: 域名所有者在其域名的DNS记录中添加一条TXT类型的DMARC记录。

  2. 收件人邮件服务器检查DMARC记录: 当收件人邮件服务器收到一封邮件时,它会查找发件人域名的DMARC记录。

  3. 验证SPF和DKIM: 收件人邮件服务器会验证邮件的SPF和DKIM签名。

  4. 应用DMARC策略: 如果SPF和DKIM验证失败,收件人邮件服务器会根据DMARC记录中指定的策略(p=none, p=quarantine, p=reject)来处理邮件。

  5. 发送报告: 收件人邮件服务器会定期向DMARC记录中指定的邮箱地址发送报告,报告邮件流量情况和DMARC验证结果。

重要提示:

  • DMARC依赖于SPF和DKIM,因此必须先正确配置SPF和DKIM。
  • 建议先使用p=none策略,观察一段时间的报告,然后再逐步调整策略,以避免误伤合法邮件。
  • 监控DMARC报告,及时发现和解决邮件发送问题。

六、常见问题与解决方案

  1. SPF记录包含过多域名或IP地址:

    • 问题: SPF记录的长度有限制,如果包含过多域名或IP地址,可能会超过限制,导致SPF验证失败。
    • 解决方案: 尽量减少SPF记录中包含的域名和IP地址。可以使用include语句来包含其他域名的SPF记录。
  2. DKIM签名无效:

    • 问题: DKIM签名无效可能是由于公钥和私钥不匹配,或者邮件内容在传输过程中被篡改。
    • 解决方案: 检查公钥和私钥是否匹配。确保邮件服务器配置正确,能够使用私钥对邮件进行签名。
  3. DMARC策略过于严格:

    • 问题: 如果DMARC策略设置为p=rejectp=quarantine,可能会导致合法邮件被拒绝或放入垃圾箱。
    • 解决方案: 先使用p=none策略,观察一段时间的报告,然后再逐步调整策略。
  4. WordPress插件配置错误:

    • 问题: WordPress SMTP插件配置错误,例如SMTP主机、端口、用户名、密码等信息填写错误,会导致邮件无法发送。
    • 解决方案: 仔细检查插件的配置信息,确保填写正确。使用插件提供的测试邮件功能,检查是否能够成功发送邮件。
  5. 发件人地址不匹配:

    • 问题: 使用第三方SMTP服务时,发件人地址必须与SMTP服务账户关联的域名一致。例如,如果你的SMTP服务账户是[email protected],那么你的WordPress发件人地址也必须是@example.com域名下的地址。
    • 解决方案: 确保WordPress的发件人地址与SMTP服务账户关联的域名一致。

七、调试技巧

  1. 查看邮件头: 邮件头包含了关于邮件发送的详细信息,例如SPF, DKIM, DMARC验证结果。通过查看邮件头,可以快速定位问题。
  2. 启用调试模式: 许多SMTP插件都提供了调试模式,可以记录邮件发送的详细日志。通过查看日志,可以了解邮件发送的整个过程,从而更好地排查问题。
  3. 使用在线工具: 有很多在线工具可以帮助你测试SPF, DKIM, DMARC记录,以及验证邮件签名。这些工具可以快速诊断问题。

八、结论

WordPress邮件发送的SPF和DKIM配置是一个复杂但非常重要的问题。通过理解邮件发送的基本原理,掌握SPF和DKIM的工作方式,以及正确配置WordPress SMTP插件,你可以大大提高邮件的可靠性,避免邮件被误判为垃圾邮件。记住,持续监控和调整你的配置是至关重要的。

保持邮件畅通,保障网站运营!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注