Wordpress的邮件问题

建站这几天来,从刚建blog的密码信到新评论通知信再到WordPress Database Backup插件往信箱发送的备份数据都没收到过。用探针查mail函数显示“支持”,而我自己写行php程序让它发往我的Gmail和sohu信箱,却死活收不到信。用PHP探针看了下,SMTP服务器设置成了默认的localhost,可是我telnet到网站的25端口却连不上(后来查了下,那个设置只在Windows下有效)。咨询了客服人员,他好像也不是太懂。反正只有一个结论:我的空间里mail函数就是不能用。

google了下,发现很多人在讲Wordpress发送的邮件标题部分如果是中文的话会出现乱码的问题,于是想把这两个问题一并解决了。

在一堆讲Wordpress邮件乱码问题的文章中找到这篇WordPress mu邮件发送解决方案,介绍了不用mail函数而使用PHP语言的发送邮件类——PHPMailer来发送email。

PHPMailer是一个比较完善的发送邮件类,支持连接SMTP服务器发送邮件,支持SMTP服务器认证,还支持“8bit, base64, binary, and quoted-printable encoding”,这下可把邮件标题乱码的问题解决了。在程序里只要建一个PHPMailer类的对象,填充好参数后执行Send()方法就可以发送了;

Wordpress设计时就考虑了邮件发送的问题,在wp-includes/pluggable-functions.php文件里提供了一个wp_mail函数,负责发送邮件。Wordpress 2.0.2中wp_mail函数的原始代码如下:

if ( !function_exists('wp_mail') ) :
function wp_mail($to, $subject, $message, $headers = '') {
if( $headers == '' ) {
$headers = "MIME-Version: 1.0\n" .
"From: wordpress@" . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME'])) . "\n" .
"Content-Type: text/plain; charset=\"" . get_settings('blog_charset') . "\"\n";
}
return @mail($to, $subject, $message, $headers);
}
endif;

$to:收件人,$subject:标题,$message:内容,$headers:邮件头。开始用if语句判断是否给出了邮件头,如果没有则生成一个,然后调用mail函数,将参数原封不动的传过去,邮件就被发送出去了。Wordpress内部都是调用wp_mail函数,而插件中,我看了下WordPress Database Backup插件里发信的代码如下:if (function_exists('wp_mail')) {
@wp_mail ($recipient, get_bloginfo('name') . ' ' . __('Database Backup'), $message, $headers);
} else {
mail ($recipient, get_bloginfo('name') . ' ' . __('Database Backup'), $message, $headers);
}
它进行了判断,如果wp_mail函数存在则调用之,否则调用mail函数发信。所以所有的邮件发送都应该调用wp_mail函数来完成,只要修改这个函数就可以了。

PHPMailer主页下载了1.73版的PHPMailer,按照LuoShuo的方法修改了几个文件,但是调试不出来,郁闷,难道RPWT?他的文章里讲到是“WordPress mu”,有可能他用的是修改版的Wordpress,里面提到要修改的几个地方我都找不到。无奈,从PHPMailer自带的测试程序开始研究它的工作方法。在PHPMailer的主页找到了个Examples,发现LuoShuo兄的代码就是copy自那里的,连英文的注释都没有删掉。其实这事完全没必要派生出一个类在使用,因为使用原来的类就行了,又没加新的功能。只要把wp-mail函数重写下,加上require("class.phpmailer.php");$mail = new PHPMailer();然后把$mail的几个属性填充一下,就可以Send了。

修改过pluggable-functions.php文件之后,邮件发送功能已经正常,而且PHPMailer有编码功能,发送出来的邮件的中文标题都很正常,无需再按照再谈WP Mail邮件头编码WordPress 通知郵件標題的亂碼两篇文章所说的在调用处手工给From编码和在wp_mail函数里给Subject编码,也不用使用AvP的插件了。

不过,还有一个问题,PHPMailer不支持设置header,使wp_mail的$headers失效,导致WordPress Database Backup插件发送的邮件无法正常显示,这个恐怕要修改PHPMailer的源代码了。我想到了用派生的办法,派生出一个类来再用新函数覆盖原来的函数,这样就不用修改PHPMailer的源代码了。另外pluggable-functions.php文件文件头部写了句/* These functions can be replaced via plugins. They are loaded after plugins are loaded. */这些函数可以被插件替换,他们在插件调用之后才被调用。原来AvP的插件就是这个道理。我也学着做个插件,以前从来没研究过,照着AvP的葫芦画个瓢吧。

费了半天时间,插件终于做好了。照着PHPMailer主页的Examples,在mail.inc.php文件里由PHPMailer函数派生出MyMailer类,增加了一个Headers属性并写了新的CreateHeader函数处理传进来的Headers,插件装上后进行了测试,数据库备份文件(标题中文,带附件),文章评论(发件人和标题中文)都正确无误,而且我用是空间商附送的邮局,速度飞快,基本这边显示备份完毕,那边gmail邮箱里就看到信了。等明天把插件里我的密码等信息去掉,然后就可以发布出来了。

开一个专门的帖子做插件的主页吧:

本文共有 13 条评论Wordpress的邮件问题


  1. 1 Godspeed

    恭喜恭喜,我最近刚转到这个上面来想研究研究
    看完LuoShuo的Blog就Baidu到了你的,不用自己编了
    爽啊~~~~多谢,什么时候Release啊?呵呵

  2. 2 salt

    我建了个wordpress mu,邮件发送有问题,却不知道如何解决,《WordPress mu邮件发送解决方案》链接已经失效了,请老大帮帮忙

  3. 3 PhilipCui

    能否共享一下您的科研成果

  4. 4 Gary

    你好,我的空间也是不能发送邮件,导致无法用GMAIL进行备份,很想使用你的这个插件,能否发送一份给我?谢谢

  5. 5 楚云

    你好,我的空间目前也遇到这样的问题,不知道能否发布这个插件?

  6. 6 tcitc081

    yskin大哥,我的网站最近也出现了你说的情况,而且如出一辙,客服也搞不定,叫我用smtp,可惜wordpress自带的邮件函数无法直接用于SMTP发送邮件,请yskin大哥帮帮忙,没看到这个据说要发布的插件的下载地址阿。。。

  7. 7 不用这么麻烦吧

    $subject = '=?UTF-8?B?' . base64_encode($subject) . '?=';

    程序里加一句话就行了

  8. 8 minidxer

    哈,我也遇到这样的问题了。

  9. 9 匿名

    没找到下载地址……能否告知一下?谢谢~~~

  10. 10 5ivedance

    谢谢了,正在搜这个东西呢

  1. 1 小户人家,良田一亩 » Blog Archive » wp发送Mail解决办法
    Pingback2006-10-30 1:56 下午
  2. 2 威廉博客-William Blog » 博客存档 » 关于 WordPress 新用户注册时收不到注册确认邮件的问题
    Pingback2006-12-27 8:09 下午
  3. 3 网站的邮件发送功能出现了问题。。。 - TCITC_BLOG
    Pingback2007-3-28 1:16 上午

请留下您的评论: