网站首页 » 网站运营 » Linux » Linux 环境下 WordPress 发邮件的坎坷之旅
上一篇:
下一篇:

Linux 环境下 WordPress 发邮件的坎坷之旅

用上了阿里云的云服务器后,我的生活发生了翻天覆地的变化,天天被被折腾得体无完肤,吃不下,睡不着,辗转反侧,失眠多梦。从云服务器降生(13:25:23 2017/2/7)到 WEB 站点服务环境配置完成,到网站上线时文件权限设置及数据库文件上传的解决,再到后来的一些小事,如:WordPress 图片/文件上传问题,Linux 定时备份,还有这次记录的 WordPress 发邮件的坎坷之旅。整整花费了一个多月,其实在买这个云服务器之前也做了些准备,申请过一个为期一个月的免费的云服务器来练手。 往事如烟,只想好好的对待每一分第一秒,我们开始吧!

由于 WordPress 放弃了第三方评论插件,改用 WordPress 自带的评论,如果你们要问我为什么,我只能说:“我不任性,生活不出彩!”。现在请听我娓娓道来。

自从用上了自带的评论后,我的世界变得格外安静,再也没收到过评论邮件提示了,其实这种安静对于一个更新博客的人来说不是一种好事。当我在后台回复别人的评论时,突然发现自己那时好无助,心里咕哝着:亲我的回复,你收到了吗?答案路人皆知:回复肯定石沉大海了。WordPress 的有“回复时邮件我”的功能其实一直都没有被我放在心上,甚至我一点都不在乎这个功能,直到有一天我在配置 Linux 时心存疑惑,然后巧合地通过一篇文章访问了一个博客,看完文章介绍后还是疑惑不消,于是就评论留言了。就在喝一杯咖啡的时候,我收到了此网站的回复邮件。我顿时热泪盈眶,第一次感受到了来自另一个时空里的温暖。经过多次留言评论及非常及时的邮件通知后,我在最短的时间内解决了我的疑惑。所以“回复时邮件我”的这个功能让我激动了好一阵子。于是设置好后台评论,在网上取了一段经历过千锤百炼的代码在主题的 functions.php 文件里一顿捣鼓后。最终还是感动敌不过现实,“回复时邮件我”这句话也变成了自己为之奋斗终生的目标。

WordPress 发邮件的坎坷之旅现在正式启航,系好你的安全带!

网友智慧

简单地整理一下网上的民间秘方,有没有效果,自己服了才知道:

网友智慧

1.空间本来就不支持 mail 函数。

2.修改 WordPress 文件。

3.使用外部的SMTP

mail 函数支持情况

查看空间支不支持 mail 的方法有不少,比如下面的三种:

方法一:


<?php
    $txt = "Hello";
    $mail = 'xx@163.com';  // 以下的邮箱地址改成你的
    mail($mail, "My E-mail", $txt); // 发送邮件
    echo 'E-mail was sent!';
?>

看看你有没有收到邮件,没有收到,虽然不能完全说明不支持 mail 函数,但这也是一个可能。

方法二:

<?php
    if (function_exists('mail')) { echo "支持mail()函数!"; } else echo "不支持mail()函数!"; 
?>

页面显示支持则支持,显示不支持则不支持

方法三:

<?php
    phpinfo();
?>

查看页面中PHP服务器配置信息,定位到 sendmail_path 设置项,如果你看到值为/usr/sbin/sendmail -t -i,说明你的主机支持 mail() 功能。

于是我就按部就班逐一测试,结果确定是支持 mail 函数的,虽然用方法一没收到邮件,但已经不重要了。

修改 WordPress 文件

找到 /wp-includes/ 目录下的 class-smtp.php 文件并打开,定位到如下代码:

$this->smtp_conn = stream_socket_client(
    $host . ":" . $port,
    $errno,
    $errstr,
    $timeout,
    STREAM_CLIENT_CONNECT,
    $socket_context
);

