邮件被退回,退信里写着 550 5.7.1,很多时候不是对面服务器抽风,而是它顺手查了你的域名,发现这台发信的机器不在名单上。那份名单就是 SPF。SPF是什么算法,别被“算法”这俩字唬住,它既不是加密也不是签名,就是一条公开摆在 DNS 里的文本,告诉全世界:哪些机器可以用我这个域名发信,剩下的别认。

SPF是什么算法:一条 TXT 记录,几毫秒的核对
收信那一端在接到连接时,会看信封上的发信域名(也就是 Return-Path 或者 MAIL FROM 后面那一段),拿它去查 DNS 里的 TXT,找出以 v=spf1 开头的那条,再把对面连过来的 IP 跟记录里的条目一条条对。对上了叫 pass,对不上叫 fail 或者 softfail,后面怎么处理——丢垃圾箱、打标记、直接拒——是收信方自己的策略,不归你管。整个过程没人工参与,全是机器在几毫秒里跑完的,所以你写错一个字符,也没人提醒你,只会在某天发现客户说没收到报价单。
记录长什么样,扫一眼能认出来
常见的样子是 v=spf1 ip4:192.0.2.10 include:_spf.example.com -all。拆开看没那么玄:ip4 后面跟的就是允许发信的地址,一台机器一条;include 是“把别人维护的那份名单搬过来用”,适合发信走第三方平台的场景;a 和 mx 是让它去查你自己域名的 A 记录或者 MX 主机,省得手写 IP。结尾那个 all 是兜底,意思是“前面都没对上的,按这个处理”。
这里有个容易被忽略的点:include、a、mx 这些指令,每用一次都会触发一次 DNS 查询,而规范对查询次数是有上限的(RFC 7208 里写的是 10 次,具体口径以原文为准)。一层套一层地 include,套到第三第四层就很容易撞线,超了之后对方直接判 permerror,你的邮件照样过不了。所以别把 SPF 当收纳箱,能合并的合并,能删的删。
-all 和 ~all,一字之差坑过不少人
-all 是硬失败,语气很硬:不是我名单里的,一律不认。~all 是软失败,意思是没过也别当场拒,打个标记再说。哪种好?看你域名的用途。如果这个域名只用来自己发通知、发订单、发验证码,机器就那几台,-all 干净利落,也少见别人冒用。但凡你有邮件列表、有自动转发、有部门共用邮箱往外转信,-all 就会开始咬人——因为转发会把原始发信 IP 换掉,SPF 一查必然不过,硬失败直接把邮件挡在门外。这种场景老老实实写 ~all,别逞强。
三条最常见的写错法,中过一条就够折腾半天
第一条,DNS 里躺着两条 v=spf1 记录。多半是换服务商的时候新的加上了,旧的忘了删,或者用了某个一键配置工具又手动补了一次。规范里一个域名只认一条 SPF,出现两条的结果是不可预测,有的收信方直接判 none,等于你白写。合并成一条,别偷懒。第二条,加了新服务器忘了改记录。扩容、换机房、上高防、回源 IP 变了,这些动作在运维眼里是日常,在 SPF 眼里就是陌生人。第三条,记录写错了位置。SPF 要写在用来发信的那个域名上,主域写一条,发信的营销子域也要各自写,别以为主域写了就全家通用。
SPF 管不住转发,这事儿得认
邮件列表、自动转发、有些工单系统代发通知,这些环节会把发信来源改成它自己的地址或者保留原地址却换了 IP,SPF 就断链了。这不是你配错,是这套机制天生的短板。也正因为如此,才有了 DKIM 那套签名校验和 DMARC 那套对齐策略。三者的分工可以这么记:SPF 认机器,DKIM 认签名,DMARC 则告诉对方“我这俩都没过的时候你该怎么办”,顺便把汇总报告发回给你。真要把送达率当回事,三个一起上,别只盯 SPF。
自己动手查,两条命令的事
在本地开个终端就行。dig +short TXT example.com,或者 nslookup -type=txt example.com 8.8.8.8,把域名换成你自己的。看返回里 v=spf1 是不是只有一条,include 后面的域名能不能正常解析出东西,结尾的 all 前面是减号还是波浪号。改完记录别急着测,DNS 有缓存,等 TTL 过去再看一遍。在线检测工具也能用,图个省事,但它拿到的结果同样受缓存影响,两边对不上时以直接查询的结果为准。
共享主机和独立 IP,跟这事也扯得上关系
用虚拟主机的时候,出口 IP 往往是和别人共用的,同一台机器上有人乱发信,整段 IP 的信誉就会被拖累。这时候你的 SPF 写得再对,也只能保证“我不是冒充的”,保证不了“我一定进收件箱”,信誉是另一本账。反过来,自己拿独立 IP 或者云主机的,别以为 IP 独享就万事大吉,换机器、加节点、做负载,出口地址一变,SPF 里没跟着补,前功尽弃。
给你一份能直接照着做的清单:一,确认发信域名下只有一条 v=spf1 记录;二,把所有实际发信的出口 IP 或第三方平台的 include 都列全;三,有转发和邮件列表的,兜底用 ~all 不用 -all;四,控制 include 的嵌套层数,别撞查询上限;五,换机器、换机房、换服务商之后,把这条记录当配置项一起改。这几步做完,剩下的就是等 DNS 生效,然后自己往常用邮箱发一封试试,看信头里那行 spf=pass 有没有出现。
【版权声明】:本站内容若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!