乌徒帮技术范WordPressWordPress使用 › 解决wordpress评论回复时不能邮件通知

解决wordpress评论回复时不能邮件通知

分类:WordPress使用

wordpress评论回复时的邮件通知具有重要的用户意义,首先,用户在网站留言要么觉得文章写得好,表达赞赏之意,要么觉得文章中存在某点问题或不解,甚至提出更好的解决办法,再者用户看完文章后仍然不能解决自己的问题,因此留言寻求帮助。启用评论回复的邮件通知,不仅能和访客形成良性的循环交流,增加网站用户粘度,同时也能让博客增加生气,留言多了以后增加整体网站的权重。

但是,由于各种条件的限制,很多wordpress博客即使安装了插件,仍然不能实现留言评论邮件通知的现实效果。那么,首先你要先确定你是属于问题的哪种情况:

1、邮件无法发送,无论是留言,还是注册,邮件根本无法使用;
2、某些情况下邮件可以发送,或者我已经安装了邮件插件,可以发送邮件,但无法实现评论发送邮件的功能
3、我已经试过了网上很多方法,也能发送邮件,别人评论时我的管理员邮箱也能收到评论提示,但我回复的时候别人就是收不到邮件

以上的情况是最常见的,如果你有其他问题,通过本文后仍然无法解决,请留言。以上的这些问题我在网上稍微收集了下,反映为以下几种情况和方法:

1、http://blog.chaojiwudi.com/2010/12/cannot_send_comment_reply_notification_when_use_some_theme/
2、http://www.nenew.net/wordpress-email-notify.html
3、http://www.xeker.org/archives/1424
4、http://www.ruijienet.com/661

上面这些文章反映了一些情况,如Linux主机和windows主机不同引起的邮件发送能力,Mail()的禁用,wordpress邮件插件,留言评论回复邮件通知插件等等,甚至还提到了一些wordpress核心文件中某些函数功能及修改的问题。接下来,本文将做一个相对比较全面的总结,希望对你有用。

一、解决邮件发送问题

其实无论你是Lunix主机还是WIN主机,都不影响邮件发送能力,这要看主机服务商是否提供了mail()函数,这在php针探中可以查看。不过有些主机即使php针探中显示开放,也不能发送邮件,可能于主机的其他设置和wordpress本身函数的不适应造成。因此采用邮件发送插件成为第二选择。我只提供参考插件wp-mail-smtp插件。wordpress邮件插件都是通过smtp设置实现邮件发送,拿163邮箱来说,在设置选项中有一项是POP3/SMTP/IMAP,在这项设置中开启smtp,开启后你就可以在其他地方利用邮箱的服务向别人发送邮件了,例如你的foxmail客户端,你自己的网站程序(discuz等)。在wp-mail-smtp插件激活后进入设置。填写的内容也很简单。主要的项目有:你的发信邮箱,你的发信署名,你是选择用smtp发送邮件还是php函数发送(选择smtp),host:smtp.163.com,port:25,是否使用ssl或tls登录(选择第一项:不使用),你在163的用户名(无@163.com),密码。经过上面这些项目的设置,保存之后可以找一个自己的邮箱发送测试邮件,如果收到邮件就算成功。一般用163的邮箱速度会很快,收不到邮件的话修改上面的各个项目进行尝试,直到能收到邮件为止。如果还收不到,可更换插件、主题、本地测试等方法,看是否为wordpress程序错误,如果都不是,那么可能你的服务器不支持smtp邮件发送,这就需要和服务商进行沟通了。

二、解决邮件问题后选择评论回复邮件通知的实现方式

实现的方式有两种,一种是插件实现,另一种是写程序自动实现。当然,似乎还有人修改wordpress核心文件,通过修改邮件递送的函数,改变参数的方式实现,这种方法不适合一般水平的朋友,而且也太麻烦。

插件推荐两款:comment-reply-notificationmailtocommenter,这两款可以最轻量的实现功能,并在后台中可以设置发送邮件的内容格式。可以参考我最开始给出的几个链接文章中的图例。具体设置就不用多讲了,因为是中文,大家可以看懂,稍加尝试后就可以确定具体使用方法。

无插件实现留言评论邮件回复功能:在上文的链接中,网友已经给出了很明确的代码。我则推荐下面的代码,将下面代码中邮箱地址的地方稍加修改,然后全部拷贝到主题文件目录下的functions.php文件中,即可在每次回复留言时选择是否发送邮件。

