终于把 评论有回复时邮件通知 给弄出来了

用 WordPress 原生的评论系统, 当某条评论下有回复时, 评论者是不会收到任何通知的。这就导致博主兴致盎然地对某条评论大肆发表看法的时候, 原评论者也许根本就不知道这里发生了什么... 这一点绝对是我难以容忍的, 不说访问流量不说用户体验, 让我费尽口舌说一番没人看得见的话这种事我才不干。

之前花了好长时间搜索这个解决方案, 由于我不愿意用 Disqus 或者多说之类的第三方评论系统, 只能想办法用代码来解决。而不通过插件来实现评论回复邮件通知大多采用的是 Willin Kan(不用点了这个博客已经停止运营了) 的代码, 具体代码可以在这里找到, 我就懒得贴过来了。不过郁闷的是这段代码在我这里怎么都不能正常工作, 而我又对 PHP 一窍不通, 只能把这事暂且搁下, 只能希望谁在这留过言的过一段再自觉地回来看看...( 补充一下: 主机不支持 mail() 函数, 但是已经用了 WP Mail SMTP, 并且新评论邮件通知和找回密码邮件通知都可以正常工作。)昨天逛博客的时候无意在" 【记录】给wordpress添加评论回复发邮件通知功能 "这篇文章里看到作者详细记录下了解决这个问题的办法, 于是觉得这事不能再这么拖下去, 必须立刻解决否则迟早给逼出强迫症来。

仔细研究了一下发现代码中有一句

$wp_email = 'no-reply@' .preg_replace('#^www.#', '', strtolower($_SERVER['SERVER_NAME'])); //e-mail 发出点, no-reply 可改为可用的 e-mail.

想了想终于知道为什么之前老是发不出提醒邮件了。代码中指定的邮件发送者为 no-reply@域名, 对于我的 WordPress, 发送邮箱就应该是 no-reply@capbone.com, 但是我根本就还没申请这个邮箱啊!!! 相当于指定了一个根本就不存在的发件人账号, 这通知邮件要能发得出去就怪了... 想明白了问题所在就好办了, 直接把上面那一行改成

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

这样问题就解决了, capbone@capbone.com 是我在 WP Mail SMTP 中设定的发件方账号。其实最好的建议还是申请一个 no-reply@域名 的邮箱, 这样通知邮件可以看起来正式一点, 而且从代码的可移植性来讲最好使用一个通用的邮箱地址。另外我也不知道" 。preg_replace('#^www.#', '', strtolower($_SERVER['SERVER_NAME'])); "这一句是什么意思, 但是如果仅仅把" no-reply "改为" capbone "而不强制输入域名的话, 也是不能工作的。

终于发得了邮件之后就要完善一下邮件的内容了。Willin Kan 的那段代码只能实现发邮件的功能, 但邮件的内容却很不利于收信人阅读, 没有提供任何跳转链接, 相当于仅仅发送了一个通知, 还要收信人自己想办法找到当时评论的那个页面。对于这个问题常阳时光对代码进行了一些完善, 同时在邮件的样式上也做了一些修改, 大大提高了邮件的可读性。代码如下:

