又配置了一台邮件服务器,使用环境

postfix dovecot mysql ubuntu 18.04

主要是记录下添加DKIM记录的注意事项:

参考:https://linode.com/docs/email/postfix/email-with-postfix-dovecot-and-mysql/
https://www.linode.com/docs/email/postfix/configure-spf-and-dkim-in-postfix-on-debian-8/
上一篇:[Mark]邮件服务器添加SPF、DKIM、DMARC、PTR提高送达率

已经是2年前了,postfix和opendkim的很多配置文件都有一定的变化。

本次安装主要在
SOCKET=”local:/var/spool/postfix/opendkim/opendkim.sock”
路径上浪费了大半天。
mail.log里显示:local /opendkim/opendkim.sock no such file or directory

以下是本次记录的主要问题:

/etc/opendkim.conf
/etc/default/opendkim

注意上面两个文件中
SOCKET 的路径是否统一
SOCKET=”local:/var/spool/postfix/opendkim/opendkim.sock”
下面文件的local路径也需要统一。
/etc/postfix/main.cf
smtpd_milters = local:/var/spool/postfix/opendkim/opendkim.sock
non_smtpd_milters = local:/var/spool/postfix/opendkim/opendkim.sock
另外就是注意文件夹和文件的权限:
/run/opendkim
/var/spool/postfix/opendkim
必须归属于opendkim用户

1.SPF
SPF 记录是一种域名服务 (DNS) 记录,可确定允许哪些邮件服务器代表您的域来发送电子邮件。

SPF的设置选项可以参考:http://www.openspf.org/SPFRecordSyntax

这里说几个常用的:

a:所有该域名的A记录都为通过,a不指定的情况下为当前域名
ip4:指定通过的IP
mx:mx记录域名的A记录IP可以发邮件
all:结束标志,“-”表示只允许设置的记录为通过,“~”表示失败,通常用于测试,“+”表示忽略SPF
例如我的:v=spf1 a mx -all,则表示允许A记录和MX记录IP收发邮件。添加的方法是在域名DNS解析设置一个txt记录,主机记录为空或者@,记录值为v=spf1 a mx -all,其他可以忽略。

2.DKIM
DomainKeys Identified Mail的缩写,域名密钥识别邮件标准。

下载安装EPEL:

64 bit:

rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
32 bit:

rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
安装opendkim:

yum install opendkim
生成DKIM key (修改红色部分域名)

# 请替换下面的域名
export domain=lomu.me

mkdir /etc/opendkim/keys/$domain

cd /etc/opendkim/keys/$domain

opendkim-genkey -d $domain -s default

chown -R opendkim:opendkim /etc/opendkim/keys/$domain

echo “default._domainkey.$domain $domain:default:/etc/opendkim/keys/$domain/default.private” >> /etc/opendkim/KeyTable

echo “*@$domain default._domainkey.$domain” >> /etc/opendkim/SigningTable
生成之后打开/etc/opendkim/keys/domain.com/default.txt,里面就是DKIM key,需要添加到DNS,主机记录为default._domainkey,记录值为括号里面的(去掉引号)。

修改openDKIM设置

vi /etc/opendkim.conf
1. 将Mode 改为 Mode sv 2. 将Domain 改为 Domain lomu.me(lomu.me是之前设置的域名) 3. 将所有变量前面的#去掉,但是KeyFile、Statistics加上# 4. 再把SigningTable /etc/opendkim/SigningTable改成SigningTable refile:/etc/opendkim/SigningTable

设置Postfix

vi /etc/postfix/main.cf

加上下面幾行
# opendkim setup
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = inet:127.0.0.1:8891
milter_default_action = accept
重启服务

service opendkim restart
service postfix restart
chkconfig opendkim on
PS: 第一次启动如果出现 Generating default DKIM keys: hostname: Unknown host 可以在 /etc/hosts 上面加上域名,例如:

127.0.0.1 lomu.me localhost localhost.localdomain localhost4 localhost4.localdomain4

3.DMARC
DMARC协议是有效解决信头From伪造而诞生的一种新的邮件来源验证手段,为邮件发件人地址提供强大保护,并在邮件收发双方之间建立起一个数据反馈机制。

具体信息可以看这里:http://dmarc.org/overview/。

DMARC记录中常用的参数解释

p:用于告知收件方,当检测到某邮件存在伪造我(发件人)的情况,收件方要做出什么处理,处理方式从轻到重依次为:none为不作任何处理;quarantine为将邮件标记为垃圾邮件;reject为拒绝该邮件。初期建议设置为none。

rua:用于在收件方检测后,将一段时间的汇总报告,发送到哪个邮箱地址。

ruf:用于当检测到伪造邮件时,收件方须将该伪造信息的报告发送到哪个邮箱地址。
例如我设置的是v=DMARC1;p=reject;rua=me@lomu.me,意思是拒绝伪造邮件,并且将一段时间的汇总报告发送给我。

添加到DNS

添加TXT记录,主机名:_dmarc,记录值:v=DMARC1;p=reject;rua=me@lomu.me