注释掉或者直接删除掉,建议修改前备份文件。然后放到下面这行代码:

$this->smtp_conn = fsockopen($host, $port, $errno, $errstr);

这种方法我也试了,但还是不起作用。这是为毛呢?

使用 SMTP 插件

这种方法我还没试,因为需要安装插件,我的原则是能不装则不装。这插件也不少,如:WP SMTP、Configure SMTP 或 WP-Mail-SMTP 后台的插件库搜索安装就好,你可以根据个人喜好选择其中之一。这种方法我估计成功指数非常高,如果你觉得可以接受,那试试也无妨。

网上各种搜都八九不离十,基本都是这三个答案,多一个都没有。

于是也只能闭关自行修炼,摸索,另谋出路。

更新于:9:04 2017/3/12

在捣鼓 WordPress 之初,由于什么都不懂看着网上的教程,然后就安装了 sendmail 。先不谈sendmail 的作用,后面会补上,现在分析的这所有现象,都是在安装好 sendmail 的情况下进行的。

在每次查看 sendmail 服务状态的时候

systemctl status sendmail.service

会有如下两句提示:

警告

My unqualified host name (xx) unknown; sleeping for retry

unable to qualify my own domain name (xx) — using short name

sendmail 状态提示

为了有点私人空间请允许我把括号里的主机名擦掉并用xx来代替。

这里我发现了一个有意思的现象,就是只要那两行红色的提示一直存在的话启用 sendmail 就非常的慢。于是网上一查修改了 /etc/hosts 文件。打开文件:

vi /etc/hosts

hosts 文件其实也没什么内容就那么几行代码:

127.0.0.1 localhost
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.10.10.10 xx

上面的 10.10.10.10 是私有 IP,为了安全起见我随意改了一个,后面的 xx 就是主机名了 。所以当你看到这个跟我的不一样的时候,莫慌。把上面的hosts 文件改成:

127.0.0.1 localhost
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.10.10.10 xx xx.com

此次修改只是追加了 xx.com ,保存退出,改完了之后记得重启下 sendmail 服务,不然你查看状态时还是会出现如上图的提示。

systemctl restart sendmail.service

完了之后,查看状态时就再也不会出现红字提示了,一石二鸟,真是大快人心,更让人激动的是启用/重启 sendmail 服务时也不卡,不慢了,瞬间启动,从此腰也不酸了,脚也不疼了。

现在来说下一个点:mail log,多亏了上次配置 crond.service 定时服务,我才跟系统里的 mail  交上了朋友 。

在上次配置 crond.service 定时服务查看 mail 时无意间看到了一封邮件,内容是访客的评论留言邮件提示发送失败(发送到我自己的邮箱)。刚好这个评论是在我设置好“有评论时邮件我”之后的事,发送到自己的邮箱都有问题了,更不用说有评论时邮件访客了,于是我就仔细查看了一下这个 root 用户的邮件内容,我用测试的发过的邮件这里基本都会有相关的邮件提示,为什么?一万点尴尬,也正是这个原因才有了这次坎坷之旅。

今天查看了未发出去的邮件队列有40多封,我的天,这么多没发出去。全都是我用于测试的,包括前面上传的 mail_test.php 文件所发送的邮件以及我用 WordPress 后台登录的忘记密码更改密码的邮件。值得注意的是:转发出去的邮件,如果发送失败的话,那么root 的邮件里收到这封失败的邮件报告可等很久才会有,因为如果第一次发送失败,系统会等待一定的时候再尝试发送(可以是 4个小时)。在这里所说的 root 的邮件都是当我调用mail 函数发送邮件失败后,系统自动地把这个发送失败的原因(详情内容)发送到 root 用户的邮件里。所以在这里有一个东西得说清楚,这里说到的未发送的邮件是说要发到某个外部邮箱的邮件,而 root 里面的邮件是则是每次向外发送邮件失败时的日志内容,这个不能混淆了,一开始我就以为是它们是一样的东西。

