WordPress评论回复邮件提醒大BUG

日期: 标签:WordPress教程经验评论
如需帮忙改代码,或者WordPress二次开发、PHP网站建设等需求,可联系我购买付费服务:  点此联系我
文章目录

给WordPress添加评论回复邮件提醒功能,目前已成为WordPress博客的标配,不仅可以大大提高用户体验,还可以增加访客的回头率。

偶然发现,这是一项很危险的功能,目前网上流行的代码版本很容易被一些别有用心的人利用:

我可以给你博客的所有评论都回复一遍,不仅在你的博客留下了垃圾评论,垃圾内容也通过评论回复提醒邮件顺带发出去了。

无需花费心思去获取评论者的邮件地址,也不用担心评论是否还在等待审核,垃圾广告内容顺利发出,欧耶!

很多博客都宣扬不会泄漏评论者的email,但是如果这个bug被人利用,你的博客倒成了垃圾邮件的发送者,这岂不是很搞笑?

解决办法

Step 1:
进入WordPress后台 - 设置 - 讨论,勾选"评论必须经人工批准",这样所有评论必须经过管理员审核才能显示,虽然有点麻烦,但是我觉得这是博主应该负起的一项责任。

Step 2:
接着我们需要将之前的评论回复邮件提醒的代码做些修改。

我设计的运行机制是这样的:对于管理员和编辑的评论回复,可以直接给评论者发送提醒邮件;对于普通访客发表的评论,先让它在待审评论中呆着,等博主审核后,再给评论者发送提醒邮件。下面是一个评论回复邮件提醒的代码范例,使用的是所有评论回复都发送邮件通知的版本,如果你需要其他功能,请参考网上的代码进行修改:

/**
 * WordPress评论回复邮件提醒防垃圾评论版
 * 作者:露兜
 * 博客:https://www.ludou.org/
 *  
 *  2014年7月5日 :
 *  首个版本
 */

function ludou_comment_mail_notify($comment_id, $comment_status) {
  // 评论必须经过审核才会发送通知邮件
  if ($comment_status !== 'approve' && $comment_status !== 1)
    return;
  
  $comment = get_comment($comment_id);

  if ($comment->comment_parent != '0') {
    $parent_comment = get_comment($comment->comment_parent);

    // 邮件接收者email      
    $to = trim($parent_comment->comment_author_email);
    
    // 邮件标题
    $subject = '您在[' . get_option('blogname') . ']的留言有了新的回复';

    // 邮件内容,自行修改,支持HTML
    $message = '
      <p>Hi, ' . $parent_comment->comment_author . '</p>
      <p>您之前在《' . get_the_title($comment->comment_post_ID) . '》的留言:<br />'
       . $parent_comment->comment_content . '</p>
      <p>' . $comment->comment_author . ' 给您回复:<br />'
       . $comment->comment_content . '<br /><br /></p>
      <p>您可以 <a href="' . htmlspecialchars(get_comment_link($comment->comment_parent)) . '">点此查看回复完整內容</a></p>
      <p>欢迎再度光临 <a href="'.home_url().'">' . get_option('blogname') . '</a></p>
      <p>(此邮件由系统自动发送,请勿回复)</p>';

    $message_headers = 'Content-Type: text/html; charset="' . get_option('blog_charset') . '"\n';
    
    // 不用给不填email的评论者和管理员发提醒邮件
    if($to != '' && $to != get_option('admin_email'))
      @wp_mail($to, $subject, $message, $message_headers);
  }
}


// 编辑和管理员的回复直接发送提醒邮件,因为编辑和管理员的评论不需要审核
add_action('comment_post', 'ludou_comment_mail_notify', 20, 2);

// 普通访客发表的评论,等博主审核后再发送提醒邮件
add_action('wp_set_comment_status', 'ludou_comment_mail_notify', 20, 2);

最后,还是希望看过这篇文章的网友不要去干坏事哦。

好了,有什么问题,包括本文涉及代码的小修改等,可以在此给我留言。

-- 完 --

