艰难搞定WordPress评论回复邮件通知

 

其实早在很多年前,我记得是我还在用Bo-Blog的时候,当时就装了一个迟到的插件,做到了回复网友评论的同时发一封邮件去提醒。可是后来随时自己一度远离博客,而友情链接里能打开的链接越来越少,就淡化了这个功能的重要性。

最近这一年来,我又渐渐的开始写起了博客,而使用的程序也从Bo-Blog变到Emlog再到现在的WordPress,用WP的这半年来,其实博客也没有什么人来访问,更别说留言了,所以这个功能,一直也没有怎么放在心上。

直到前不久看到一个虽然我不认识,但是比较知名的站长卖掉了坚持8年的网站,另开新站。我跑过去留言,不久就得到了邮件通知说博主回复了我。这个增加黏性的功能才再一次引起了我的注意。但是我心想,这个功能应该很容易,所以也没管它,下次什么时候写日志的时候顺便搞一下好了,结果没想到搞定这事儿是如此的艰难。

前几天写日志,看到我说的那个站长,以他新站“挖站否”的名字在我一篇日志下有留言,我准备回复的时候当即想到了这事儿。不过当时有点急事,我写完日志就先回复了他,然后这几天也没管。终于昨天晚上在家里准备搞一下,我才发现,这个功能没有想象的那么简单。

首先,我们可以从网上找到,实现这个功能的方法是修改主题目录下的function.php文件,在结尾的?>上面加上如下代码:

function comment_mail_notify($comment_id) {
$comment = get_comment($comment_id);
$parent_id = $comment->comment_parent ? $comment->comment_parent : '';
$spam_confirmed = $comment->comment_approved;
if (($parent_id != '') && ($spam_confirmed != 'spam')) {
$wp_email = 'no-reply@' .preg_replace('#^www.#', '', strtolower($_SERVER['SERVER_NAME']));//e-mail 发出点, no-reply 可改为可用的 e-mail.
$to = trim(get_comment($parent_id)->comment_author_email);
$subject = '您在 [' . get_option("blogname") . '] 的留言有了回应';
$message = '<div style="border-right:#666666 1px solid;border-radius:8px;color:#111;font-size:12px;width:702px;border-bottom:#666666 1px solid;font-family:微软雅黑,arial;margin:10px auto 0px;border-top:#666666 1px solid;border-left:#666666 1px solid"><div class="adM">
</div><div style="width:100%;background:#666666;min-height:60px;color:white;border-radius:6px 6px 0 0"><span style="line-height:60px;min-height:60px;margin-left:30px;font-size:12px">您在<a style="color:#00bbff;font-weight:600;text-decoration:none" href="' . get_option('home') . '" target="_blank">' . get_option('blogname') . '</a> 上的留言有回复啦!</span> </div>
<div style="margin:0px auto;width:90%">
<p>' . trim(get_comment($parent_id)->comment_author) . ', 您好!</p>
<p>您于' . trim(get_comment($parent_id)->comment_date) . ' 在文章《' . get_the_title($comment->comment_post_ID) . '》上发表评论: </p>
<p style="border-bottom:#ddd 1px solid;border-left:#ddd 1px solid;padding-bottom:20px;background-color:#eee;margin:15px 0px;padding-left:20px;padding-right:20px;border-top:#ddd 1px solid;border-right:#ddd 1px solid;padding-top:20px">' . nl2br(get_comment($parent_id)->comment_content) . '</p>
<p>' . trim($comment->comment_author) . ' 于' . trim($comment->comment_date) . ' 给您的回复如下: </p>
<p style="border-bottom:#ddd 1px solid;border-left:#ddd 1px solid;padding-bottom:20px;background-color:#eee;margin:15px 0px;padding-left:20px;padding-right:20px;border-top:#ddd 1px solid;border-right:#ddd 1px solid;padding-top:20px">' . nl2br($comment->comment_content) . '</p>
<p>您可以点击 <a style="color:#00bbff;text-decoration:none" href="' . htmlspecialchars(get_comment_link($parent_id)) . '" target="_blank">查看回复的完整內容</a></p>
<p>感谢你对 <a style="color:#00bbff;text-decoration:none" href="' . get_option('home') . '" target="_blank">' . get_option('blogname') . '</a> 的关注,如您有任何疑问,欢迎在博客留言,我会一一解答</p><p>(此邮件由系统自动发出,请勿回复。)</p></div></div>';
$from = "From: \"" . get_option('blogname') . "\" <$wp_email>";
$headers = "$from\nContent-Type: text/html; charset=" . get_option('blog_charset') . "\n";
wp_mail( $to, $subject, $message, $headers );
//echo 'mail to ', $to, '<br/> ' , $subject, $message; // for testing
}
}
add_action('comment_post', 'comment_mail_notify');

可是我加入这段代码,并修改了发件人信息后,测试失败,在后台回复评论时会显示error。

我在网上翻了很多资料,大多都是同样的内容,就是对权限有所控制,但对于收发信功能实现来说,都是相同的,所以对我遇到的问题没有参考意义。后来看到一个叫Capbone的博客,博主说把发件人那里直接改为:

$wp_email = 'capbone@capbone.com' ; //e-mail 发出点, no-reply 可改为可用的 e-mail.

也就是直接写上一个固定的邮箱,似乎可以解决一些问题,我试了下,error没有了,但邮件依旧没有。

