邮件服务器对环境的要求

2024年11月11日 作者 unix2go

邮件服务器对环境的要求非常苛刻。一个不干净、不正确的环境,导致的结果就是邮件发不出去。

首先,选择操作系统。这里毫无疑问是Linux/Unix最好,因为开源的mail software基本都运行在这两个系统上。而且Linux之类的系统权限隔离好,不容易感染病毒和木马。我推荐使用Debian类的Linux(含Ubuntu),主要是使用简单。如果想深入DIY,那么推荐FreeBSD。

其次,选择邮件服务器软件。目前开源世界里,邮件服务器软件太多了,详见这个列表。但是,出于安全性、稳定性、标准性、可维护性、更新度等角度考虑,MTA软件我推荐Postfix和EXIM,这俩可以运行在Linux里,也可以运行在FreeBSD里。如果是BSD系统,那么OpenSMTPD也是被无数人推荐的。

其他的MTA软件,sendmail和qmail都太老了,很久没有更新,不值得使用。Haraka, Maddy, Stalwart, Mox, Wildduck, 这些都是后起之秀的邮件服务器。它们功能全面,容易部署,大多数内置了DKIM, SPF, DMARC, DANE, MTA-STS等现代邮件系统安全标准。但是,它们缺点就是太新了,不管稳定性还是兼容性,都或多或少存在问题。由于用户少,遇到问题你也很难得到社区帮助。

在MTA背后,是存储、认证、IMAP之类的软件。这个同样也有很多,不过我推荐Dovecot。原因无他,Dovecot几乎是imap软件的事实标准,背后有商业公司Open-Xchange在维护。在实际的邮局运营中,Postfix + Dovecot是最经典的搭配,用户众多,网络文档也多,比如这个被广泛参考的经典文档,它是基于Linux系统的。如果是Freebsd系统,也有一篇很好的文档,链接在此

然后,你要有一个干净的IP,它必须是IPv4,因为互联网很多在运行的邮件服务器,并不支持IPv6。这个IP必须没有列入任何黑名单,黑名单查询可以参考这个地址。同时,你要为这个IP地址设置反解,而反解的域名,其正向解析,也同样指向这个IP地址。

$ bin/idig.sh -x 64.147.108.50
50.108.147.64.in-addr.arpa. 1764 IN	PTR	pb-mx9.pobox.com.

$ bin/idig.sh pb-mx9.pobox.com
pb-mx9.pobox.com.	1758	IN	A	64.147.108.50

如上示例,对于IP地址64.147.108.50,它有一个反向解析的域名:pb-mx9.pobox.com。而正向查询这个域名,它同样也解析回这个IP地址。这就是正确配置的案例。

如果这个IP是云服务器的IP,那么还要确认该服务器是否开通了SMTP访问权限。很多云厂商,出于反垃圾考虑,关闭了服务器对外访问SMTP的权限,比如禁止访问外部25和587端口。这样的服务器根本不能用来做邮件服务器。如何确认本机是否具备外发SMTP的能力?最简单的就是执行如下telnet。

$ telnet 163mx01.mxmail.netease.com 25
Trying 103.129.252.43...
Connected to 163mx01.mxmail.netease.com.
Escape character is '^]'.
220 163.com Anti-spam GT for Coremail System (163com[20141201])

如果像上述案例一样,能telnet到外部的25端口,那么这个IP就没有问题。如果不能访问外部的SMTP端口,那么就联系云厂商,开放这个权限。如果云厂商不同意,那就更换一家服务器提供商。

接下来,请选择你的发信域名。发信域名最好是历史久的老域名。新注册的域名,基本会被Spamassassin之类的反垃圾软件降低评分。而且新域名发信,很容易落入uribl的黑名单。这个黑名单影响巨大,很多知名公司比如cloudflare都采用了它。一旦落入uribl,你发信的成功率就很低。

域名的后缀(TLD),最好是广泛认知的几个,比如com, net, org, de, uk等。这些后缀广为人知,历史悠久,使用它们的邮局众多,不容易被反垃圾软件降低评分。与之相反的是,避免使用一些廉价的新兴域名,比如.click, .store, .online, .top, .icu之类的,它们很可能被某些邮件服务器直接拒收。关于域名后缀的信誉评分,可以查看spamhaus的实时统计数据

另外,如果你想正儿八经运行邮局,避免使用免费域名。互联网有好些免费域名提供者,它们基本被滥用严重,信誉度(reputation)很低。比如,我的免费域名eu.org也设置了一个邮局,曾经发送给gmail,再干净的信件都会被gmail投进垃圾文件夹。

再接着,你要为你的域名,设置好各种DNS记录。我建议必须设置的有:MX, SPF, DKIM, DMARC。其他如MTA-STS和SMTP DANE有条件就设置。对于gmail而言,如果你既没有spf记录,又没有dkim记录,那么是发不进去的,gmail直接拒收。

$ bin/idig.sh pobox.com mx
pobox.com.		2649	IN	MX	10 mx-1.rightbox.com.
pobox.com.		2649	IN	MX	10 mx-2.rightbox.com.

$ bin/idig.sh pobox.com txt
pobox.com.		600	IN	TXT	"v=spf1 ip4:64.147.108.0/24 ip4:173.228.157.0/24 include:spf.messagingengine.com ?all"

$ bin/idig.sh _dmarc.pobox.com txt
_dmarc.pobox.com.	3600	IN	TXT	"v=DMARC1; p=none;"

以pobox.com为例,它的mx记录、spf记录、dmarc记录设置案例如上。dkim记录因为要指定selector,而每个邮件服务器的selector可能都不同,因此这里不方便查询。

下一步,要配置好邮件系统的主机名(hostname)。这个主机名涉及到发信smtp会话的HELO命令,以及SSL证书的颁发路径。比如,你的smtp server和imap server都要通过hostname对外提供安全访问,证书颁发时的主机名就必须设置正确。关于邮件系统hostname的设置,请参考这篇文档

下一步,操作系统里的DNS解析器设置,不要使用公共DNS服务器,因为它们查询不了RBL服务。而类似于spamhaus这样的RBL,建议每个邮件系统都加上检查,它们对于反垃圾邮件来说至关重要。对于Ubuntu类的系统,禁用它自带的systemd-resolved解析器,而使用unbound代替。比如,我的postfix配置了如下内容:

smtpd_recipient_restrictions =
   permit_mynetworks,
   permit_sasl_authenticated,
   reject_unauth_destination,
   reject_rbl_client zen.spamhaus.org,
   reject_rbl_client bl.spamcop.net

如上代码,postfix的main.cf里加载了两个rbl客户端:zen.spamhaus.org和bl.spamcop.net。如果你使用公共DNS服务器,或者systemd-resolved解析器,那么这两个RBL服务就无法正常查询。如果改成unbound解析器就没有问题了。

最后,你必须加强邮件服务器的安全配置。安全选项很重要,否则你的邮件服务器可能被滥用,从而列入各种国际黑名单。如何加强邮件服务器安全设置,请认真阅读这篇文档