自建smtp邮局发送邮件的一些坑

必要性介绍

因为信息保密的需要,或者担心竞争对手获取和分析自己邮件中的商业秘密,有一些项目不方便使用腾讯、网易、Amazon和mailgun等服务发送敏感信息。于是产生了自建smtp邮件服务器直接向外发送邮件的需求。

这里对自建smtp邮局对外发送邮件的一些坑进行总结,希望对需要的朋友有点帮助

smtp协议简介

最新SMTP协议RFC5321地址:https://tools.ietf.org/html/rfc5321

smtp,简单邮件传输协议,是一个80年代起就广泛使用的基于TCP使用ASCII字符来传输信息的协议。

网络主机A向B发送信息,A可以连接B的25端口,然后明文发起一串ascii字符的会话,达到将信息从主机A传输到B的任务。

出现多媒体的时候,就用MIME格式来表示二进制数据。

SMTP会话例子

C client S Server

C telnet S 的 25 端口

S: 220 smtp.abc.com ESMTP Postfix
C: HELO me.com
S: 250 smtp.abc.com, OK
C: MAIL FROM:<bob@me.com>
S: 250 Ok
C: RCPT TO:<alice@abc.com>
S: 250 Ok
C: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: From: "Bob" <bob@me.com>
C: To: Alice <alice@abc.com>
C: Date: Tue, 15 Jan 2008 16:02:43 -0500
NICE TO MEET YOU
C: .
S: 250 Ok: queued as 12345
C: QUIT
S: 221 Bye

这么简单的ascii文字交互,几乎就是邮件发送的全部细节。

SMTP挑战和坑

既然邮件发送是这么简单,而且没有太多的硬性成本,所以垃圾邮件的泛滥在所难免。所以在多年后的今天,我们自己想搭建一个smtp服务发送一些类似于验证码的邮件,会显得这么困难。

下面我们提到一些坑

域名方面

很多SMTP发送邮件的坑,都发生在域名这里,所以对域名设置一定准确。

1 域名非主流

有的朋友使用 .cc .tk .ml 等域名来注册邮局发送邮件。虽然RFC协议并没有说不可以使用这些域名。但域名的歧视依然存在,特别是很多垃圾发送者使用免费的TK ML等国家域名来发送邮件的时候,你再使用这些免费域名,肯定遇到很多莫名其妙的拦截

2 没有做PTR 解析

PTR,也称为rDNS,例如cloudflare.com 的域名 A 记录解释指向 1.1.1.1,如果1.1.1.1 的域名的 rDNS也可以指向 cloudflare.com ,那么我们说1.1.1.1 PTR 的记录是 cloudflare.com。

可以为IP加上PTR记录,这个就是向邮件服务提供商表明了这个IP是被你的域名所拥有的,这有利于提升IP+域名的权重

查询ptr记录的方法:

host -t PTR 1.1.1.1 (linux)

返回

1.1.1.1.in-addr.arpa domain name pointer one.one.one.one.

经过测试表明,国外主流的邮件厂商 gmail hotmail和yahoo等,对于能够做PTR记录的域名+IP,都有一定程度的评级权重提升(非公开)。

建议,如果是的邮件从 IP x.x.x.x 发出,应该为这个IP设置上PTR解析。不幸的是,不是所有的IP服务提供商都愿意为你做IP PTR解析,文章最后我们给出一些支持PTR记录的VPS供大家参考。

3 域名没有做MX记录

MX记录的作用是指明一个域名abc.com接收邮件服务器的IP地址,如果一个域名MX记录的缺失,那么表示这个域名无需接收邮件。无需接收邮件的域名当然更有可能向外滥发信息。所以尽量为域名安排DNS MX记录,最好妥善收取邮件。

nslookup
默认服务器:  UnKnown
Address:  192.168.0.1

> set type mx
Unrecognized command: set type mx
> set type=mx
> 163.com
服务器:  UnKnown
Address:  192.168.0.1

非权威应答:
163.com MX preference = 10, mail exchanger = 163mx01.mxmail.netease.com
163.com MX preference = 50, mail exchanger = 163mx00.mxmail.netease.com
163.com MX preference = 10, mail exchanger = 163mx03.mxmail.netease.com
163.com MX preference = 10, mail exchanger = 163mx02.mxmail.netease.com

