贝壳之家

WordPress评论回复邮件提醒大BUG

评分 8.5, 满分 10 分 (27 票)
Loading...
如果需要我帮忙改代码,或者有WordPress二次开发 / PHP网站建设等需求,可以联系我购买付费服务。QQ 825533758
文章目录

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

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

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

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

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

解决办法

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/**
 * WordPress评论回复邮件提醒防垃圾评论版
 * 作者:露兜
 * 博客:http://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_bloginfo('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);

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

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

露兜
ourwindow@163.com

业余编程爱好者。

标签: WordPress, 经验, 评论
我要提问

68 条评论

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

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

    • 露兜

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

      • Page

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

        • 露兜

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

  2. 胖哥

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

  3. 碎碎念ZWS

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

  4. 无为小站

    基本没有影响

  5. 翼帆远航

    多谢你的提醒。

  6. 友邻阅读

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

  7. 孤军奋战

    说的很不错,尝试中

  8. 零零八

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

  9. 张鹏

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

  10. 迎風别葉index

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

  11. 黑苹果乐园

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

  12. 森云|SentYun

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

  13. 李光春

    还没测试,看看先

  14. 陶笛100

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

    • 露兜

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

  15. 西木

    这个网站也用了?

  16. 野人摊影视分享

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

    • 露兜

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

      • 野人摊影视分享

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

  17. 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');

1 2

发表评论

评分 8.5, 满分 10 分 (27 票)
Loading...