// 邮件队列查看命令行
/usr/lib/sendmail -bp

对了说到 WordPress 忘记密码邮件修改的,这里也有必要说下,像上面的我装好 sendmail 后没像上面那样更改 hosts 文件的话,输入邮箱地址点击获取密码后浏览器会一直处于加载状态,等待服务器响应。然后就给我来了个:

网上查了下原因说由于nginx默认的fastcgi进程响应缓冲区太小造成,解决方法在这里我就不说了,也就改改几个参数,在这里也没有这个必要说。因为我们这个504的根本原因不是缓冲区太小,而是我们的 sendmail 在作怪。

现在觉得越来越明朗了,访客评论留言网站是有把邮件发出去的,只是经服务器处理时出了问题。依我个人第六感,有评论时邮件我指日可待。现在我要处理的问题是什么呢?查看为什么会卡在服务器处理这。于是仔细研讨邮件错误提示,以及查看邮件队列情况反馈。

在邮件队列中有这么一句话:(Deferred: Connection timed out with 163mx00.mxmail.netease.c),大概意思是连接 163mx00.mxmail.netease.c 超时。那这个要怎么解决呢?

看到后面为什么是 .c 而不是 .com。然后我又到root的邮件里查看了下

同样显示 Deferred: Connection timed out with 163mx00.mxmail.netease.com. 为什么这两个显示得会不一样?我想既然有一个是对的,那么应该没问题,就以对的那个来测试。

于是我 ping 了下 163mx00.mxmail.netease.com 是可以ping 通的。那为什么会提示 Connection timed out 呢?

我想到的原因:可能是我的邮件地址不符合问题,被 163mx00.mxmail.netease.com 拒绝了,具体的原因还不太清楚。

更新于:21:26 2017/3/13

使用外部 SMTP

经历了一万点伤害后,现在我只想静静地由浅到深来解决这个问题,在作这个决定时我还不知道发邮件这个功能什么时候可以搞定,所以也只能先从简单的方法开始试,关闭 sendmail 服务,因为暂时用不到它。

使用外部的 SMTP  ,这个跟使用插件的其实是一个道理,只不过个就只需要修改Linux 的配置文件及邮箱的 SMTP 服务,无需安装插件。这个方法网上的资料都大同小异基本是一个标准的模板,并且都屡试不爽,于是我就试了试,输入命令行

// 编辑 mail.rc 文件
vi /etc/mail.rc

在文件的最后添加如下代码:

set from=username@163.com // 发送的邮件地址
set smtp=smtp.163.com // 发送的外部smtp服务器的地址
set smtp-auth-user=username // 外部smtp服务器认证的用户名
set smtp-auth-password=yunkus.com // 外部smtp服务器认证的用户密码
set smtp-auth=login // 是邮件认证的方式

再到自己的邮箱里开启 smtp 服务

开户邮箱 SMTP 服务

设置完后,我就用 mail 命令行试发了一封:

// 发邮件到 username@163.com 邮箱
echo "test yunkus.com" | mailx -v -s "test yunkus.com" username@163.com

可是回车后就一直卡着不动了,这是什么鬼?(如下图):

mailx 使用外部 SMTP 发邮件失败

接着我分别试 ping 了一下这个220.181.12.12:smtp220.181.12.12,第一个ping 不通,显示 ping: 220.181.12.15:smtp: Name or service not known ,第二个可以 ping 通。这又是为什么呢?

Connecting to 220.181.12.12:smtp...

别人都说配置完这个就可以了,可我来回发了几次邮件还是发不出去,为什么受伤的总是我,一万个不服!

更新于:14:35 2017/3/15

我感觉有可能是端口号的问题,于是我改了下:

set smtp=smtp.163.com:25

换成25端口号还是跟上面一样,一直显示连接状态。而改成下面这两个端口号就可以

set smtp=smtp.163.com:994
set smtp=smtp.163.com:465

跳过》》》

