"前言,背景需求
公司有海外客户拒收或当垃圾邮件现象,而公司SMTP在国内,就一个PTR记录你想100%的通达率就已经『凉凉』了!
想达到较好的通达率,一般需要满足以下条件:
- 固定的公网IP地址,做PTR用,而且该IP地址不在”垃圾邮件列表”当中
- DNS要做SPF+DMARC+PTR 记录解释
- 一台在海外的VPS或者基于Linux平台+Postfix的服务器
满足以上条件的话基本上能保证95%的通达率了!!!
需求分析与思路:
为解决客户电邮拒收问题,必须要满足以上条件!思路很简单,国内的SMTP还继续使用,当出现拒收的情况下,把拒收的客户电邮转到海外的VPS上代发出给最终客户。
电邮发送框架:
本公司用户 @mydomain.com –> 目标*@abc.com –> 转发海外SMTP –> 最终客户电邮
这过程很简单,但实施真的较难,即国内SMTP与海外SMTP都必须符合DKIM+SPF+DMARC+PTR的验证,因为两台SMTP都是发送端,代表mydomain.com ,好!思路清晰就开始做吧。
一、SPF记录
登入本公司域名的DNS注册商后台,增加一条TXT记录。
记录名: @ 或者 空 记录值: v=spf1 a mx ip4:34.56.78.90 ~all
记录类型:TXT
意思是允许本域下A、MX记录指向的IP地址还有34.56.78.90都是认可外发本域邮件的。
❞如果你拥有多个域名可以使用 include 参数,日后改变smtp的IP地址只需修改主域名的SPF记录即可。
例如:
主域名为 top.com ,DNS已经做了SPF解释,那a.com b.com c.com 的DNS里SPF应该这样写
记录值: v=spf1 mx include:top.com ~all
意思是本域除了认可MX指定的,还认证top.com的SPF设定值,这种方式非常适合在N多个域名共用一台外发SMTP时使用。
二、DMARC记录
还是在DNS后台加入一条TXT记录
记录名: _dmarc
记录值: v=DMARC1; p=quarantine; pct=5; rua=mailto:[email protected]
记录类型: TXT
DMARC协议是有效解决信头From伪造而诞生的一种新的邮件来源验证手段,为邮件发件人地址提供强大保护,并在邮件收发双方之间建立起一个数据反馈机制。
p:用于告知收件方,当检测到某邮件存在伪造我(发件人)的情况,收件方要做出什么处理,处理方式从轻到重依次为:none为不作任何处理;quarantine为将邮件标记为垃圾邮件;reject为拒绝该邮件。初期建议设置为none。
rua:用于在收件方检测后,将一段时间的汇总报告,发送到哪个邮箱地址。
ruf:用于当检测到伪造邮件时,收件方须将该伪造信息的报告发送到哪个邮箱地址。
三、 PTR记录
PTR记录,是电子邮件系统中的邮件交换记录的一种;另一种邮件交换记录是A记录(在IPv4协议中)或AAAA记录(在IPv6协议中)。PTR记录常被用于反向地址解析。
PTR记录也就是IP反向解析,我们常见的解析都是将域名A记录解析到IP,PTR则是将IP反向解析到对应的域名,通过设置PTR可以提高发信方的信誉,从而提高到达率。
记录名: 90.87.56.34.in-addr.arpa
记录值: mail.mydomain.com
记录类型: PTR
这里注意的是记录名的IP地址是反转写的;另外在购买VPS的时候要先了解是否支持PTR设置。
一般国外的VPS都会直接将购买的时候的hostname设置为PTR记录值,但可以自行修改。
四、DKIM
以上都是在DNS记录上做的设定,DKIM签署是由认证的服务器对每一封信进行电子签名的过程
安装过程以及配置:
apt-get install opendkim opendkim-tools
编辑 vi /etc/opendkim.conf
Domain mydoamin.com KeyFile /etc/postfix/dkim.key Selector mail SOCKET inet:8891@localhost
编辑 vi /etc/default/opendkim
把默认设置打上# 屏蔽掉,
增加以下内容
SOCKET=”inet:8891@localhost”
编辑 vi /etc/postfix/main.cf
增加以下内容
# DKIM milter_default_action = accept milter_protocol = 2 smtpd_milters = inet:localhost:8891 non_smtpd_milters = inet:localhost:8891
生成Key
opendkim-genkey -t -s mail -d mydomain.com
-s: mail 代表选择器,当有多个SMTP时这值就是区分各台SMTP用的
-d: mydoamin.com 代表生成以该域名为密文的key
执行该命令后会在本目录生成 mail.private[私钥] 和 mail.txt[公钥]
cat mail.txt 会看到整条DNS记录内容,我们在DNS中增加一条记录
记录名:mail._domainkey
记录值:v=DKIM1; k=rsa; t=y;p=MIG….密文….QIDAQAB
记录类型: TXT
注意:上-s填入的值与以下mail要相对应,即 -s=abc的话,下面的mail要换abc.
如果有多台SMTP服务器需要授权,有多少台就重复生成多少条KEY, -s要不同的值,然后在DNS记录中增加多条不同记录名的记录。