本文采用 「CC BY-NC-SA 4.0」创作共享协议,转载请标注以下信息:
原文出处:露兜即刻 https://www.ludou.org/wordpress-no-spam-comment-mail-notify.html
露兜
kaapass@outlook.com  QQ 825533758

业余编程爱好者。

79 条留言

点此留言
1 2 701
  1. 推女郎天天看

    请问博主, 这个文件要在哪里修改, 修改替换哪一段

    • 露兜

      @推女郎天天看 当前你所使用的主题目录下的functions.php,如:wp-content/themes/tuigirl365/functions.php
      在任意一个<?php 下面另起一行,添加上面的代码即可。

      • Page Page

        @露兜 添加上就可以了?我以前用过这种手动修改,但是收不到呢。

        • 露兜

          @Page 确定你的主机能正常发邮件哦

          • Page Page

            @露兜 十分确定

  2. 胖哥 胖哥

    我测试了以下没有发邮件诶,怎么破

  3. 碎碎念ZWS 碎碎念ZWS

    博客基本上没什么评论,也加过垃圾评论筛选,这个问题对我这样的小博客影响不大

  4. 无为小站

    基本没有影响

  5. 翼帆远航 翼帆远航

    多谢你的提醒。

  6. 友邻阅读 友邻阅读

    感谢分享,我用别的人出现空白。你的没有问题。特别感谢你!

  7. 孤军奋战 孤军奋战

    说的很不错,尝试中

  8. 零零八 零零八

    我自己的网站,这个功能硬是搞不好,郁闷

  9. 张鹏 张鹏

    已用上,谢谢楼主分享,哈哈

  10. 迎風别葉index 迎風别葉index

    嘶 !!!!! 不做了,研究这个来着,还是直接用多说吧

  11. 黑苹果乐园 黑苹果乐园

    对于使用CDN或者不想泄露自己网站真是IP的用户,在使用wordpress利用wp_mail或者smtp发送邮件就会暴漏网站的真实IP,站长不能做个插件当用户留言收到回复评论发送邮件或者找回密码等功能的时候,提交到到另外一台EMAIL代发服务器上,用另外一台主机或者服务器来代发邮件?目前好像很少这样的文章或者插件。

  12. 森云|SentYun 森云|SentYun

    来看看大神的代码,还未测试,回头测试一下

  13. 李光春 李光春

    还没测试,看看先

  14. 陶笛100 陶笛100

    既然已经每一条评论都需要审核才能通过,又何必修改代码让通过的才发送邮件通知呢?因为你已经审核了一遍了,骚扰广告过滤掉了。感觉多余了。可能是WordPress的发邮件代码是审核不通过也会发邮件就另当别论。

    • 露兜

      @陶笛100 就如我现在给你发的这条评论,以前版本的评论回复代码会直接将本条评论的内容发给你,不管博主有没有审核过!
      博主审核这条评论只决定这条评论是否在本博客显示,而无法决定这条评论的内容是否会通过邮件发送给父评论的评论者(也就是你)。
      你说的骚扰广告过滤掉了只是过滤掉站内的,却没有保护好博客上留言过的网友。当然你不在乎留言者的权利另当别论。如果没有以上代码的限制,成本上千的垃圾评论回复了你的这条留言,你的邮箱也会收到成百上千的垃圾邮件,不管我有没有在后台开启评论审核功能。

  15. 西木

    这个网站也用了?

  16. 野人摊影视分享

    升级了最新版wordpress4.6,发现评论回复功能已挂,望博主抽出时间更新下代码,谢谢你!

    • 露兜

      @野人摊影视分享 现在用的WordPress 4.6,测试没有问题。看看是不是你的邮件系统问题。

      • 野人摊影视分享

        @露兜 昨天恢复了旧的版本问题解决了,可能是没升级好吧!谢谢你了!

  17. yearliny yearliny

    我说怎么垃圾评论都开始回复别人评论了,原来是这样啊

  18. 明月登楼 明月登楼

    评论里现在是个安全重灾区,谷歌的安全浏览在这方面检测的都是评论者留下的网址!

  19. 韦贝贝

    这个怎么修改

    <?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']));
    $to = trim(get_comment($parent_id)->comment_author_email);
    $subject = '您在 [' . get_option("blogname") . '] 网站的留言有了回复';
    $message = '
    <div style="padding: 15px;font-family: Microsoft YaHei, arial, sans-serif; color: #000;">
    <div style="border: 1px solid #e0e0e0; margin: 0 0 10px 0;">
    <p style="font-weight: bold; padding: 5px 10px;">' . trim(get_comment($parent_id)->comment_author) . ',
    您曾在《' . get_the_title($comment->comment_post_ID) . '》上的留言:<br /></p>
    <p style="padding: 5px 10px;">' . trim(get_comment($parent_id)->comment_content) . '</p>
    </div>
    <div style="border: 1px solid #e0e0e0;">
    <p style="font-weight: bold; padding: 5px 10px;">' . trim($comment->comment_author) . ',给您的回复:<br /></p>
    <p style="padding: 5px 10px;">' . trim($comment->comment_content) . '<br /></p>
    </div>
    <p style="padding: 5px;">可以点此 <a href="' . htmlspecialchars(get_comment_link($parent_id)) . '">查看完整回复內容</a></p>
    <p style="padding: 5px;">欢迎您再度光临 <a href="' . home_url() . '">' . get_option('blogname') . '</a></p>
    <p style="text-align: center;">此邮件由系统自动发出,请勿回复.</p>
    </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 );
    }
    }
    add_action('comment_post', 'comment_mail_notify');

  20. 春雨无声

    大神,WordPress 勾选上邮件回复管理员的选项后,评论提交的时候经常在原地徘徊,等很久才能提交成功。是否可以用一个延时发邮件功能(也就先提交,之后过一段时间系统再自动发送邮件给评论者)来改一下呢?我觉得这样可以加快网友发表评论提交的速度。本人代码渣渣,不会写,但知道有个wp_schedule_single_event()函数(https://codex.wordpress.org/Function_Reference/wp_schedule_single_event),是否可以用在这里?

    先谢过。

    • 露兜

      @春雨无声 曾经也考虑过这个问题,但是付出比回报大,WordPress的定时任务需要访客触发,定时任务设置太多也可能会影响访客体验。
      本地邮件系统发送慢的话,可以考虑一下使用smtp来发件。

      • 春雨无声

        @露兜 那我还是不考虑了,没准以后换个主机会好一点。

        十分感谢这么快就回复了。

  21. yimo

    感谢露兜分享,已经成功用上了。
    能不能加上个有新评论时邮件通知文章作者的功能,或者作者文章通过审核邮件通知作者的功能~感觉都可以集成个插件了~

    • 露兜

      @yimo 这些代码网上都有,可以自己搜搜看看。
      代码放到functions.php中跟放到插件中,效果是一样。

      • yimo

        @露兜 文章通过审核发送邮件通知的代码找到了,但是文章有新评论是通知作者的还真是找不着~百度搜到的都是给评论者通知的

        • boyizmen boyizmen

          @yimo 文章有新评论是通知作者这个wordpress自带的功能就有把,设置-讨论里有
          发送电子邮件通知我 有人发表评论时

  22. 米虫博客 米虫博客

    摘用此实例代码,虽然因为阿里云禁用了25端口导致sendmail用不了,还是要来感谢一下博主,部分代码依旧被使用了,非常感谢~已注明来源

  23. vince vince

    已经实装,今天测试了很多功能,非常感谢,学习到了很多!

  24. 感谢提醒

    这个确实需要防止

  25. ANDREWME

    感谢博主提供的插件和思路。
    复制代码到function里面保持后,测试能收到邮件,但是全部中文字符显示乱码。
    然而,英文确实能正常显示。博客UTF-8格式。
    请问,这个是什么原因呢?
    直接复制文中的代码,没做任何改动。
    谢谢!

1 2

发表留言