初试 Sendmail

使用 sendmail 进行发邮件。网上有个教程配置方法如下:

为什么我会突然又跳回来用sendmail 来发邮件呢,因为我开启它后发邮件显示的详情一切正常,都提示说邮件已经发出去了。所以我就想先试试 sendmail 。

运行命令行发送邮件:

echo "test yunkus.com" | mail -v -s "test yunkus.com" xx@qq.com

会显示如下进度详情,看着都激动!

xx@qq.com... Connecting to [127.0.0.1] via relay...
220 yunkus.com ESMTP Sendmail 8.14.7/8.14.7; Wed, 15 Mar 2017 22:27:25 +0800
>>> EHLO yunkus.com
250-yunkus.com Hello localhost [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-DELIVERBY
250 HELP
>>> MAIL From:<yy@yunkus.com> SIZE=234
250 2.1.0 <yy@yunkus.com>... Sender ok
>>> RCPT To:<xx@qq.com>
>>> DATA
250 2.1.5 <xx@qq.com>... Recipient ok
354 Enter mail, end with "." on a line by itself
>>> .
250 2.0.0 v2FERPdj014160 Message accepted for delivery
xx@qq.com... Sent (v2FERPdj014160 Message accepted for delivery)
Closing connection to [127.0.0.1]
>>> QUIT
221 2.0.0 yunkus.com closing connection

这里的一切看起来都那么的和谐。那就试试它吧?现在来配置 Sendmail 。

1.如果系统没自带 Sendmail 你得安装下:

// 安装 Sendmail
yum install -y sendmail

// 用于后面的m4生成配置文件
yum install -y sendmail-cf

网络访问权限

2.修改 Sendmail 服务的网络访问权限

vi /etc/mail/sendmail.mc

定位到

DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl

Addr=127.0.0.1修改成Addr=0.0.0.0

修改完后退出保存,接着通过如下命令生成 Sendmail  配置文件。

m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

3.Sendmail 邮件域名配置

vi /etc/mail/local-host-names

添加如下一行代码:

yunkus.com

4.修改 submit.cf 文件

vi /etc/mail/submit.cf

定位到#Dj$w.Foo.COM,修改为

//注意前面的 Dj 不能少
Djyunkus.com

话说到了这里 Sendmail 邮件配置完毕,重启 Sendmail 使配置生效,坐等测试。

// 充满幻想地发邮件
echo "test" | mailx -v -s "test" username@163.com

结果你猜,我又失败了,为什么老天总是跟我过不去,别人的都成功了,为什么唯独我,偏偏是我一次又一次失败。

20:12 2017/3/16

把前面的都忘了吧,虽然我也舍不得,但人总得往前看。

一、修改 Sendmail 服务的网络访问权限

vi /etc/mail/sendmail.mc

定位到

DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl

Addr=127.0.0.1修改成Addr=0.0.0.0

修改完后退出保存,接着通过如下命令生成 Sendmail  配置文件。

m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

修改完这个配置文件后,记得重启 sendmial

然后我们就可以通过telnet 来测试我们的设置是否成功。telnet 测试你可以用 window 的cmd 命令,或者终端软件如:putty 。在这里我用 putty 来测试。

连接类型记得要选择 Telnet 。

如果访问成功,你会看到一行类似这样的文字:

220 yunkus.com ESMTP Sendmail 8.14.7/8.14.7; Thu, 16 Mar 2017 20:12:06 +0800

本来以来重新安装一次配置一次没问题,但结果还是一样,这里就不提了。Linux 站点配置里我只服 sendmail ,我承认这次我输了,而且输出体无完肤,有缘再见。

完》》》

  • 微信扫一扫,赏我

  • 支付宝扫一扫,赏我

声明

原创文章,不经本站同意,不得以任何形式转载,如有不便,请多多包涵!

本文永久链接:http://yunkus.com/linux-environment-wordpress-sendmail-bumpy-journey/

评论 END