163.com nameserver = ns5.nease.net
163.com nameserver = ns3.nease.net
163.com nameserver = ns2.166.com
163.com nameserver = ns4.nease.net
163.com nameserver = ns6.nease.net
163.com nameserver = ns8.166.com
163.com nameserver = ns1.nease.net
163mx00.mxmail.netease.com      internet address = 220.181.12.180
163mx01.mxmail.netease.com      internet address = 220.181.12.117
ns8.166.com     internet address = 18.182.82.158
ns8.166.com     internet address = 44.228.163.69
ns3.nease.net   internet address = 220.181.36.234
ns4.nease.net   internet address = 103.72.16.81
ns6.nease.net   internet address = 54.228.156.72
ns5.nease.net   internet address = 121.195.179.18
ns2.166.com     internet address = 103.71.201.3
ns1.nease.net   internet address = 42.186.35.222

SPF设置

SPF = Sender Policy Framework RFC4408

简单来说SPF就是给域管理员一个工具,可以声明域名的邮件是由哪些IP或者网域发出来的。如果邮件并非这些IP或者域名发出,则很有可能是不明来路的邮件。因为主流的邮件服务厂商均很好地使用了SPF来预防垃圾邮件,所以还没有设置SPF的域名发送邮件量势必受限。

SPF也是借助域名DNS的TXT记录来实现的

SPF使用
host -t TXT sogou-inc.com
sogou-inc.com descriptive text "V33C4yHAho8DqwdpolpFIYeQtl9uw3oyZSOEs086uxY="
sogou-inc.com descriptive text "_globalsign-domain-verification=Y6LO5rTDEJaXm-jORmO5FIms5ox0I_Ge_dl4QiGEAi"
sogou-inc.com descriptive text "v=spf1 ip4:202.106.180.0/26 ip4:1.202.198.0/25 ip4:123.126.51.0/24 ip4:218.189.127.0/28 ip4:206.161.232.0/27 ip4:111.202.103.0/24 ip4:211.159.235.0/24 ip4:49.51.41.0/24 ip4:111.202.100.0/24 ip4:111.202.103.0/24 -all"
sogou-inc.com descriptive text "globalsign-domain-verification=eK-ZHrxl1NieLEwcuW0U-iZ_M8T_k6XU-uIEVbUkq3"

上面用 host -t TXT 指令查了 sogou-inc.com 的SPF记录

v=spf1 前缀表示是spf记录内容 ,后面跟着一堆依次列出的 ip4:202.106.180.0/26 等记录表示sogou-inc的邮件会从这些网段发出。

all 表示所有主机,- all 表示拒绝所有主机的邮件

综合来看,

v=spf1 ip4:202.106.180.0/26 ip4:1.202.198.0/25 ip4:123.126.51.0/24 ip4:218.189.127.0/28 ip4:206.161.232.0/27 ip4:111.202.103.0/24 ip4:211.159.235.0/24 ip4:49.51.41.0/24 ip4:111.202.100.0/24 ip4:111.202.103.0/24 -all

表示sogou-inc建议前面ip4发送的邮件通过,其余主机发送的邮件建议全部拦截(-all)

减号(-)限定值表示 拦截,还有其他限定词,例如 :

+ 表示可以通过

~all 表示软拦截,即是发送垃圾箱

? all 表示中性 无法确定

如果一个域名绝不外发邮件,可以设置为 spf1 -all

如果你把你的域名设置为 spf1 +all,则表示你的邮件可以从任意地方发出,千万不要这样设置因为这样看起来你是超级垃圾邮件制造者。

对于一般组织来说,设置成软拦截就够了 ~all

如果需要更多SPF相关设置知识,可以查一下qq邮箱 163 gmail这些公司企业邮箱的设置。

SPF设置允许include的方式包含另外一个SPF的设置。对于我们小组织来说应该尽量设置ip段,不要嵌套设置,因为嵌套太多会增加对方邮件服务器dns查询失败引起意外。

SPF设置这么复杂,建议可以设置好之后,使用检测工具检查是否设置成功。

例如,可以打开下面的检测网站

https://www.appmaildev.com/hk/spf

向它提供的临时邮件发送一个邮件,这样就可以知道spf记录是否设置成功

这是一个典型的检测结果:

上面结果中,SPF记录已经准确生成了, PTR记录存在,RBL干净。DKIM、DomainKey、DMARC记录没做。

DKIM(更佳)

DKIM记录(DomainKeys Identified Mail)DKIM记录用于在邮件内容的邮件头中,添加发送方的数字签名,接收方收到邮件后,需要对邮件头中的数字签名进行验证,验证成功后邮件就是发送者亲自发送,否则就是伪造。

DKIM部署涉及到了证书,我们使用工具来简化以下

安装opendkim

yum install opendkim

如果是 debian ubuntu,运行 

apt install opendkim-tools

生成DKIM记录

opendkim-genkey -d test.com -s default

这样会在当前目录生成两个文件

1 default.private 私钥 发送邮件签名用