最后:
- 可以用www.mail-tester.com评测一下你的SMTP评分,小弟通过以上方式取得10满分成绩。
- mail.private[私钥]的权限应该是 opendkim:opendkim ,不然opendkim会启动不了报错。
以下是小弟一些配置文件,新司机可参考! 按一台国内一台国外中继的配置
国内的SMTP没有什么解释的,无论原来是用什么平台或者是什么SMTP,需要做的一点就是,把有需要转发的邮件通过判断发往国外的SMTP中继。例如:发往abc.com的电邮让国内的SMTP直接指向国外的中继,再由中继SMTP发给abc.com,而不是直接由国内SMTP发往abc.com。
以下配置文件全部是国外SMTP上的
vi /etc/opendkim.conf
Syslog yes
SyslogSuccess Yes
LogWhy yes
UMask 002
Canonicalization relaxed/simple
Mode sv
OversignHeaders From
#SubDomains no
#ADSPAction continue
AutoRestart Yes
AutoRestartRate 10/1h
Background yes
DNSTimeout 5
#SignatureAlgorithm rsa-sha256
UserID opendkim:opendkim
Socket inet:8891@localhost
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
vi /etc/opendkim/KeyTable
mail._domainkey.mydomain.com mydomain.com:mail:/etc/postfix/keys/us.private
vi /etc/opendkim/SigningTable
*@netstarmacau.com us._domainkey.netstarmacau.com
vi /etc/opendkim/TrustedHosts
127.0.0.1
localhost
12.34.56.78 <– 这里填你国内的SMTP IP地址
vi /etc/default/opendkim
# Command-line options specified here will override the contents of
# /etc/opendkim.conf. See opendkim(8) for a complete list of options.
#DAEMON_OPTS=””
#
# Uncomment to specify an alternate socket
# Note that setting this will override any Socket value in opendkim.conf
# default:
SOCKET=”inet:8891@localhost” #8891是opendkim守护进程端口
#SOCKET=”local:/var/run/opendkim/opendkim.sock”
# listen on all interfaces on port 54321:
#SOCKET=”inet:54321″
# listen on loopback on port 12345:
#SOCKET=”inet:12345@localhost”
# listen on 192.0.2.1 on port 12345:
#SOCKET=”inet:[email protected]″
vi /etc/postfix/main.cf
增加以下内容
# DKIM
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
milter_protocol = 2
milter_default_action = accept
修改以下内容
myhostname = mail.mydomain.com
mydestination = $myhostname, localhost, mydomain.com
mynetworks = 127.0.0.0/8, 12.34.56.78
这样国外的postfix会无条件允许来自国内12.34.56.78转发过来的电邮再进行二次投递!
如果国内的WAN IP非固定IP地址,那可以用DDNS服务解释实时的动态IP地址,但需要在 /etc/mailname 里加入DDNS域名,因为mynetworks只识别IP地址,不能识别域名。
另外: 这样做虽然postfix允许来自DDNS域名的动态IP地址发信,但DKIM就不会自动签署了,因为DDNS解释出来的域名不在/etc/opendkim/TrustHosts列表内,要解决这个问题其实很简单,在TrustHosts里加入0.0.0.0/0 , 也即信任所有IP地址加签署。