当通过 SMTP 从一个本地邮箱发送到另一个邮箱时,由于客户端 IP 而不是服务器的邮件,导入到 Gmail 的电子邮件的 SPF 失败

Zby*_*zek 7 ip gmail spf exim dovecot

我们有一个带有域的 linux (Debian) VPS(假设 example.com 和 MX mail.example.com)设置了 SPF。dovecot+exim 正在运行。除此之外还有直接管理员。

当我向外国服务器发送邮件时,一切都很好。消息中有服务器 IP,SPF 检查正常。

一些数据发生了变化(域等):

Received: from mail.example.com (mail.example.com. [188.40.153.39])
    by mx.google.com with ESMTPS id ***.7.2015.02.18.04.09.46
    for <*@gmail.com>
    (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
    Wed, 18 Feb 2015 04:09:47 -0800 (PST)
Received-SPF: pass (google.com: domain of test@example.com designates 188.40.153.39 as permitted sender) client-ip=188.40.153.39;
Run Code Online (Sandbox Code Playgroud)

但是,当我将它从本地邮箱发送到另一个本地邮箱,然后通过 POP3 将邮件发送到 gmail 时,我遇到了 SPF 问题,因为邮件包含原始客户端 IP 地址并且 SPF 检查失败。

Authentication-Results: mx.google.com;
   spf=fail (google.com: domain of test@example.com does not designate 82.160.100.10 as permitted sender) smtp.mail=test@example.com
Received-SPF: fail (google.com: domain of test@example.com does not designate 82.160.100.10 as permitted sender) client-ip=82.160.100.10;
Run Code Online (Sandbox Code Playgroud)

82.160.100.10 是原始发件人的 IP。

由于这个问题,我们的内部通信往往在 gmail 中被标记为垃圾邮件,以便通过它检查邮箱的人。

任何想法如何解决这个问题?


编辑:测试邮件的标题(更改了我们的 IP 和域)

1) 从一个盒子发送到另一个盒子的电子邮件 - 来自 Thunderbird 客户端的标题:

Return-path: <ldev@example.com>
Envelope-to: zbyszek@example.com
Delivery-date: Thu, 19 Feb 2015 11:41:20 +0100
Received: from nat10.net08-g2.isko.net.pl ([82.160.100.10] helo=[11.0.0.22])
    by mail.example.com with esmtpsa (TLSv1.2:DHE-RSA-AES128-SHA:128)
    (Exim 4.83)
    (envelope-from <ldev@example.com>)
    id 1YOOPC-0005Ud-Qq
    for zbyszek@example.com; Thu, 19 Feb 2015 11:41:20 +0100
Message-ID: <54E5BDCE.5040207@example.com>
Date: Thu, 19 Feb 2015 11:41:18 +0100
From: Head Developer <ldev@example.com>
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0
MIME-Version: 1.0
To: Zbyszek <zbyszek@example.com>
Subject: This is test
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 7bit
Run Code Online (Sandbox Code Playgroud)

2) gmail 收到后相同的邮件(通过 POP3 自动定期导入):

Delivered-To: *@gmail.com
Received: by 10.140.86.210 with SMTP id p76csp775880qgd;
    Thu, 19 Feb 2015 02:47:12 -0800 (PST)
X-Received: by 10.140.102.165 with SMTP id w34mr10762910qge.26.1424342832562;
    Thu, 19 Feb 2015 02:47:12 -0800 (PST)
Authentication-Results: mx.google.com;
   spf=fail (google.com: domain of ldev@example.com does not designate 82.160.100.10 as permitted sender) smtp.mail=ldev@example.com
Received-SPF: fail (google.com: domain of ldev@example.com does not designate 82.160.100.10 as permitted sender) client-ip=82.160.100.10;
Received: by 10.224.31.8 with POP3 id w8mf619596qac.5;
    Thu, 19 Feb 2015 02:47:12 -0800 (PST)
