![SPF、CloudFlare、Google Apps - 通过联系表单发送的电子邮件被标记为垃圾邮件](https://linux22.com/image/682786/SPF%E3%80%81CloudFlare%E3%80%81Google%20Apps%20-%20%E9%80%9A%E8%BF%87%E8%81%94%E7%B3%BB%E8%A1%A8%E5%8D%95%E5%8F%91%E9%80%81%E7%9A%84%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%E8%A2%AB%E6%A0%87%E8%AE%B0%E4%B8%BA%E5%9E%83%E5%9C%BE%E9%82%AE%E4%BB%B6.png)
将服务器置于 CloudFlare 之后的主要原因之一是隐藏服务器的 IP 地址,这样攻击者就无法对您的 IP 进行 DDoS 攻击,从而使 CloudFlare 失效。将服务器置于 CloudFlare 之后,他们的 IP 就会暴露给外界,因此只有您知道您的服务器的 IP 地址,其他人都不知道。
这里的问题是,当您想使用网站上的联系表单接收访客的邮件时。通过使用联系表单,基本上您的原始服务器 IP 会向您或您想要的任何地址发送电子邮件。
但现在由于服务器位于 CloudFlare 后面,以下 SPF 记录会成为一种障碍
v=spf1 a include:_spf.google.com ~all
因为和a
之间的字母表示所有在 DNS 中具有 A 记录的 IP 都允许发送电子邮件。但是,通过使用 CloudFlare,原始服务器的 IP 不再可见,并且 CloudFlare 的 IP 被标识为允许发送电子邮件的 IP,而不是您的真实服务器的 IP。结果,从您的服务器通过 PHP 发送的每封电子邮件都被标记为垃圾邮件,因为该 IP 现在基本上不允许发送电子邮件。v=spf1
include:_spf.google.com
当然,你可以在 SPF 记录中添加真实服务器的 IP,如下所示,以允许其发送电子邮件并立即解决问题
v=spf1 a ip4:xxx.xx.xxx.xx include:_spf.google.com ~all
但这首先违背了使用 CloudFlare 的目的。他们也明确告诉你不要将服务器的 IP 放在任何可以公开显示的地方,包括 SPF 和 TXT 条目。
当您想使用 Google Apps 直接发送/接收电子邮件时,当然没有问题,因为您使用 Google 服务器来实现这一点(您的 SPF 记录表明他们被允许这样做),但在上述情况下,如果您想使用 CloudFlare,您将无法在您的网站上使用简单的联系表格。
您还可以将 SPF 记录中的最后一位从 更改为,~all
这样?all
除 SPF 记录中指定的 IP 之外的所有其他 IP 都可以被视为中性,但这不会停止将来自您的联系表单的电子邮件标记为垃圾邮件。
我是否忽略了一些非常明显的东西,或者如果您想使用 CloudFlare,您应该完全忘记使用您服务器的 IP?
答案1
我想到了一些可能的解决方案:
如果您只给自己发送电子邮件,您可能能够在收件人端将您自己的服务器列入白名单(而不是通过 SPF)。
在您的网站上设置联系表单实际上并不一定要求您自己的 Web 服务器也发送电子邮件;有很多服务提供商提供交易电子邮件。如果您选择这种方式,您只需按照该服务提供商的说明,了解在您的 SPF 记录中包含哪些内容,并通过他们发送您的出站电子邮件。
为了解决更普遍的问题:
如果您将服务器隐藏在代理解决方案后面,如您的问题中所述,您确实会通过发布服务器的地址或甚至只是与不受信任的方建立出站连接来破坏它。
答案2
我想看看您在发送电子邮件的联系表单上使用的代码。很多人使用填写电子邮件的人的“发件人”地址。
当这种情况发生时,使用 Google 时您将面临一场噩梦。如果发送电子邮件的人已启用 DMARC。您的 SPF 可能会通过(但不会对齐)。
您可以在此处阅读有关此场景的内容:DMARC 和联系我们表格
文章推荐了一种解决方法 - 但我认为更聪明的方法是将“回复”设置为填写联系我们表格的人的电子邮件地址。
如果您使用您的电子邮件地址作为发件人和收件人,并且您向 Google 进行了身份验证,那么您实际上是在给自己发送电子邮件,我认为这会跳过身份验证检查。
答案3
我相信,考虑到这一特定场景中的所有警告和限制,我找到了最合适的解决方案。
林德奎斯特的解决方案很好,但如果您在收件人端将自己的服务器列入白名单(在 Google Apps 中,而不是通过 SPF),同时对p=reject
服务器发送给您的电子邮件设置 DMARC 策略,则无论使用 Google Apps 中的过滤器是否将其列入白名单,您的电子邮件都将被拒绝。
另外,如果你使用第三方跨国电子邮件提供商设置联系表单,例如表格风潮您仍然无法继续,因为如果您将 DMARC 策略设置为p=reject
服务器发送给您的所有其他电子邮件(不是通过联系表单),但是在 reebot、fail2ban 重启等情况下,来自 root、www-data、fail2ban 和其他服务器用户,他们将被全部拒绝。
解决办法是设置 DKIM在您的服务器上,这样至少会满足一个条件。来自您服务器的电子邮件仍会在 SPF 上软失败(您在那里没有服务器的 IP),但它们会通过 DKIM,这足以让 DMARC 通过。
答案4
TXT SPF 记录必须指定代表给定域发送邮件的授权服务器的 IP。显而易见的解决方案是使用其他服务器发送电子邮件,而不是您的 Web 服务器。
最简单的方法是使用外部 SMTP 提供商 - 过去我曾使用过验证SMTP,但我确信还有很多可用的。
在这种情况下,如果您有联系表单,并且正在向您和提交者发送电子邮件,则您的服务器会创建电子邮件,但使用 SMTP 与您的外部提供商一起发送。TXT SPF 记录代表您的域授权发送。指向 Google Apps 的 MX 记录意味着电子邮件回复不会到达您的服务器。