最近因为工作的关系,需要用mail来发WORDPRESS中文博客,在按照官方的文档(http://codex.wordpress.org/Blog_by_Email)修改设置之后,发现发表中文博客只有标题,没有内容,而且标题为乱码,上网查了下资料,发现很多朋友也遇到了相同的问题,研究了半天没有找到解决办法,最后老大出马,很快就搞定了,现在就将详细的修改过程记录下来,以便其他的网友参考。
首先,要使用WORDPRESS的mail功能,必须执行以下三步:
1.申请一个用来收取文章的专用邮箱。
申请一个名称个性的邮箱,并保证该邮箱不用做他用,名称标准以不被机器人猜到为最佳,这样可以避免收到大量的垃圾邮件,或者以管理员身份登陆后台,查看“设置–撰写–通过 e-mail 发表文章“,该处提供了三个随即字符串,也可以使用这三个字符串中的一个作为邮箱的用户名,
2.配置WORDPRESS来连接这个邮箱。
登陆后台,在“设置–撰写–通过 e-mail 发表文章“处填写刚刚申请的邮件服务器名,端口号(默认为110),登陆用户名、密码,以及发表文章所属的分类。
注:登陆用户名必须是全称,比如 user@example.com;
3.配置WORDPRESS通过该邮箱来发表文章。
在配置好后台之后,需要触发一下读取邮件的程序才能发表文章,方法有很多种,这里介绍两种,其他的方法可以到官网查阅
第一种:
直接访问 http://example.com/installdir/wp-mail.php,也就是你的安装目录下的wp-mail.php文件,这种方法的缺点是每次更新都需要自己去访问这个地址,很不方便。
这里介绍第二种:
<iframe src=”http://yourblogdomain/wordpressinstalldir/wp-mail.php” name=”mailiframe” width=”0″ height=”0″ frameborder=”0″ scrolling=”no” title=””></iframe>
将上面这段代码中的src修改为自己的博客地址后,复制粘贴到对应模板下的footer.php。下次有人访问你的网站便会自动将邮箱中的文章发表。
好了,经过上面的设置,以后就可以通过邮件客户端发博客到上面设置的邮箱中了,但是有一个问题,发表的文章只要标题没有内容,而且标题为乱码,要想解决这个问题,首先要了解下MIME邮件的格式,具体的可以参考这篇文章(http://dev.csdn.net/article/18/18448.shtm)。
在了解了MIME邮件格式之后,我们需要用客户端软件(这里以Foxmail为例),查看邮件的原始信息(快捷键ctrl+i),可以看到类似这样的字段:
Subject: =?gb2312?B?1tDOyg==?=
Date: Wed, 26 Nov 2008 09:12:04 +0800
MIME-Version: 1.0
Content-Type: multipart/alternative;
boundary=”—-=_NextPart_000_000B_01C94FA7.0C61F990″
This is a multi-part message in MIME format.
——=_NextPart_000_0040_01C94FEF.C3D5DA40
Content-Type: text/plain;
charset=”gb2312″
Content-Transfer-Encoding: base64
可以看出这封邮件的主题是使用”?”分割,文字编码是GB2312,内容使用base64编码格式传送,在收集到这些信息以后,我们再来简单的看下wp-mail.php是如何工作的。
(根据版本不同,代码可能稍有不同)
找到第20行:
$phone_delim = ‘::’;
这一行定义了邮件主题中的分割符,将这个改为
$phone_delim = ‘?’;
然后找到第60行:
if (preg_match(‘/Content-Transfer-Encoding: /i’, $line)) {
$content_transfer_encoding = trim($line);
$content_transfer_encoding = substr($content_transfer_encoding, 27, strlen($content_transfer_encoding)-14);
$content_transfer_encoding = explode(‘;’, $content_transfer_encoding);
$content_transfer_encoding = $content_transfer_encoding[0];
}
这段代码是获取当前邮件的传送格式,因为是base64编码,故将其改为以下的代码
if (preg_match(‘/Content-Transfer-Encoding: /i’, $line)) {
$content_transfer_encoding = trim($line);
$content_transfer_encoding = substr($content_transfer_encoding, 27);
$content_transfer_encoding = explode(‘;’, $content_transfer_encoding);
$content_transfer_encoding = $content_transfer_encoding[0];
}
然后是获取邮件的主题部分,在75行的位置
// Captures any text in the subject before $phone_delim as the subject
$subject = explode($phone_delim, $subject);
$subject = $subject[0];
因为是中文的邮件标题( Subject: =?gb2312?B?1tDOyg==?= ),故将其改为
// Captures any text in the subject before $phone_delim as the subject
$subject = explode($phone_delim, $subject);
$subject = $subject[3];
之后的这段改动比较大,从147到160行,因为邮件标题和内容使用GB2312格式,故需要将其进行转化为UTF8格式,如果邮件默认编码为UTF8格式,此步需要稍作修改。
$subject = trim($subject);
if ($content_type == ‘multipart/alternative’) {
$content = explode(‘–‘.$boundary, $content);
$content = $content[2];
$content = explode(’Content-Transfer-Encoding: quoted-printable’, $content);
$content = strip_tags($content[1], ‘<img /><p><br /><i><b><u><em><strong><strike><font><span><div>’);
}
$content = trim($content);
if (stripos($content_transfer_encoding, “quoted-printable”) !== false) {
$content = quoted_printable_decode($content);
}
将其替换为:
$subject = trim($subject);
$subject = iconv(“gb2312″,”UTF-8″,base64_decode($subject));
//如果为UTF8,上面的这条语句修改为 $subject = base64_decode($subject);
if ($content_type == ‘multipart/alternative’) {
$content = explode(‘–‘.$boundary, $content);
$content = $content[1];
$content = explode(”\r\n\r\n”, $content);
$content = strip_tags($content[1], ‘<img /><p><br /><i><b><u><em><strong><strike><font><span><div>’);
}
$content = str_replace(”\n”,””,$content);
$content = str_replace(”\r”,””,$content);
$content = trim($content);
$content = iconv(”gb2312″,”UTF-8″,base64_decode($content));
//如果为UTF8,上面的这条语句修改为 $content = base64_decode($content);
经过测试,修改之后的代码已经能够支持大部分中文邮件了,可以取到邮件的内容和标题,而且没有乱码,不过这里只是想起到一个抛砖引玉的作用,如果有其他的情况,可以根据自己的实际情况做些处理,如有错误之处,也请广大网友指出、批评,以达到共同学习的目的。