4.PTR
PTR记录,是电子邮件系统中的邮件交换记录的一种;另一种邮件交换记录是A记录(在IPv4协议中)或AAAA记录(在IPv6协议中)。PTR记录常被用于反向地址解析。

PTR记录也就是IP反向解析,我们常见的解析都是将域名A记录解析到IP,PTR则是将IP反向解析到对应的域名,通过设置PTR可以提高发信方的信誉,从而提高到达率。

PTR设置

通过观察,一般国外的VPS都会直接将购买的时候的hostname设置为PTR记录值,但是我买的阿里云的并没有,所以这个需要提交售后工单要求客服帮你添加的,添加的值为安装postfix的时候设置的myhostname,例如我的是mail.lomu.me。

添加好了以后可以通过以下命令查看

dig -x IP
如果看到了PTR记录为你的域名那就说明成功了。

到这里,基本上只要不发垃圾邮件,邮件的到达率应该就没啥问题了。

这里给大家推荐一个测试工具:http://www.mail-tester.com/,只要给页面上的邮箱随便发一封邮件,然后点击按钮提交就可以看到测试结果,里面会有一些优化建议,非常好用。

Copy From: http://lomu.me/post/SPF-DKIM-DMARC-PTR

服务器环境:
Ubuntu,Postfix,Dovecot,MySQL

困扰已久的问题了,每次打开outlook链接自设的邮件服务器,都需要点击下确认,即使已经把证书加入“可信任的根证书”也不行。
outlook_cert

这个主要原因是生成的证书配置错误。
重新生成一个证书即可:

以上命令会在目录/etc/postfix/下生成smtpd.cert和smtpd.key文件

Common Name (eg, YOUR name) []:www.mycompany.com ← 就是这个引起的啦。这个正确就没问题了。

编辑nano /etc/postfix/main.cf

编辑nano /etc/dovecot/conf.d/10-ssl.conf

然后再启动outlook,发现变啦:
QQ截图20140804174754
点击”查看证书“把证书加入到“可信任的根证书”即可。

有些收件人邮件域名填错的情况下,自然是“Timeout”,不过Postfix默认会重新尝试,并且每次尝试的间隔逐渐延长,直到默认“5天”以后才会退回到发件人……

将延迟上限设置为0,则会立即退信:

这里涉及到Postfix的队列管理:

队列调度
  postfix会定期扫描队列,检查每一封等待邮件的时间,看看是否有任何等待邮件已经到了下一回合应该尝试投递的时间。每一次投递失败,都会导致延迟间 隔时间加长,所以,失败次数越多,就必须等待更长的时间才有再次被投递的机会。延迟时间上限由maximal_queue_lifetime参数决定。如 果邮件在等待队列里的时间超过此上线,postfix便会放弃投递,并退信给原寄件人。maximal_queue_lifetime的默认值为5天,你 可以将它改成任何时间长度;如果你希望postfix在第一次递送失败时就立刻退信,你可将此参数的值该为0。
  postfix内部的队列扫描间隔决定于queue_run_delay参数,其默认值为1000秒。也就是说,大约每隔1000秒,postfix就会检查一次等待队列,看看是否有任何应该再次尝试投体的邮件。
  postfix重新投体等待邮件的频繁程度的上下限,分别由minimal_backoff_time与maximal_backoff_time这两个 参数决定。每次邮件被延迟,qmgr便会加长下次投递机会的时间间隔,但是累增后的间隔时间不的超过上线,也不得低于下限。如果你发现经常有寄不出去的等 待邮件,或许你应该考虑适度加大上线,让postfix不要浪费太多资源于等待邮件。

队列管理工具
  postfix提供了一组命令行工具来检查、控制、管理队列里的邮件,其中以postsuper和postqueue这两个工具最为重要。你可以对队列中的邮件进行下列操作:
显示邮件列表
删除邮件
重新排队
保留邮件
显示邮件内容
清空邮件