2 default.txt 设置dns用
default._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDR+kFXGwM5JdqtkMQDAOYd4X9itPCGnqdzwma1safywdyuwXqrLkbH7BbLIlpQT6nkhJe7UVvxRDfbkarn9u0Ys3qGZrdn5R+TqclWFUU0N+VBuxS08j/N80Q/uhDU+CblKko2Sipvz1mSRv+BRGI0cRCoik34vEgU5YezGhk9TQIDAQAB" ) ; ----- DKIM key default for test.com

生成好两个文件之后,使用default.txt 上面的记录去设置域名的DNS记录

把 default._domainkey.test.com TXT 指令设置为 上面的记录即可。

以cloudflare dns管理为例子,具体设置方法大概是这样:

k=v; k=v; ... ; p=xxxxx

(p太长,允许中间有空格)

私钥的使用方法和你使用的邮件发送软件有关。

 

DKIM验证:

先看一个google发送到qq.com的邮件头,只看dkim部分


DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=gmail.com; s=20210112;
        h=to:subject:message-id:date:from:mime-version:from:to:cc:subject
         :date:message-id:reply-to;
        bh=ZsKJ9VSswha3q+q/h2vckCZe6TEEYvR2EB+ZZ6Dr3FA=;
        b=gfDkgK+7NU+Go/jlWUGozh0O83v8zPr6wEsmWMZp25XE+E7a3BvZT8xnksq+ncoz6n
         mSIqJgDW5CKGzHF6GRXY+qwM4b67+BXn/u6hyB8KZ8HElugLimEk0fPXg5AOS0Sc1c3E
         WbAHAIsjfq/f+cFbTrJfIEHQdD8o/ILRytQNXTMx8V9GL45GgoEIWtlwbH3vw062iFd5
         xVukN93qdZ4Dy+riH+Qbh6Sgz4tLyP2mZ8KAYbrXK5/6bFeKahdPAFla/YBOKNgVj8dT
         fJa5mM8HyDWpiy2BQexE+0/rXA0tacLi5oLaYmkWjAbxXAM+amm/hYEbyDCrl7CEMpx7
         fYNA==

s=20210112 表示selector是 20210112 ,dns中必然有 名字为 20210112._domainkey.gmail.com 的 txt记录

nslookup 查到该txt记录是:

20210112._domainkey.gmail.com   text = "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq8JxVBMLHZRj1WvIMSHApRY3DraE/EiFiR6IMAlDq9GAnrVy0tDQyBND1G8+1fy5RwssQ9DgfNe7rImwxabWfWxJ1LSmo/DzEdOHOJNQiP/nw7MdmGu+R9hEvBeGRQ" "Amn1jkO46KIw/p2lGvmPSe3+AVD+XyaXZ4vJGTZKFUCnoctAVUyHjSDT7KnEsaiND2rVsDvyisJUAH+EyRfmHSBwfJVHAdJ9oD8cn9NjIun/EHLSIwhCxXmLJlaJeNAFtcGeD2aRGbHaS7M6aTFP+qk4f2ucRx31cyCxbu50CDVfU+d4JkIDNBFDiV+MIpaDFXIf11bGoS08oBBQiyPXgX0wIDAQAB"

检查DKIM selector 和 设置的网站,可以参考:https://dmarcly.com/tools/dkim-record-checker

DMARC 协议

DMARC记录(Domain-based Messaging, Authentication, Reporting and Conformance standard)DMARC协议是基于SPF和DKIM之上,建立的一套垃圾邮件的有效防治工作流程。一个正经的邮件服务商是应该上DMARC流程的,所以你自己搭建的邮件服务被其他厂商歧视也是理所当然...

警告:DMARC设置不当会导致丢失邮件,请运维和管理员务必谨慎行事,循序渐进。

DMARC的工作原理如下:

1) 签署:发件服务器使用私钥签署邮件并插入DKIM标头。
2) 传输:发件服务器将邮件发送给收件服务器。
3) DNS查找:收件邮件服务器从DNS中查找SPF记录,DKIM记录和包含DMARC策略的DMARC记录。
4) 在检查SPF和DKIM之后,将应用策略以确定需要何种操作。
5) 如果DMARC检测通过,则邮件将传递到收件人的邮箱。
6) 如果DMARC检测失败(应用策略阻止或隔离),则会将报告发送给发件人的组织。

DMARC记录组成部分:

v :版本
p :组织域的策略,必选,通常有三种。
      a) p = none:对DMARC验证失败的电子邮件不采取任何具体措施。
      b) p =quarantine:要求接收方将邮件放入垃圾邮件文件夹并将其标记为可疑。
      c) p =reject:要求接收方拒绝无法通过DMARC检测的所有邮件。
