当我通过普通邮件服务器(又称中继主机)发送邮件时,我无法让子域通过 SPF 检查。
当前设置如下:
MX 10 mail.example.com.
example.com. TXT "v=spf1 a mx -all"
sub1 TXT "v=spf1 include:example.com -all"
sub2 TXT "v=spf1 a mx -all"
A 1.2.3.4
mail A 1.2.3.5
sub1 A 1.2.3.6
sub2 A 1.2.3.7
(以上只是我的 Linode DNS 区域文件的精简版和“审查版”。还有一些AAAA
子域的条目,但为了简洁起见,我将它们省略了。sub1
和的 SPF 条目sub2
具有不同的值,因为我正在尝试让它工作。)
mail.example.com
正在运行 postfix,并配置为 、 和 的中继主机example.com
。sub1.example.com
它们sub2.example.com
都可以通过邮件服务器正常发送电子邮件(并且也由 DKIM 签名),只是 SPF 存在问题。
当我从类似这样的地址发送邮件时[email protected]
,SPF 检查会顺利通过。但是,当我从类似这样的地址发送邮件时,[email protected]
SPF 检查会失败。能够以两种格式发送电子邮件至关重要。
显然,我在某种程度上误解了 SPF 规范。任何见解都值得赞赏!
编辑2
实际上,带有值的子域 SPF 记录"v=spf1 include:example.com -all"
现在似乎可以正常工作(其他值仍然不起作用)。我猜想我的服务器和 Gmail(我用它来检查 SPF 通过/失败)之间的某个 DNS 缓存只需要更新。无论如何,感谢大家的帮助。
编辑1
以下是使用 Gmail 中的“显示原始”功能的(已审查)标头信息:
Delivered-To: [email protected]
Received: by 10.27.176.132 with SMTP id g4csp19468;
Mon, 6 Oct 2014 09:23:39 -0700 (PDT)
X-Received: by 10.60.223.229 with SMTP id qx5mr2871424.34.1412612619;
Mon, 06 Oct 2014 09:23:39 -0700 (PDT)
Return-Path: <[email protected]>
Received: from mail.example.com (mail.example.com. [01:02::03:04:05:06])
by mx.google.com with ESMTPS id fi7si2708120.75.2014.10.06.09.23.38
for <[email protected]>
(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
Mon, 06 Oct 2014 09:23:38 -0700 (PDT)
Received-SPF: fail (google.com: domain of [email protected] does not designate 01:02::03:04:05:06 as permitted sender) client-ip=01:02::03:04:05:06;
Authentication-Results: mx.google.com;
spf=hardfail (google.com: domain of [email protected] does not designate 01:02::03:04:05:06 as permitted sender) [email protected];
dkim=pass [email protected]
Received: from sub2.example.com (sub2.example.com [IPv6:01:02::03:04:07:08])
by mail.example.com (Postfix) with ESMTPS id 587C7A7;
Mon, 6 Oct 2014 09:23:38 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=example.com; s=mail;
t=1412612618; bh=TN5kedzeI1m7kEkfICUGBMJFkDu6VqIrLGM3ne5ESHQ=;
h=To:From:Subject:Date:From;
b=Hr3ivPismDgCfyk5Sf5pVmIX6LQo0J4Gv7mWer7QP/81ZK5CrDv+o0LwR1Q19vPlF
j0RYKzQpsU2n2r/vqnlj8PY7yEd7pZoaQfByJzY0S4uj8NoyLK3ywVSzRt8c/acjSK
jMTItp+tmK6ZDALMbhhfSHgvTO0N+uozVTgEeMtU=
Received: by sub2.example.com (Postfix, from userid 1000)
id 910FF104; Mon, 6 Oct 2014 09:23:36 -0700 (PDT)
To: [email protected]
From: [email protected]
答案1
子域使用父域的地址发送电子邮件是很常见的。这确实要求跨域协调用户 ID。但是,也有使用不同子域发送电子邮件的情况。
如果您希望子域的 SPF 记录正常工作,则需要每个子域的 MX 和 SPF 记录。如果没有 MX 规范,则包含模型或以下模型都无法工作。(您可以使用A:192.0.2.x
包含的 SPF 记录的规范。)尝试使用绑定定义,例如:
sub1 IN A 192.0.2.6
IN TXT "v=spf1 mx -all"
IN MX mail
由于邮件子域位于您的域中,因此您可以将 指定MX
为mail
或mail.example.com.
。对于不同的域,您始终需要一个完全合格的地址mail.example.net.
。
考虑为您的邮件服务器设置 SPF 记录,如下所示:
mail IN A 192.0.2.5
IN AAAA 2001:DB8::5
IN TXT "v=spf1 a -all"
您的邮件服务器似乎有一个 IPv6 地址。您需要将其作为 AAAA 记录添加到邮件服务器定义中,如图所示。如果您希望 SPF 在 IPv6 上工作,您的邮件服务器/服务将需要一个固定的 IPv6 IP 地址。
虽然对于 SPF 来说不是必需的,但请检查邮件服务器 IP 地址子域的 PTR 记录是否返回其名称。对于 IPv4,您通常需要联系您的提供商。对于 IPv6,您应该能够将网络块委托给您的 DNS,并且您必须配置区域。
答案2
假设您需要 sub1 和 sub2 也发送邮件,那么您需要手动将其 IP 地址添加到 SPF 记录中。仅当您的电子邮件格式为以下格式时,才可以为 sub1.example.com 创建 SPF 记录[电子邮件保护]. 将您的 example.com SPF 更改为以下内容:
example.com.TXT“v=spf1 a mx ip4:1.2.3.6 ip4:1.2.3.7 -all”
您的语法正确,唯一的缺陷是,SPF 记录与 DKIM 不同,它仅匹配电子邮件似乎来自的域。
答案3
Postfix 会尽可能通过 IPv6 发送邮件,但 example.com 的 IPv6(01:02::03:04:05:06,来自邮件头)在 SPF 记录中无效。请额外允许此 IP 或将 Postfix 限制为仅 IPv4。
由于我们想要进步,您可以选择第一个变体:)