每一种操作都有对应的命令。

  显示邮件列表
  邮件列表的显示项目,包括邮件在队列里的标识符、大小、到达时间、寄件人地址、收件人地址。对于等待邮件,还会另外显示等待原因。如果邮件是在活动队列 里,其标识符栏会加注一个星号(除非你的服务器很慢或是负荷沉重,否则应该没有机会见到星号)。在保留队列里的邮件的邮件,其标识符栏会加注一个感叹号。 等待邮件不加注任何符号。
  使用postqueue -p 命令可列出队列里的所有邮件,其效果如sendmail包的mailq。当安装postfix时,安装脚本会以postfix版的mailq程序(它其 实只是postqueue -p的符号链接而已)取代sendmail包原有的同名程序,借此维持与sendmail包的兼容性。

  删除邮件
  使用postsuper命令的-d选项,可移除队列里的邮件。邮件是以它们在队列里的标识符表示。
  如果要删除所有邮件,请把标识符换成ALL
  请注意,由于删除所有邮件是相当危险的操作,所以ALL关键字必须全以大写字母表示才有效,其目的是希望你三思而后行。

  保留邮件
  当你想将邮件无限期留在队列系统里,保留队列就成为容纳这些邮件的场所。不管邮件目前已经传到哪一个队列,你都可以将它们移除原来的队列,转移到保留队列。
  假设你已经知道要保留的邮件的标识符,使用postsuper工具的-h选项,就可将指定的邮件搬到保留队列:
  postsuper -h DRA3P1A9
  在这之后,如果观察邮件列表,会发现该邮件的标识符多了一个感叹号。
  要将邮件移回原来的队列,继续其未竟之进程,可使用同一个postsuper工具,只要将原来的-h改成-H。
  在邮件被移回原来的队列之后,qmgr依照平常的调度原则来决定其下次投递时间。或者,你也可以执行清空(flush)命令,立刻将邮件递送出去。

  重新排队
  如果因为配置问题而耽误了任何邮件,在问题解决之后,你可能希望被耽搁的邮件重新走一遍队列处理流程,以便能够成功完成递送。因为配置问题可能使得 postfix在邮件里存储了错误的投递处理信息,或是使用了错误的地址改写法则。重新排队会使得postfix依据里的新配置来修正错误信息。使用 postsuper工具的-r选项,可以重新排队某一特定邮件,或是要求所有邮件全部都重新排队。

  显示邮件内容
  使用postcat工具的-q选项,可以查看一个队列文件的内容
早期版本的postcat并未提供-q选项,而是要求你提供队列文件的完整路径。然而,由于邮件可能在各个队列目录之间游移不定,而且这些队列目录还有自己的子目录,所以管理员很难一眼看出队列文件的完整路径。

  清空邮件
  要求postfix立刻投递滞留在队列里的邮件的操作称为清空(flush),执行清空动作的命令是postqueue -f。不过,除了你有理由确定邮件一定能成功投递出去,否则,最好还是让qmgr自己决定重新投递的时机。不断的反复要求清空,会严重影响邮件服务器的效 率。
使用-s选项可清空寄到特定站点的邮件,而且收件站点必须要有接收快速清空的“资格”才有效。要使得某站点具备此资格,你必须将该站点的主机名称或网域名 称列在fast_flush_domains参数中。此参数的默认值只包含relay_domains所列的所有网域,但是你可以视情况增加额外的站点:
  fast_flush_domains = $relay_domains example.com
如果你有一个间歇性的邮件交换机,你可以在该交换器上线的时间内,使用postqueue -s清空先前无法送达到该交换器的所有邮件:
  postqueue -s example.com

大部分内容采摘自:http://hi.baidu.com/mongodb/item/9057580fb1b57b8902ce1b95

老是有邮件被退回来,一般的提示是550 Unknown user,从字面上理解,就是这个邮件地址错误了,事实上并不全是。要根据具体的提示信息来判断。
如果被拒收,只能让收件人设定个白名单了。

被拒收的邮件提示:
<xxx@domain.com>: host xxx.domain.com[111.111.111.111] said: 550 Unknown user xxx@domain.com (in reply to end of DATA command)

地址不存在的提示:
<xxx@domain.com>: host xxx.domain.com[111.111.111.111] said: 550 Unknown user xxx@domain.com (in reply to RCPT TO command)

因为日本市场上使用gmail邮箱的是个小众人群,一直以来也没太注意,今天才发现,gmail邮箱基本上收不到我们的邮件,特别是发货的通知邮件,退回消息如下:

起初检查了邮件系统,毕竟很久没更新了。甚至在本机虚拟机上重新假设了一个新的邮件系统,发现效果依然如此。百度了大半天,基本都是没有用的垃圾信息。
最后将“Our system has detected that 550-5.7.1 this message is likely unsolicited mail. ”放到谷歌上搜索,发现有很多人有这种情况,不过更多的人是IP进入了谷歌的黑名单,而我们的知识因为邮件服务器域名未验证的原因,然后继续谷歌继续百度,原来DNS设置里有个TXT记录(TXT record)需要设置。

TXT Record
v=spf1 a mx ip4:8.8.8.8 -all
大概意思是spf记录1版本(到现在似乎就只有1个版本),DNS中的a记录,mx记录,特别是IP4等于指定的例如这里设置的8.8.8.8(你的服务器地址)都是经过域名所有者认证的邮件。

之前收到的一个订单邮件里,产品表示代数的罗马数字在outlook中不显示……经过简单排查,原来网站程序对邮件正文进行了重新编码:

将JIS修改成UTF-8之后,在网站上看正常了,罗马数字可以正常显示,但是收到的邮件是乱码。

后来查看了邮件原文信息,才发现,编码不对。
QQ截图20130501213428
全部改成UTF-8就Ok了。
QQ截图20130501212211

原来还怀疑是不是邮件服务器配置的问题,后来想着是否网站程序的设置问题,最后总算找到了网站的邮件发送php文件,将里面的To、From、Subject、Body都改成了UTF-8,OK了。