//------- comment_mail_notify v1.0 by willin kan. (发送回复邮件开始) ---------
function comment_mail_notify($comment_id) {
$admin_email = get_bloginfo ('admin_email'); // $admin_email 可改為你指定的 e-mail.
$comment = get_comment($comment_id);
$comment_author_email = trim($comment->comment_author_email);
$parent_id = $comment->comment_parent ? $comment->comment_parent : '';
$to = $parent_id ? trim(get_comment($parent_id)->comment_author_email) : '';
$spam_confirmed = $comment->comment_approved;
if (($parent_id != '') && ($spam_confirmed != 'spam') && ($to != $admin_email) && ($comment_author_email == $admin_email)) {
/* 上面的判斷式,決定發出郵件的必要條件:
($parent_id != '') && ($spam_confirmed != 'spam'): 回覆的, 而且不是 spam 才可發, 必需!!
($to != $admin_email) : 不發給 admin.
($comment_author_email == $admin_email) : 只有 admin 的回覆才可發.
可視個人需求修改以上條件.
*/
//$wp_email = 'no-reply@' . preg_replace('#^www.#', '', strtolower($_SERVER['SERVER_NAME'])); // e-mail 發出點, no-reply 可改為可用的 e-mail.
$wp_email= 'frustigor@163.com';//这里可以修改为你自己的邮箱
$subject = '您在' . get_option("blogname") . '中《' . get_the_title($comment->comment_post_ID) . '》一文的留言有回复了!去看看吧 ^_^';
$message = '
<div style="margin: 1em 40px 1em 40px;background-color:#eef2fa;border:1px solid #d8e3e8;color:#111;padding: 0 15px;-moz-border-radius:5px;-webkit-border-radius:5px;-khtml-border-radius:5px;border-radius:5px;">
<p>Hi !<strong>' . trim(get_comment($parent_id)->comment_author) . '</strong>,您好!<br />您曾在<strong>《' . get_the_title($comment->comment_post_ID) . '》</strong>的留言有了新回复。</p>
</div>
<div style="margin: 1em 40px 1em 40px;background-color:#eef2fa;border:1px solid #d8e3e8;color:#111;padding: 0 15px;-moz-border-radius:5px;-webkit-border-radius:5px;-khtml-border-radius:5px;border-radius:5px;">
<p><strong>您说:</strong>' . trim(get_comment($parent_id)->comment_content) . '</p>
<p><strong>' . trim($comment->comment_author) . '回复:</strong>' . trim($comment->comment_content) . '</p>
<p>您可以点击<a href="' . htmlspecialchars(get_comment_link($parent_id)) . '">查看完整的回复內容。</a></p>
<p>欢迎再度光临 <a href="' . get_option('home') . '">' . get_option('blogname') . '</a></p>
<p>PS:虽然您收到本邮件,但本邮件是通过乌徒帮转发过来的,你回复邮件只会让乌徒帮frustigor收到邮件,不能和评论者一起交流,所以还是跟随上面的链接回原文讨论吧。</p>
</div>';
$from = "From: "" . get_option('blogname') . "" <$wp_email>";
$headers = "$fromnContent-Type: text/html; charset=" . get_option('blog_charset') . "n";
wp_mail( $to, $subject, $message, $headers );
}
}
add_action('comment_post', 'comment_mail_notify');
// -- END ----------------------------------------

完成上面的工作后,上传文件,覆盖,测试留言及回复。

三、仍然遇到问题

通过上面的一些工作后,你仍然遇到问题,该功能仍然无法实现,你需要做以下几个步骤:

1、先平静下来,确定你的wordpress已经可以发送邮件了,只是还不能实现留言评论邮件通知;
2、检查你的插件是否设置正确,是否有几种插件,或者你的主题函数是否存在邮件发送上的冲突或占用。可以更换主题,关闭其他插件,本地测试的方法进行测试,排除冲突;
3、结合这篇文章,看看能否修改wordpress核心函数来实现功能。


好了,通过以上的内容,你是否已经解决了你的问题,实现了wordpress留言评论邮件通知的功能呢?在本文下面回复,让我知道你的情况吧!