pct :已过滤邮件的百分比,可选。
rua :汇总报告的地址,可选。
ruf: 失败消息报告的地址,可选。
fo:提供生成故障报告的请求选项,可选,如果省略,则默认为0。
      a) 0:如果所有SPF和DKIM检测都失败,则生成DMARC失败报告。
      b) 1:如果任意一个检测失败,则生成DMARC失败报告。
      c) d:如果邮件的签名未通过评估,则生成DKIM失败报告。
      d) s:如果SPF检测失败,则生成SPF故障报告。

TTL: 数值上为一小时,通常写成3600秒。

DMARC TXT记录格式:

_dmarc.<abc.com>  <TTL>  IN  TXT
v=<version>;p=<policy>; pct=<percentage>;rua=mailto:<reporting URI or address>


实例:
_dmarc.abc.com  3600  IN  TXT
v=DMARC1; p=quarantine; pct=100; rua=mailto:reports@abc.com

这条记录表示发件域为abc.com, 当DMARC检测失败时,要求收件方将所有邮件放入垃圾邮件文件夹并标记为可疑,然后将汇总报告发到reports@abc.com。

 

只有完全理解和实现了以上的域名和DNS配置之后,才是一个看起来比较正经的邮局服务,能够比较大程度的规避一些意外。还有一些IP的使用和内容的技巧方便的知识,我也一直会在我的博客更新,大家有需要可以直接跳转过去阅读:https://zhuji188.com/307.html

 

IP VPS选择

以上提到的都是关于域名、SPF、DKIM、DMARC的设置基础工作

邮件服务对邮件发送IP的选择也是非常苛刻。

如果你使用你家里的宽带IP用SMTP对gmail.com 发送邮件,则很可能立即被拒绝掉。

gmail通常返回一个 5.7.1 错误,表示你需要用一个ISP IP发送邮件

简单来说,发送邮件的IP必须相对干净,至少不要被别人用过来大量发送垃圾邮件。

国内外很多VPS的IP在早期都曾经或多或少被用于发送垃圾邮件、钓鱼邮件,所以找到一个完美的IP是很难的。很多VPS厂商在网络层拒绝向外部的SMTP 25号端口发送数据,所以根本连smtp服务都无法部署。

这里推荐使用 racknerd 的 IP 去做邮件发送服务器。racknerd是一家性价比很高的VPS厂商,他们的VPS产品对smtp部署目前来说是比较友好的:

1 支持25端口无需申请

2 支持rDNS记录

3 流量给得比较多

4 支持换IP

如果你除了发邮件,还需收一些邮件,可以考虑使用这个年付套餐。

3C 3G 年付 24.28刀 6.5T流量 劳动节促销
https://my.racknerd.com/aff.php?aff=3815&pid=199

发送过垃圾邮件的IP会被列入RBL中,RBL的意思是real-time-block-list。是业界的邮件服务商把垃圾邮件的数据上传到各种网络机构,然后共同封杀垃圾邮件源头的产品。

如果你的IP不幸列入了权威的RBL名单中,基本上一段时间内是无法向类似于gmail等主流的或者非主流的邮件服务提供商中去了。

解决办法有两个: 1 换IP ,2 申诉并等待

rbl查询的工具可以使用这个:

https://mxtoolbox.com/SuperTool.aspx

被列入RBL中也不要慌,这只是参考数据,还是实际已发送是否成功为准。

内容问题

域名和IP问题都解决好了之后,剩下的几乎就是发送的内容问题了。

这里强烈建议大家辛苦建立的邮局服务,不要发送任何营销、通知邮件。因为非必要的邮件会导致客户举报行为,举报会导致两个后果,一个是邮件样本进入黑名单,另外是IP和域名进入黑名单。

应该坚持发送通知信、验证码等触发式邮件。触发式邮件是用户在你的网站上主动发起的,是最有价值的邮件了。

应该尽量使用原创的邮件模版来发送,不要使用他人公用的模版,避免误伤。

 

以上是关于自建邮局发送邮件的一些坑,如果你也被迫要建立自己的邮局系统,可以参考本文 https://zhuji188.com/307.html 上的一些相关内容。希望对你有帮助。

参考文章:

DMARC https://dmarc.org/resources/
微软教程 https://social.technet.microsoft.com/Forums/azure/zh-CN/7f2d5e1d-9e35-44ff-8e74-b282f9c7e58e/12304259453124312305spf65292dkim2019721450dmarc35760244052017132461?forum=exchangeserverzhchs
opendkim http://www.topdog.za.net/2012/04/29/setup-dkim-on-postfix-with-opendkim/

 

主机差评君首发于zhuji188.com,转发请标明来源https://zhuji188.com/307.html
THE END
分享
二维码
< <上一篇
下一篇>>