2008-11-20  16,980 views 26

WP插件之WP-Thread-Comment的不足

温馨提示:本文共计3017个字,预计阅读时间需要11分钟。

WordPress Thread Comment: 允许用户回复某个特定的评论并集中显示相似评论, 可以自由选择是否使用ajax. 作者: 偶爱偶家

最近在使用中发现邮件通知功能尚有不足之处, 如下:

经插件作者提示, 邮件不能发出的真因是由于163的邮箱要验证发信人, 如果configure smtp的设置的发信人和163设置的发信人不同, 就会导致TC不能发信给评论者.. 如此, 问题解决了. 以下的内容就当是学习一下WP的mail函数吧! :mrgreen:

由于很多的虚拟空间都是WIN主机, 所以不支持WP默认的邮件发送功能. (以下内容引用自Crazy Loong的文章<让 WordPress 通过 SMTP 发送邮件>)

为什么邮件无法发送呢?WordPress 默认的发送邮件的方式是使用 PHP 中的 mail() 函数,而mail()函数使用的确是 *nix 的Sendmail。大多数无法发送邮件的原因就在于此。可想而知,国内广大的WIN主机用户是多么的憋闷。 难道就素手无策了?当然不是了,事情总有解决的方法。感谢伟大的 PHPer 们,因为我们有 PHPMailer (介绍见这里)。更令我们高兴的事儿是 WordPress 已经集成了 PHPMailer ,有经验的 WPer 可以直接修改 wp_mail() 函数,将其发送方式修改成 SMTP 方式(具体方法请自行查阅)。

所以我使用了Crazy推荐的Configure SMTP这款插件, 备置一切正常, 当有人回复日志时会立即通知我. 同时我还使用了评论插件 WP-Thread-Comment, 它有个功能是通过发Email让评论者收到博主的最新回复通知. 怎么测试都不成功, 分析代码如下:

@wp_mail($parent_email, $mail_subject, $mail_message, $mail_headers);
unset($mail_subject,$parent_email,$mail_message, $mail_headers);

PHP里就只有调用了wp_mail函数, 所以正常我们是不能用的, 而Configure SMTP插件使用的是PHPMailer类, 所以作者偶爱偶家说他备置好Configure SMTP插件就可以正常使用, 真是有点难以置信, 我猜他可能是误解我的意思了.

由于才接触PHP, 一些方法还不熟悉, BAIDU找到了一位牛小哥, 通过他的文章WP-DB-Backup使用PHPMailer发送备份邮件我想应该用同一个原理也是可以实现的, 所以留言请他帮忙修改了下代码, 果不其然, 成功了.. 增加代码如下:

/**
* Sends the backed-up file via email
* @param string $to
* @param string $subject
* @param string $message
* @return bool
*/
function send_mail( $to, $subject, $message, $headers) {
global $phpmailer;

extract( apply_filters( 'wp_mail', compact( 'to', 'subject', 'message', 'headers' ) ) );

if ( !is_object( $phpmailer ) || ( strtolower(get_class( $phpmailer )) != 'phpmailer' ) ) {
if ( file_exists( ABSPATH . WPINC . '/class-phpmailer.php' ) )
require_once ABSPATH . WPINC . '/class-phpmailer.php';
if ( file_exists( ABSPATH . WPINC . '/class-smtp.php' ) )
require_once ABSPATH . WPINC . '/class-smtp.php';
if ( class_exists( 'PHPMailer') )
$phpmailer = new PHPMailer();
}

// try to use phpmailer directly (WP 2.2+)
if ( is_object( $phpmailer ) && ( strtolower(get_class( $phpmailer )) == 'phpmailer' ) ) {

// Get the site domain and get rid of www.
$sitename = strtolower( $_SERVER['SERVER_NAME'] );
if ( substr( $sitename, 0, 4 ) == 'www.' ) {
$sitename = substr( $sitename, 4 );
}
$from_email = 'wordpress@' . $sitename;
$from_name = 'WordPress';

// Empty out the values that may be set
$phpmailer->ClearAddresses();
$phpmailer->ClearAllRecipients();
$phpmailer->ClearAttachments();
$phpmailer->ClearBCCs();
$phpmailer->ClearCCs();
$phpmailer->ClearCustomHeaders();
$phpmailer->ClearReplyTos();

$phpmailer->AddAddress( $to );
$phpmailer->Body = $message;
$phpmailer->IsHTML(true);
$phpmailer->CharSet = apply_filters( 'wp_mail_charset', get_bloginfo('charset') );
$phpmailer->From = apply_filters( 'wp_mail_from', $from_email );
$phpmailer->FromName = apply_filters( 'wp_mail_from_name', $from_name );
$phpmailer->IsMail();
$phpmailer->Subject = $subject;

do_action_ref_array( 'phpmailer_init', array( &$phpmailer ) );

$result = @$phpmailer->Send();

// old-style: build the headers directly
} else {
$result = @wp_mail($to, $subject, $message, $headers);
}
return $result;

}

