一年前解决了 WordPress 在 Linux 下不能发送邮件的问题,后来有段时间很正常,我的网站接收邮件的邮箱是 Gmail 的。但是近来,网站上有留言时极少收到通知邮件,怀疑是 Debian 下的 exim4
又不能正常工作了。但是试了如下的 PHP 脚本
$ php -a
Interactive mode enabled
php> mail('<my_gmail_account>@gmail.com', 'test subject', 'test content');
php > exit
从命令行上并没有提示任何的错误,但是检查我的 Gmail 信箱,死活就是收不到邮件。即使直接用 mail
命令
echo Hello World | mail -v -s Test <my_gmail_account>@gmail.com
也是不行的。
查看日志文件 /var/log/exim4/mainlog
, 发现有下面的错误信息
2018-06-14 00:06:23 1fShAb-0005VQ-Fd Message is frozen
2018-06-14 00:06:23 1fSyHQ-0003fc-Pp Message is frozen
2018-06-14 00:06:23 1fT7OP-0000AZ-Rz Message is frozen
2018-06-14 00:06:23 1fT2i5-0006kw-IJ Message is frozen
2018-06-14 00:06:23 1fSiZh-0005tJ-9d Message is frozen
2018-06-14 00:06:23 End queue run: pid=21357
2018-06-14 00:09:01 1fTKVJ-0005cd-Tc <= root@yanbin.blog U=root P=local S=651
2018-06-14 00:09:01 1fTKVJ-0005cd-Tc ** conoha@yanbin.blog <root@yanbin.blog>: Unrouteable address
2018-06-14 00:09:01 1fTKVJ-0005ch-Uy <= <> R=1fTKVJ-0005cd-Tc U=Debian-exim P=local S=1460
2018-06-14 00:09:01 1fTKVJ-0005cd-Tc Completed
2018-06-14 00:09:01 1fTKVJ-0005ch-Uy ** conoha@yanbin.blog <root@yanbin.blog>: Unrouteable address
2018-06-14 00:09:01 1fTKVJ-0005ch-Uy Frozen (delivery error message)
就是有大量的 "Message is frozen" 和 "Unrouteable address" 信息。(与 GMail 邮箱有交互,只是被不断的退回信件)
开始以为是 /etc/exim4/update-exim4.conf.conf
配置文件的问题,试了几番别的配置也无济于事。也怀疑过是否是域名的 MX 记录未设置的问题,加上了 MX 记录也不能解决,再想 Linux 上的 exim4
服务单单是用来往外发送邮件,无须 MX
记录。再试着往别处发邮件看看,发现新浪的邮箱也是收不到,但是自己的公司邮箱却是可以收到前面用 PHP 脚本或 mail
命令发出来的邮件。
外事不决靠 Google, 最后找到了原因,见 StackOverflow 中的 WordPress is not sending emails to Gamil 中的描述:
exim4
不像postfix
, 不会自动设置Sender
头
Gmail 最近为是杜绝垃圾邮件,对于未设置Sender
头的邮件直接悄无声息的丢进了 Spam 信箱里去了(我也回头查看了下 Spam 信箱,果然前面用 PHP 脚本和
WordPress 也没有设置Send
头信息
就是因为 Sender
信息的缺失造成了 Gmail 把 WordPress 发出的邮件当成了垃圾。
其中也介绍了一种办法,修改 wp-includes/pluggable.php
代码在发送邮件前自己加上 Sender
头
1 2 3 |
//$phpmailer->From = apply_filters('wp_mail_from', $from_email); //找到大概像上面那样的代码,在它后面加上 $phpmailer->Sender = $phpmailer->From; |
我没有去试这种办法,而是安装了下面将会介绍的一个插件使用 Gmail 作为邮件发送服务器来解决的。或许将来的 WordPress 版本会去解决这个问题,至少发送邮件里设置一下 Sender
头。
那篇 StackOverflow 的帖子还提到
Gmail (and likely Hotmail and Yahoo eventually) is starting to disable traditional SMTP authentication mechanisms (PLAIN, LOGIN and CRAMMD5) in favour of OAUTH2.
在 WordPress 网站上搜索 SMTP
相关的插件,可以找到许多,而我现已安装能正常使用的是 Gmail SMTP
插件。它的详细配置方法请参考 Gmail SMTP Plugin for WordPress,在这儿就不翻译不重复了。
简单说,该 Gmail SMTP 插件就是需要使用到 Gmail 的 OAuth 2.0 验证,在 Google API 管理中创建 Gmail API 项目,最终获得 Client ID 和 Client Secret,最络授权该插件访问你的 Gmail,完后还能在该插件设置界面直接发送邮件进行测试。
现上我的网站有了 Gamil SMTP 插件后,发送任何邮件都没问题了,有了它也就告别了 Linux 服务器上的 exim4
服务。没怎么测试往国内邮箱发送邮件的情况,除非国内邮件提供商明目张胆的禁止接收一切从 Gamil SMTP 服务器发送出来的邮件,那我就没辙了。
附录:下面是在解决这个问题过程中学到的几个检查域名 MX 记录的命令,gmail.com 为例
dig gmail.com MX
dig A mail.gmail.com
nslookup -qt=mx gmail.com //Windows 下
nslookup -query=mx gmail.com
这儿有很多 nslookup
相关的命令 10 Linux nslookup Command Examples for DNS Lookup。
2018-01-07: 为了规避强制的 OAuth2 的验证,也可以到 https://myaccount.google.com Google 帐号的 Security 设置中,把 Less secure app access
打开,但这样做肯定是不安全的,需谨慎。