在一堆讲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.0n” . “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邮箱里就看到信了



06月 22nd, 2010 at 6:08 下午
您好,打搅了.
我想问一个问题,就是我使用的是wordpress的日文后台2.92版本,因为希望有回复访问者留言自动发邮件的功能,就按照Comment Mail Notify的介绍在模版中添加了相应代码.
但是也是出现了邮件乱码的问题.乱码发生在除日文字符外的内容上,比较麻烦的对于一些朋友不可能全部用日语回复.
pluggable.php文件在文章中理解是针对插件发邮件而设置的这样对吗?如果我希望改变wordpress默认发送邮件的编码应该对哪个文件作出修改呢?
非常感谢.
06月 22nd, 2010 at 8:14 下午
这个我还真不知道怎么解决,到别的Wordpress论坛问问看吧,我也是菜鸟级别 :(