/* comments-reply-emai-notification */
function comment_mail_notify($comment_id) {
$comment = get_comment($comment_id);//根据id获取这条评论相关数据
$content=$comment->comment_content;//对评论内容进行匹配
$match_count=preg_match_all('/<a href="#comment-([0-9]+)?" rel="nofollow">/si',$content,$matchs);
if($match_count>0){//如果匹配到了
foreach($matchs[1] as $parent_id){//对每个子匹配都进行邮件发送操作
SimPaled_send_email($parent_id,$comment);}
}elseif($comment->comment_parent!='0'){//以防万一,有人故意删了@回复,还可以通过查找父级评论id来确定邮件发送对象
$parent_id=$comment->comment_parent;
SimPaled_send_email($parent_id,$comment);
}else return;}
add_action('comment_post', 'comment_mail_notify');
function SimPaled_send_email($parent_id,$comment){//发送邮件的函数
$admin_email = get_bloginfo ('admin_email');//管理员邮箱
$parent_comment=get_comment($parent_id);//获取被回复人(或叫父级评论)相关信息
$author_email=$comment->comment_author_email;//评论人邮箱
$to = trim($parent_comment->comment_author_email);//被回复人邮箱
$spam_confirmed = $comment->comment_approved;
if ($spam_confirmed != 'spam' && $to != $admin_email && $to != $author_email) {
$wp_email = 'no-reply@' 。preg_replace('#^www.#', '', strtolower($_SERVER['SERVER_NAME'])); // e-mail 發出點, no-reply 可改為可用的 e-mail.
$subject = '您在 [' 。get_option("blogname") 。'] 的留言有了回复';
$message = ' <table style="width: 99.8%;height:99.8% "><tbody> <tr><td style="background:#FFF"><div style="background-color:white;border-top:3px solid #000;box-shadow:0 2px 2px #000;line-padding:0 15px 14px;width:600px;margin:20px auto;color:#000;font-family:Century Gothic,Trebuchet MS,Hiragino Sans GB,微软雅黑,Microsoft Yahei,Tahoma,Helvetica,Arial,SimSun,sans-serif;font-size:14px;">
<h2 style="border-bottom:3px solid #000;font-size:16px;font-weight:blod;padding:5px 0 20px 10px;">
您在 【<a style="text-decoration:none;color: #12ADDB;" href="' 。get_option('home') 。'">' 。get_option('blogname') 。' </a>】博客上的留言有回复啦! </h2><div style="padding:0 12px 0 12px;margin-top:18px">
<p><b>' 。trim(get_comment($parent_id)->comment_author) 。' </b>君,您曾在文章《' 。get_the_title($comment->comment_post_ID) 。'》上发表评论:</p>
<p style="background-color: #ddd;border: 1px solid #888;padding: 10px 10px;margin:10px 0"> ' 。nl2br(get_comment($parent_id)->comment_content) 。'</p><p>' 。trim($comment->comment_author) 。' 给您的回复如下:</p>
<p style="background-color: #ddd;border: 1px solid #888;padding: 10px 10px;margin:10px 0">' 。nl2br($comment->comment_content) 。'</p>
<p style="padding: 10px 10px;margin:20px 0"> 您可以:<a style="text-decoration:none; color:#12addb" href="' 。htmlspecialchars(get_comment_link($parent_id,array("type" => "all"))) 。'">查看回复的完整內容</a>!欢迎再次光临<a style="text-decoration:none; color:#12addb" href="' 。get_option('home') 。'">' 。get_option('blogname') 。'</a>!</p></div></div></td></tr></tbody></table>';
$from = "From: "" 。get_option('blogname') 。"" <$wp_email>";
$headers = "$fromnContent-Type: text/html; charset=" 。get_option('blog_charset') 。"n";
wp_mail( $to, $subject, $message, $headers ); }}
/* END */

为了不使代码太长我把缩进什么的都删了, 觉得不好阅读的话可以联系我把原格式的发给你。放到 function.php 中的<?php ...?>之间就行了, 记得把发送邮箱地址改掉。

最终邮件显示效果如下

把评论回复邮件通知这事儿给解决之后总算没有心理负担了... 欢迎在下面评论等我回复的时候看看效果。最后再感谢一下常阳时光, 第一时间提供帮助。

17 Comments

  1. 洛苑博客 2017-02-27 Reply

    你这个不是多说吧?

  2. Weidan 2016-02-11 Reply

    看到上面有个熟人 我想问一下博主ho 我用了你提供的这段代码然后邮箱修改成我经常用的那个 然后服务器报500错误了。

    • Author
      Captain 2016-02-12 Reply

      有的主机默认不支持邮件发送,可以自己安装WP Mail SMTP插件试试

  3. SA 2016-01-12 Reply

    为什么我按照你的做了,还是没有成功,stmp发信能够成功

  4. harries 2015-11-11 Reply

    测试下

  5. Jimages 2013-08-22 Reply

    测试下。。。。

    • Author
      Captain 2013-08-22 Reply

      你为什么不去 Gravatar 设置一个头像?

      • Jimages 2013-08-22 Reply

        懒得翻墙。没有wordpress.com的帐号。

        • Author
          Captain 2013-08-22 Reply

          架梯子是必备技能啊, 没头像看着好难受
          而且多说可以自动调用 Gravatar 的资料

  6. 从良未遂 2013-08-08 Reply

    你这主题很不错,大气。

    • Author
      Captain 2013-08-08 Reply

      你是说过什么不该说的话被加入 Akismet 的黑名单了吗? 还好我把你拖出来了

      • 从良未遂 2013-08-08 Reply

        我没说啥啊,你小子这过滤的也太狠了吧

        • Author
          Captain 2013-08-09 Reply

          就是 Akismet 的默认过滤啊, 你得小心了… 估计其他地方你评论也要被拦了

  7. Bone 2013-08-04 Reply

    让我看看现在回复评论效果如何

Leave a reply

Your email address will not be published.