![Postfix 的 Policyd-spf 返回 550 spf 失败 - 未授权](https://linux22.com/image/779298/Postfix%20%E7%9A%84%20Policyd-spf%20%E8%BF%94%E5%9B%9E%20550%20spf%20%E5%A4%B1%E8%B4%A5%20-%20%E6%9C%AA%E6%8E%88%E6%9D%83.png)
这让我很困惑。我检查了我的 dns、postfix 配置等……一切似乎都很好。而且,它工作正常。我可以发送到 gmail 等……我的 spf、dkim 和 dmarc 记录都通过了。
问题是这样的:
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, permit_auth_destination,
reject_unauth_destination, check_policy_service unix:private/policyd-spf
运行正常。因为 policyd-spf 不会检查来自我域的任何电子邮件。但假设我希望它检查所有电子邮件,因此我将其设置为:
smtpd_recipient_restrictions = reject_unauth_destination, check_policy_service unix:private/policyd-spf
那时我遇到了 spf 失败 - 未授权问题。但是...如果我将其设置为:
smtpd_recipient_restrictions = reject_unauth_destination
Postfix 可以从我的域发送电子邮件并发送到 gmail 等,没有任何问题... 一切如预期。
我读完了https://www.rfc-editor.org/rfc/rfc7208.html尝试弄清楚,并认为可能是 helo,因为当我使用 outlook 发送时,helo 默认为我的帐户名。因此,在 /etc/postfix-policyd-spf-python/policyd-spf.conf 中,我按照以下要求添加了 HELO_reject = No_Checkhttps://manpages.debian.org/testing/postfix-policyd-spf-python/policyd-spf.conf.5.en.html 但那并没有解决问题。我的 mx 记录是:
@ IN MX 10 mail.example.com.
我的 spf 记录是:
@ IN TXT ( "v=spf1 ip4:255.255.255.255 -all" )
在 postfix main.cf 中我有:
smtpd_banner = $mydomain ESMTP (Ubuntu)
mydomain = example.com
myhostname = mail.example.com
myorigin = $mydomain
因为机器名只是例子
也许我只是忽略了这里显而易见的东西?
日志内容如下:
policyd-spf[2599481]: Config: {'debugLevel': 5, 'HELO_reject': 'No_Check', 'Mail_From_reject': 'Fail', 'PermError_reject': 'False', 'TempError_Defer': 'False', 'skip_addresses': '127.0>
policyd-spf[2599481]: Cached data for this instance: []
policyd-spf[2599481]: skip_addresses enabled.
policyd-spf[2599481]: _get_resultcodes: scope: mfrom, Reject_Not_Pass_Domains: None, helo_policy: No_Check, mfrom_policy: Fail
policyd-spf[2599481]: Scope mfrom unused results: ['Pass', 'None', 'Neutral', 'Softfail', 'Temperror', 'Permerror']
policyd-spf[2599481]: mfrom policy true results: actions: {'defer': [], 'reject': ['Fail'], 'prepend': ['Pass', 'None', 'Neutral', 'Softfail', 'Temperror', 'Permerror']} local {'local_>
policyd-spf[2599481]: spfcheck: pyspf result: "['Fail', 'SPF fail - not authorized', 'mailfrom']"
policyd-spf[2599481]: Fail; identity=mailfrom; client-ip=10.0.0.1; helo=accountname; [email protected]; receiver=<UNKNOWN>
policyd-spf[2599481]: Action: None: Text: None Reject action: 550 5.7.23
是因为我的 IP 与服务器不同而拒绝它吗?这在某种程度上是有道理的。但如果是这样的话,那么当您的一个用户发送电子邮件时,是否有可能检查来自您域的邮件的 spf 记录?因为如果(我相信几乎每个人都这样做)从他们的家庭 IP 连接到邮件服务器,这显然与邮件服务器的 IP 不同,spf 检查会查找域,获取授权服务器的 IP,然后将其与您的 IP 进行比较,这会失败吗?我敢肯定这是一个奇怪的极端情况。
答案1
从日志中您可以看到,policyd 认为您的邮件来自私有 IP 地址 10.0.0.1。
显然,该地址未通过域名 example.com(或任何真实域名)的 SPF 检查。
这正如预期的那样。
SPF 有什么用?在你的服务器上,你用它来检查传入邮件。客户端 IP 必须被授权向信封发件人域发送邮件。
检查 SPF 是没有意义的传出邮件。提交到您服务器的邮件通常来自本地或私有 IP 地址,这些 IP 地址永远不会通过您域名的 SPF 检查。