已有8条评论 快速评论
  1. frustigor #602楼 回复给@599楼 2011/11/07 21:31:23 回复

    1、请确认你的主机支持邮件功能,php探针并不一定得到真实情况,如果通过各种配置都不能发送邮件,可向主机提供商咨询是否支持;
    2、空间不支持smtp的话使用smtp插件不会起效;
    3、尝试全新安装的wordpress,如果使用邮件插件不能发送邮件的话,就不是配置问题了。

  2. Niclau #599楼 2011/11/06 10:24:18 回复

    博主,你好。我现在遇到的问题十分怪异。我的博客在ixwebhosting上,现在移到000webhost上都不能实现当有评论时向我发邮件,记得以前是可以的,我已经在wp后台钩上email通知了。但忘记密码和php探针的email我都能收到(mail())。我曾经装过wp-mail-smtp、configure-smtp,空间不支持smtp发email,但我目前这个情况好像是wp的配置问题?我也不知该从哪找出问题?

  3. 鬼片电影 #588楼 2011/10/29 12:56:34 回复

    咱的是人家回复 咱不知道…

  4. 王威 #39楼 2011/07/28 22:04:16 回复

    我的空间不支持mail(),按照你的方法做了wp-mail-smtp,测试邮件可以正常发出了,但第二步,用那两个插件都不能回复邮件呀,就是测试邮件也发不出去

  5. frustigor #38楼 回复给@37楼 2011/07/19 08:07:19 回复

    你好,本站所使用的也是comment_mail_notify的方法,由于服务器不支持mail(),所以安装了wp-mail-smtp插件,如果你的空间支持,那么可以不再另外安装。在该插件中,有一项选择:是通过PHP函数发邮件还是通过smtp来发送,可以在这里进行发送方式转换。不过有的空间虽然表面提供PHP邮件发送能力,但实际并不能发送,你可以通过简单的方法测试。在确保wordpress可以发送邮件后,如果你在没有安装smtp插件的情况下使用comment_mail_notify方法出现问题,尝试检查修改你的代码,同时排除可能存在的冲突。你完全可以不用考虑空间商代发的问题,你当然可以使用自己创建的邮局做smtp代发,请详细设置好邮局smtp功能,如果你的服务器是国外服务器,那么你发出的邮件可能会迟到很久或者根本收不到。

  6. ken #37楼 2011/07/19 00:36:43 回复

    哇,这么快就回复了,真敬业!我还想着临睡前看一眼呢,呵呵~我写错了,我用的也是willin kan大师出品的代码comment_mail_notify。我看了您的自动回复邮箱地址,使用的是163邮箱,那就是通过文中的wp-mail-smtp插件实现的吧。问题是willin kan并没有特别说明,具备mail函数的linux主机使用他的comment_mail_notify还必须配合类似smtp插件来指定发件人邮箱。所以我感到疑惑的地方是,仅仅使用comment_mail_notify,配合我在cPanel创建的域名邮箱,能否去掉那个空间商代发的步骤呢?目前我是配合wp-mail-smtp暂时解决了这个问题,只是心中一直有这个疑惑呢。

  7. frustigor #36楼 回复给@35楼 2011/07/18 21:47:51 回复

    谢谢你对frustigor的肯定!
    一、一般PHP的内容系统都有直接发送邮件的程序功能,通过mail()函数递出邮件,正如你讲到的由空间商代发邮件服务器发送出去,可在php.ini中配置代发服务器各参数,但这是空间商的事,用户无法干预。
    二、既然你的主机空间支持直接发送邮件,那么完全可以不用smtp插件,而在其他需要用到邮件服务的插件中,也无需再另外配置smtp信息,当然如果插件中提示使用什么方式发送邮件,你应该选择默认的“不使用smtp”。
    三、说实话,其实我也没有用过comment-reply-notification插件,我不是很喜欢用插件,而通过为主题添加函数实现新的功能。不过我知道,任何PHP邮件发送指令都必须包含邮件数据的各项属性,例如发件人收件人,邮件内容等,你可以谷歌“PHP中mail()函数详解”了解这些性质。而这些信息是可以通过你自己修改程序完成的,就像本文中红色部分即可修改成你的私人邮箱,当读者收信后即看到这个修改过的邮件地址,并可回信给他。所以如果你想通过指定真实发件人,不妨试试这种方法。
    以上只是个人的理解和建议,希望对你有用。

  8. ken #35楼 2011/07/18 20:34:56 回复

    赞一下,看得出都是站长亲手实践的结果。其实我是想请教发邮件的问题的。如果我没错的话,貌似默认使用WP发送的邮件都是通过空间商的邮件服务器代发的?比如说使用comment-reply-notification,也在后台cPanel创建了一个专用的邮箱(如no-reply@mydomain.com),但我发现还是不能直接让它当真实发件人(收件结果会显示由主机商的一个邮箱代发的,因此会被认为是垃圾邮件,因为这类代发邮件被判定有风险)。我的主机是linux的,也支持mail函数,难道我还必须装个smtp插件来强制指定发件人么?实在是想不明白~comment-reply-notification的作者也没有提到必须用smtp方式才能指定发件人为真实发件人呢~

填写个人信息,赶快回复吧!