通过创建的send_mail方法来发送邮件, 如果PHPMailer出错, 还可以使用wp_mail, 很完美的修改.

$this->send_mail($parent_email, $mail_subject, $mail_message, $mail_headers);
unset($mail_subject,$parent_email,$mail_message, $mail_headers);

现在评论者已经可以正常收到我的最新回复Email通知了. 再次感谢牛小哥的热心相助, Crazy的穿针引线, 还有偶爱偶家原作者的辛苦努力, 这个插件真的是非常棒! :wink:

来一张测试成功的图片:

TC

End.

Author: 黑白天空
Date: 11/20/2008

26 条评论  访客:17 条  作者:9 条

  1. 偶爱偶家

    关键是wp_mail也是调用phpmailer的呀! 我实在搞不清楚您的问题, 我在本机没有sendmail, 然后用liteserve搭建smtp, 然后直接加上configure smtp就可以使用, 根本不需要做您的修改的。

    • 黑白天空 GM

      @偶爱偶家 @偶爱偶家, 怎么如此奇怪, 我測試了很多次都是失敗的啊, 我再實驗下, 好奇怪的說~~ :| 我一定要找到真因! :evil:

      • 偶爱偶家

        @黑白天空 @黑白天空, 我觉得问题可能出在您的configure smtp的设置上, 很多的smtp必须验证发信人之类的, 而如果设置成了别的发信人就会出问题.

        $phpmailer->From = apply_filters( ‘wp_mail_from’, $from_email );
        $phpmailer->FromName = apply_filters( ‘

        • 黑白天空 GM

          @偶爱偶家 @偶爱偶家, 哈哈, 真因果然如此, 感谢偶爱偶家, 很负责任, 那我这篇文章不是写错了哦.. 呵呵, 真的没有想到居然和发信人的名称有关系, 哎…气死我了!

          但是我又发现另外一个Bug, 是真的Bug, 我怎么联系你. :D

          • 衣不如新

            @黑白天空 谢谢黑白,终于解决wp-db的mail问题,smtp的话,我推荐你用163的,我刚试过用163的smtp WP-Thread-Comment发信正常

          • 偶爱偶家

            @黑白天空 @黑白天空, 直接给我的邮箱发信吧, 这次留下的邮箱是真实的,

  2. 偶爱偶家

    我想您可以去看看wp的代码pluggalbe.php里面的wp_mail函数, 就是采用phpmailer的

  3. David LV2

    我也不知道我的发出去没有

    • 黑白天空 GM

      @David @David, 貌似没有吧, 我每次都没有收到你的Email…

  4. hackcat LV4

    这个东西很奇怪

  5. hackcat LV4

    原来是这样啊!怪不得换成gmail了呢!

  6. jKey

    没用过,呵呵 8O

    • 黑白天空 GM

      @jKey @jKey, 建议你快用用, 插件真的很不错哦.

  7. xiaorsz

    这博客留言的地方很有意思!
    博客皮也不错,呵呵!

    • 黑白天空 GM

      @xiaorsz @xiaorsz, 过奖了, 只是比较喜欢复古的感觉 :D

      • xiaorsz

        @黑白天空 @黑白天空, 回复的背景色是不是太突兀了?觉得改下的话会更有感觉些。一点点建议!!

        • 黑白天空 GM

          @xiaorsz @xiaorsz, 用的是默认的CSS, 我太懒了, 不想去动它啦…再说这个插件自身已经很棒了, 至于色彩的问题, 谢谢的你建议, 现在要弄好SEO ;)

  8. 阿修

    呵呵,这个插件不错,刚刚开博就用上了。~~ :)

    • 黑白天空 GM

      @阿修 主要还要看主题, 我这个主题留言区比较宽敞, 所以看上去还不至于难看.

      • 阿修

        @黑白天空 呵呵,这个插件已经调试到我要的效果了。因为用的模版比较特殊,所以参考了你的经验分享~
        插件页面很不错,给我提供了很多参考~
        谢谢你~~

        • 黑白天空 GM

          @阿修 网络互助是基本的blog共享精神, 能帮助的一定尽力. 你还可以通过Gtalk和我成为朋友哦 :mrgreen:

  9. 可乐

    我的博客开启了这个插件却没有头像显示,这是为什么呢?请博主指点一二、

  10. 好郁闷

    我的博客开启了这个插件后评论时就会把侧边栏撑下来,是什么原因呢?还有点击回复的时候,评论框出现在下面被隐藏了,好郁闷,请人空帮我看看,谢谢!

  11. dian588.cn

    来看看。

评论已关闭!