那么咱们继续找原因,有资料说可能会因为空间不支持mail()函数导致这个问题,并且给出了相关测试代码,我用代码试了,显示已发出邮件,但我实际收不到。

另外也用phpinfo函数看了,证明我的邮件相关的php的设置也应该是支持的。

到了这一步,我就想既然空间没问题,代码没问题,那问题可能出在邮箱,跑去QQ邮箱翻了收件箱和垃圾邮件都没有,最后再自助查询的收信查询中看到被系统自动拦截了。

确认了问题所在,接下来就是解决问题了,解决被拦截的问题有两个方案,第一是同过在function.php文件增加代码实现利用自有邮箱的smtp发送邮件,第二是装smtp插件实现。

我首先选择了第一个方案,我们需要在function.php文件中增加并配置如下代码:

//使用smtp发送邮件,你可以参照你使用的邮箱具体设置SMTP
add_action('phpmailer_init', 'mail_smtp');
function mail_smtp( $phpmailer ) {
$phpmailer->FromName = 'Jevin'; //发件人
$phpmailer->Host = 'smtp.qq.com'; //修改为你使用的SMTP服务器
$phpmailer->Port = 465; //SMTP端口,开启了SSL加密
$phpmailer->Username = 'xxxxxx'; //邮箱账户
$phpmailer->Password = '********'; //输入你对应的邮箱密码,这里使用了*代替
$phpmailer->From = 'xxxxxx@xxxxxx.com'; //你的邮箱
$phpmailer->SMTPAuth = true;
$phpmailer->SMTPSecure = 'ssl'; //tls or ssl (port=25留空,465为ssl)
$phpmailer->IsSMTP();
}

关于邮箱的相关信息,你都可以去你的邮件服务商处获取,我配置好后试了一下,在后台回复别人时会一直有个转菊花的加载提示,但并没有邮件发出。

此时我经过仔细查看配置,发现现在的邮箱大多是通过授权码代替密码的方式来进行,我直接输入了密码,于是我跑去QQ邮箱获取了授权码。

设置完成后,再来试,咦,还是不行。当时也急着睡觉了,就没继续研究,直接采取前面说的第二方案。去搜了一个兼容最新版WP的smtp邮件插件Easy WP SMTP来用,结果配置好了,下面点击发送测试邮件,浏览器状态栏显示等待响应,然后就没有然后了。

于是,昨晚的一顿操作,最后以失败告终。不过昨晚也将网络上能找到最多的相关代码和方法基本都试了一遍,起码说明,我遇到的问题可能不是那么大众化。

今早继续琢磨,因为昨晚最后在一个叫小z博客的站上看到有网友说用amh遇到了发不出去的问题,跟我很相似,所以我一度以为是amh的问题。

不过因为白天上班也没有晚上那么多闲工夫自己研究,我上午选择了求助于朋友藤也先生。藤也搞了一个小程序让我先试试看空间方面的问题,我说我昨天试了,不过他依然要求我再用他写的小程序试试,后来发现用他写的小程序配置好邮箱信息后,点击发送测试邮件依然会卡住,通过F12查看,他认为是服务器问题。

于是我先登录SSH,用命令查看maillog

tail -f /var/log/maillog

这个命令能看到mail相关的日志:

看了这个,这货又让我打命令:

ifconfig

通过这个,确定我装的是postfix:

然后再来命令

cat /etc/postfix/main.cf | grep inet_protocols

看看inet_protocols的配置

然后我们估计是inet_protocols的问题,所以需要修改一下postfix的配置

vi /etc/postfix/main.cf

进去之后找到inet_protocols = all这个栏目,将后面的all改为ipv4(小写),然后再重启postfix就行了。

重启这里因为我第一次进去改成了IPv4,所以没有成功,后来改成全小写就好了。

我觉得改了系统配置,总应该好了吧,可是结果并不如人意,我在后台尝试回复留言来测试,依旧是转菊花的效果,并不能真的发出邮件去。

这时候真的有点蛋疼了,我空间配置应该是正确的,我代码上的配置应该也是正确的,我理论上不存在问题,可实际上无论测试脚本还是其他都跑不通,发不出去邮件。

如果只是我,此时肯定已经不知道要怎么解决问题了。不过此时藤也把我SSH账号密码拿去研究了一番,发现我这个服务器根本ping不通腾讯的QQ邮箱服务器,我也自己试了一下,果然在服务器没办法ping通smtp.qq.com

既然问题确定到了这里,果断工单找小鸟云的客服了,客服找我要了账号密码,我吃个午饭回来,发现已经回复工单说搞定了。

于是我再直接停用之前下载的插件,使用纯代码修改function.php的方法,留了个藤也的邮箱试了下。

终于,功夫不负有心人,我的博客终于实现了回复评论邮件通知了。

总结下来,这个功能看似很简单,网上能找到的资料也很多,但由于它涉及到代码修改WordPress博客程序、第三方邮箱的配置、smtp插件、php配置、VPS系统配置、虚拟空间或主机商家的设置等多方面的因素,所以真的遇到问题,排查起来异常麻烦,所以我写本日志的标题也说是艰难搞定。

希望如果有其他朋友遇到同样的问题,能够看到我这篇博文,然后获得一点帮助吧!

共有 11 条评论

  1. 我现在就是各种方法搞不定,评论之后怎么都没有用邮件反馈,都不知道怎么办了

发表评论

电子邮件地址不会被公开。 必填项已用*标注