X-Gmail-Fetch-Info: zbyszek@example.com 2 mail.example.com 110 zbyszek@example.com
Return-path: <ldev@example.com>
Envelope-to: zbyszek@example.com
Delivery-date: Thu, 19 Feb 2015 11:41:20 +0100
Received: from nat10.net08-g2.isko.net.pl ([82.160.100.10] helo=[11.0.0.22])
    by mail.example.com with esmtpsa (TLSv1.2:DHE-RSA-AES128-SHA:128)
    (Exim 4.83)
    (envelope-from <ldev@example.com>)
    id 1YOOXn-0005j5-Tm
    for zbyszek@example.com; Thu, 19 Feb 2015 11:41:20 +0100
Message-ID: <54E5BDCE.5040207@example.com>
Date: Thu, 19 Feb 2015 11:41:18 +0100
From: Head Developer <ldev@example.com>
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0
MIME-Version: 1.0
To: Zbyszek <zbyszek@example.com>
Subject: This is test
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 7bit
Run Code Online (Sandbox Code Playgroud)

编辑:一些额外的信息

  • 传送方式是 SMTP(我使用邮箱 ldev@example.com 从家里的 Thunderbird 发送电子邮件到同一服务器上的另一个邮箱 zbyszek@example.com)
  • 82.160.100.10 是我的家庭 IP,nat10.net08-g2.isko.net.pl 是我的家庭主机名,它解析为该 IP
  • 10.140.102.165是gmail服务器IP
  • 11.0.0.22 是我家庭网络中的本地 IP
  • 邮件服务器 IP 不在任何标头中(如果在那里,它将是 188.40.153.39)。
  • 主机名 mail.example.com 指向邮件服务器 IP
  • 域 IP 不在任何标头中(如果在那里,我会将其更改为 85.17.23.59)
  • 域具有正确的 MX 条目(指向子域 mail.example.com)
  • SPF 记录:“v=spf1 a mx ip4:188.40.153.39 -all”

编辑:未发现的 IP 不是那么敏感

mas*_*oeh 9

免责声明:在 GMail 人员确认之前,此答案只是猜测。

看起来是 GMail 在此处错误处理了您获取的电子邮件。有些人也在这里这里这里报告与您类似的情况

问题是:GMail 在通过 POP3 获取电子邮件后扫描电子邮件时也部署了 SPF 措施。

通常 SPF 检查通过检查发件人地址和客户端 IP 地址的域部分在 SMTP 事务中进行。但是在 POP3 中,GMail 必须解析标题并找到最后一个Received标题。

Received: from nat10.net08-g2.* ([*.160.100.10] helo=[11.0.0.22])
    by mail.example.com with esmtpsa (TLSv1.2:DHE-RSA-AES128-SHA:128)
    (Exim 4.83)
    (envelope-from <ldev@example.com>)
    id 1YOOXn-0005j5-Tm
    for zbyszek@example.com; Thu, 19 Feb 2015 11:41:20 +0100
Run Code Online (Sandbox Code Playgroud)

这是从您的服务器获取的原始电子邮件。它指出您的电子邮件接受来自*.160.100.10发件人 ldev@example.com 的电子邮件。在此阶段,Gmail 会伪装成您的服务器并检查发件人地址 (example.com) 和客户端 IP 地址 (*.160.100.10) 的域部分。结果是预期的:

SPF 软失败,因为 ldev@example.com 的域未将 *.160.100.10 指定为允许的发件人

解决方法是,您可以将 Gmail 过滤器设置为从不将您的电子邮件标记为垃圾邮件。

  • 起初,我认为您可以尝试绕过 gmail SPF 检查器,方法是在标头中添加一些内容,表明客户端正在使用 **经过身份验证的 SMTP 会话**。但是看起来您的电子邮件中已经有 ESMTPA 标头,而 Gmail 仍然忽略它:(。适当的垃圾邮件检查器在计算垃圾邮件分数时会考虑这种标头。例如:[SpamAssasin 会降低经过身份验证的电子邮件的分数](http: //svn.apache.org/repos/asf/spamassassin/branches/3.2/lib/Mail/SpamAssassin/Message/Metadata/Received.pm) 当 Received 标头中有 ESMTPA 标头时。 (2认同)
  • 7 年后 - Gmail 仍然这样做(只是发生在我们身上,另一台服务器) (2认同)