由于服务器数据迁移,论坛注册时发送验证码用的邮箱配置废掉了。趁着五一假期有空,先在目前这台服务器上把他搞上。
为了安全起见及日后扩展需求,这次采用了虚拟用户的方案,也就是借助SQL来实现多域、多用户。和以往一样,这次也是使用了TLS。
搭建过程主要参考了这位老哥的文章:https://www.cnblogs.com/renweihang/p/7988591.html,总体质量不错,适用于Ubuntu 18.04。注意里面mysql连接的host值127.0.0.1切勿自行改写成写成localhost,经过测试会有连接失败的问题。此外,涉及到的pem/key文件路径均位于/etc/dovecot/private下,而不是一个位于dovecot,另一个在dovecot/private,建议改为有效的证书文件,否则部分邮箱客户端会禁止登录(当然如果只是像我这样发个验证码啥的那没啥问题)。
此外,单域名用户为了确保邮件的合规性,建议在/etc/postfix/main.cf中如下设置:
myhostname = [默认主机名,或者为真实有效的域名,不要设置为localhost] mydomain = example.com #修改为自己的域名 myorigin = $mydomain #将发信地址“@”后面的部分设置为域名(非系统主机名) mydestination = $myhostname, localhost.$mydomain, localhost #备注:原转载文章mydestination后有$mydomain,但是加上之后会导致status=bounced错误,参见https://stackoverflow.com/questions/18377813/postfix-status-bounced-unknown-user-myuser。 #版权声明:本节段节选自为CSDN博主「qinzhiguo003」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。 #原文链接:https://blog.csdn.net/hitabc141592/article/details/25986911
为了启用TLS传输,同时保留在其他域不支持TLS时的通信能力,需要在/etc/postfix/main.cf中添加以下两行:
#建议设置成may,如果设置成yes则另一端不支持加密时将无法通信 smtpd_tls_security_level = may smtp_tls_security_level = may
对于上述文章中提及的/etc/postfix/mysql-virtual-mailbox-maps.cf等配置文件,可能会导致部分机器出现问题。可以更改为如下配置:
##/etc/postfix/mysql-virtual-mailbox-domains.cf user = mailserver password = mailserver123 #下面的hosts建议注释,尤其是对于mysql设置监听了localhost然而实际只监听了ipv6地址的情况(mariadb目前仍不支持设置监听域名或者监听多个IP);官方文档也没有提及hosts的设置项。 #hosts = 127.0.0.1 dbname = mailserver query = SELECT name FROM virtual_domains WHERE name='%s' ##/etc/postfix/mysql-virtual-mailbox-maps.cf user = mailserver password = mailserver123 #hosts = 127.0.0.1 dbname = mailserver query = SELECT '%u' FROM virtual_users WHERE email='%s' ##/etc/postfix/mysql-virtual-alias-maps.cf user = mailserver password = mailserver123 #hosts = 127.0.0.1 dbname = mailserver query = SELECT destination FROM virtual_aliases WHERE source='%s'
在对垃圾邮件管控愈加严格的形势下,部分邮箱已经开始拒收无SPF/DKIM域名发送的邮件。我参考了这篇文章(https://www.linuxbabe.com/mail-server/setting-up-dkim-and-spf)设置了SPF和DKIM。以及这篇文章(https://www.linuxbabe.com/mail-server/create-dmarc-record)设置了DMARC。
在我这儿生成的default.txt与示例中及百度到的几篇文章格式有所不同。我的是如下所示,p字段后有两端字符串,而示例中仅有一串。要粘贴的是括号内的内容,提示非法字符就把那几个空格给删掉然后自己重新敲一个进去。
cat /etc/opendkim/keys/easysvc.xyz/default.txt #结果如下所示 default._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; " "p=MIIBIjANBgkqhkiG9w0FKELSUOCAQ8AMIIBCgKBWKSU8HfBNYVwEGVBQqumwRNlIYNLxczpfNYd2Mqiukv8Rr8yYL8J8ymdV2LYWbv41HL4MM251SMyzNPCrJKslXYKrxNgFCK/nTmRlRuRg8uiewhlcXJndCO4hkIA+Ek71sMCszDM07uZE0Niv49G3dMecTWGisrprnlnDmn4W1O62c6oQcyibakacPUSLDlnFfu3b1erR+0AAPhHRy" "AFEbX99S3BrsI+PYxPJ8h4gItD1I30CvX2iNdfuUfdMiH00tH5gT5ur9e6jcqbwdwE1CvNYz+hskMeY0IGbcjFIZaK7Q02e4t3x7AuP22dbgfBlN/iXxpl4m5kAGc3sfswwFPvBAQDKWUS" ) ; ----- DKIM key default for easysvc.xyz
之前还参考过linode的一篇文章,弄完发现有坑(好像是因为适用于老版本软件)。腾讯云的那片中文文章几乎就是linode那篇的翻版,注意别踩坑了。但是有个验证有效性的措施倒是很周到。
sudo apt install mailutils # 请确保已配置dkim/spf,否则邮件会被Gmail直接拒收,用户即使在垃圾箱内也看不到邮件 #测试发件功能 echo "Email body text" | sudo mail -s "Email subject line" [email protected] -aFrom:[email protected] #测试收件功能 #使用其他邮箱向已配置的账户发送邮件 sudo mail -f /var/mail/vhosts/example.com/email1 #如有邮件,此时会予以显示
遇到些疑难杂症先看看自己配置有没有写错,然后百度谷歌,再没有的话试着直接翻Postfix/Dovecot的Document。
有问题请查看log。
tail /var/log/mail.log
如果一切排查无误,可以通过https://www.mail-tester.com/来测试您的邮件得分了。
进阶操作——使用SpamAssassin来过滤垃圾邮件
CentOS/RHEL搭建过程参考本篇文章(需要一定的英语阅读能力/借用翻译)。
Ubuntu/Debian搭建过程参照本篇文章(未经验证,我在更新这一部分的时候从Ubuntu换到CentOS了)。
如果有问题,还可以参考如下几篇官方文档:
http://www.postfix.org/VIRTUAL_README.html
http://www.postfix.org/MYSQL_README.html
http://www.postfix.org/postconf.5.html#virtual_mailbox_domains
http://www.postfix.org/LOCAL_RECIPIENT_README.html