在之前我已经配置好了Postfix+Dovecot+Rspamd,可以正常收发邮件也可以有效拦截SPAM邮件,现在还剩最后一个问题:
我如何把邮件发进对方的收件箱?
对于个人自建的邮件服务器来说,这其实是一个很复杂的问题,解决起来的话要做的事情很多,我们自身能做的大概是以下几点:
1.DNS这方面需要添加SPF/DKIM/DMARC记录。
2.发信服务器的hostname要和MX记录的值对应。
3.发信支持TLS加密。
4.服务器要支持rDNS(PTR记录)并且记录要和MX记录的值对应。
5.你的服务器IP没有被列入各类黑名单系统。
6.邮件内容,对你没看错,哪怕就是你做好了上面5点,你发的邮件内容其实也很重要,现在大厂的邮件服务器都有一套自己的方案,有些包含敏感词的邮件你多发几封可能就发不出去了。
这篇文章的配置是基于:
以及
如果你没有完成上述的配置,还请先按照这两篇文章把“前置任务”做一下。。
首先来添加SPF记录,这个记录要说的话,可配置项太多了,那不是一两句话能够说清楚的,我只说一下我目前用的记录值是:
记录类型:TXT 名称:@ 内容:v=spf1 mx ip4:172.105.201.241/32 ip6:2400:8902::f03c:92ff:fe7a:5f01/128 -all
意思是让收件服务器查询我的MX记录是否与发信服务器的IP地址相同,不是我上述配置的2个IP地址发出的邮件全部拒绝。
其次是DKIM记录,DKIM简单点说就是给你的邮件签名,防止你的邮件内容被篡改。这里需要借助Rspamd来生成密匙对。
创建一个用于存放私钥的目录:
mkdir -p /var/lib/rspamd/dkim
使用rspamadm生成密匙对:
rspamadm dkim_keygen -d 233.fi -s imlala -k /var/lib/rspamd/dkim/233.fi.dkim.key
注:-d指定你的域名,-s指定selector名称。
执行完上述命令之后私钥会保存到目录内,而公钥和你需要添加的解析记录会有类似如下回显:
现在你应该按照下面的格式来添加DKIM记录:
记录类型:TXT 名称:imlala._domainkey 内容:v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2lejVfHCIn4XRKG8d7XZzMKXBucdoHY52vU9Wr8zQ+zjhkM/eYg4ppeE3pq1PDk/+ExrWhdWKFx/7BIsXo/rsOXB/67qhIcstvXFF/h6XTJpDZ30fVWqfvNIwHqhJAUv7EcqhoqkbvYuiS+mwS/+EGPy2jstWEaOJORqjufpzSQIDAQAB
注:记录的内容你应该去掉“括号”和“引号”以及保证每个“分号”后面有一个空格。
接着编辑dkim_signing.conf:
nano /etc/rspamd/local.d/dkim_signing.conf
写入如下配置:
domain { 233.fi { selector = "imlala"; path = "/var/lib/rspamd/dkim/233.fi.dkim.key"; } } allow_hdrfrom_mismatch = true; allow_hdrfrom_mismatch_sign_networks = true; allow_username_mismatch = true; use_esld = false;
完成之后重启Rspamd:
systemctl restart rspamd
最后再来添加DMARC记录,配置它的前提是你应该保证你的SPF和DKIM记录能够正常工作,因为DMARC更像是一个策略,它通过验证SPF/DKIM记录的结果来告知收信服务器这封邮件要如何处理。
例如某一封邮件SPF和DKIM验证失败,我们就可以用DMARC告知收信服务器直接拒收这封邮件,或者什么都不做。同时还可以利用DMARC定期给我们发送相关的报告。
以下是我记录值:
记录类型:TXT 名称:_dmarc 内容:v=DMARC1; p=none; rua=mailto:[email protected]
注:
1.DMARC的DNS记录,名称必须以_dmarc开头。
2.p=none是告知收信服务器如果SPF和DKIM验证失败,则什么都不做。一开始我们应该使用p=none,等到整个邮件服务器都能正常工作后,我们可以将这个值改为p=reject,告知收信服务器直接拒收。
3.rua是定期像我们指定的邮箱发送相关报告。其实这里建议单独创建一个邮箱来收这些报告邮件。
DNS这块就配置完成了,接下来是hostname的配置。
你可以看到网上能搜到的用Postfix搭建邮件服务器的教程,大多数第一步都是要你去把系统的hostname改了,我其实是不推荐用这种方法的,其原因是:
1.系统的hostname可能在很多时候是需要固定的,不能随随便便就改了。不能因为我要搭建一个Postfix就把系统的hostname改了这样有一些其他的服务可能会受到影响。
2.系统的hostname改了后不能立即生效,需要重启,这是个硬伤。。
其实Postfix自身就支持定义发信服务器的hostname,只需要下面一条命令即可完成设置:
postconf -e "myhostname = mail.233.fi"
重启Postfix使配置生效:
systemctl restart postfix
其实在你做完上述这些配置后,发一些国内的邮箱,例如QQ邮箱,126邮箱,只要你的邮件内容没什么“敏感词”基本上可以说是稳进收件箱的。
但Gmail这类邮箱就比较严格了,它还需要你的邮件是通过TLS加密发送出去的。所以这里我们需要配置Postfix/Dovecot让其支持发送加密邮件。
Postfix自身是有2个模块的,一个是smtp另一个是smtpd,如果说我们只是要Postfix发出去的邮件支持TLS加密其实可以不配置smtpd相关的东西。
因为smtp是管往外发,smtpd是管本地的,但既然都要配置加密了,那就做事做全套吧。。
默认的Postfix只监听25端口,是没有启用465以及587端口的,我们需要编辑:
nano /etc/postfix/master.cf
将如下的注释去掉支持587:
submission inet n - y - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt
将如下的注释去掉支持465:
smtps inet n - y - - smtpd -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes
配置SSL证书,这里可以直接用之前Certbot生成给Nginx用的证书:
postconf -e "smtpd_tls_cert_file = /etc/letsencrypt/live/mail.233.fi/fullchain.pem" postconf -e "smtpd_tls_key_file = /etc/letsencrypt/live/mail.233.fi/privkey.pem"
现在smtpd就可以支持TLS加密了。但smtp还不行,所以执行如下命令开启smtp的支持(不需要重新配置证书之类的东西,Postfix会自动用smtpd的配置去设置smtp):
postconf -e "smtp_tls_security_level = may"
重启Postfix使配置生效:
systemctl restart postfix
接下来是Dovecot的加密支持,默认情况下Dovecot只监听了143端口并没有启用993端口,我们需要编辑下面的配置文件:
nano /etc/dovecot/conf.d/10-ssl.conf
这里还是可以用之前的SSL证书,按照下面的配置去修改即可:
ssl = required ssl_cert = /etc/letsencrypt/live/mail.233.fi/fullchain.pem ssl_key = /etc/letsencrypt/live/mail.233.fi/privkey.pem ssl_dh = /etc/dovecot/dh.pem
注意有一个dh.pem的文件需要我们自己手动生成(生成很慢,大概要10分钟左右)
openssl dhparam 4096 > /etc/dovecot/dh.pem
重启Dovecot使配置生效:
systemctl restart dovecot
最后来设置邮件服务器的rDNS,对于Gmail这类邮箱来说的话,这个也必须得设置,不然你的邮件也很可能会进垃圾箱。
设置rDNS要看你的服务器商家支持不支持,如果是Linode话,可以按下图来设置:
所以在搭建邮件服务器的时候一定要找一个支持rDNS的,并且最好可以轻松换IP的,有些服务器IP买来就进了各个SPAM数据库的黑名单,你就是玩出一朵花来IP在黑名单内你想进收件箱也不可能进的去。。
现在测试一下,经过上面的这些配置后,我的邮件服务器能评个多少分:
测试总归还是测试,能不能发进收件箱才是关键,首先往QQ邮箱发几封kangkang:
我寻思QQ邮箱没问题的话那126邮箱应该也没问题,因为我是同时用QQ也用126的,发现126的反垃圾邮件没有QQ做的好,我的126收件箱里面经常躺着比QQ多几倍的垃圾邮件:
最后往最挑剔的Gmail发一封kangkang,正好也可以测试我们的邮件是否支持TLS加密:
最新评论
5211314
能不能教我 一点不会