如何用邮件发wordpress中文博客

最近因为工作的关系,需要用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);

经过测试,修改之后的代码已经能够支持大部分中文邮件了,可以取到邮件的内容和标题,而且没有乱码,不过这里只是想起到一个抛砖引玉的作用,如果有其他的情况,可以根据自己的实际情况做些处理,如有错误之处,也请广大网友指出、批评,以达到共同学习的目的。

Author: 我说吧

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注