mzh/blog

如何正确发送Email---SPF,DKIM介绍与配置

对很多管理员来说,添加邮件服务无非就是安装个exim4.就能用了.殊不知,其实现代的邮件为了防止垃圾邮件,已经走得太远太远了. 搜索中文圈,压根没有相关资料,这里我就当抛砖了.

SPF

全名Sender Policy Framework,用来鉴别发送邮件的服务器或者IP,是否为该域允许的范围。 这需要在发送邮件的域名下添加一条TXT记录,举个例子: example.net. TXT "v=spf1 mx a:pluto.example.net include:aspmx.googlemail.com -all" v=spf1做开头为必须,spf1说明这是第一版spf协议 SPF规定有6种机制:

还有四种修饰符分别意义是:

这样例子中 example.net. TXT "v=spf1 mx a:pluto.example.net include:aspmx.googlemail.com -all" 的意思是

mx允许所有MX记录
a:pluto.example.netpluto.example.net的A记录也允许
include:aspmx.googlemail.com其余记录参考aspmx.googlemail.com
-all拒绝所有其他记录

DKIM

由于SPF天生只验证是否可以发信, 不保证这个发信人是验证的,因此,SPF验证通过的仍然可能是伪造的邮件. 这就需要DKIM来进一步保证这封邮件不是伪造的. 在特殊的子域名”_domainkey”(例如:_domainkey.example.com)的TXT记录中插入一对RSA密钥中的公钥, 而RSA的私钥用来加密邮件的部分字段. 收到邮件的服务器发现有DKIM-SIGNATURE字段时,会自动校验DKIM的公钥, 按照匹配程度进行处理. 这样就完成了验证.

+---------------+           +-----------------+
| SenderServer  |           | ReceiverServer  |
+---------------+           +-----------------+
        | -----------------\         |
        |-| Calculate DKIM |         |
        | |----------------|         |
        |                            |
        | Send singed mail           |
        |--------------------------->|
        |                            |
        |          Check DKIM record |
        |< ---------------------------|
        |                            | ---------------------------\
        |                            |-| OK, found key and verify |
        |                            | |--------------------------|
        |                            |

还可以在特殊子域名之上,再建立一堆域名,例如authmail._domainkey.example.com,这样在校验邮件时还可以选择不同的密钥. 协议的内容相对来说就简单很多了,只有三种值:

DMARC

该验证的都验证了,还有个DMARC是干吗的呢? 这是为了给域名邮件的拥有者报告垃圾邮件的状况而设定的规则. 和之前的方法一样,在_dmarc.example.com下面设定自己的DMARC规则, 具体就参考Google 提供的文档 吧.

https://support.google.com/a/answer/2466580?hl=zh-Hans&ref_topic=2759254