wordpress电子邮件发布日志
wordpress电子邮件发布日志
使用wordpress建立博客不少时间了, 大概有8个月之余了吧, 一直采用离线编辑器发文的方式发布博客日志, 但一直听说可以使用电子邮件(email)来发布日志, 心中一直想一试, 但恨于自己一直没有行动, 一直拖到这几天。
昨天没有发布日志, 是因为一直在搞这个email发布博客日记的问题, 别看是一个小小的电子邮件发布博客, 但也折腾了N长的时间, 算来也有整整一天了。 到今天, 确切的说到目前(就现在)算是真正搞定了这个email发文, 同时给自己的博客安装了一个插件 ― " DJ EmailPublish ", 这个应该是国人开发的, 他的博客在这里: " 阿亮遇�熊 "。 我利用这个插件把我这里发布的日志同时发布到我的live spaces, 大家见这里: http://sdeccn.spaces.live.com/, 这个插件还可以发布到另外的wordpress站点, 比如Blogger。 我测试就用了这里: http://2i2j.yo2.cn/
不过在搞定整个email发文过程中, 真的是费了我不少的力气和时间 ― 不过这也主要是由于我比较笨导致的:), 显示发现email发出去的文章, http://2i2j.yo2.cn/ 能够收到, 但只有标题没有正文, 奇怪ing。 没办法, 只能看wordpress的wp-mail.php, 发现wordpress对email发布日志的限制很严格, 用了一堆的限制条件, 导致我测试的文章都没有出现正文, 调整我发布日志的方式, 总算最后能弄出个正文来, 心里那个爽啊。 这下我本来就准备写文发布我的成果了。 慢, 我又测试了一个中文日志, 天哪! 都是乱码, 没有办法下眼睛啊。 得了, 论文暂停吧。 这为了解决这个乱码的问题, 又花费了我今天一个晚上。
好了, 现在我来说说我用电子邮件(email)发文所碰到的问题和解决方案, 注意: 该问题是在wordpress 2.1.3 中测试, 解决方案也针对该版本的wordpress。
问题1: 只有标题, 没有正文
该问题是这段代码惹的祸, 在wp-mail.php中有这么一段:
if ($content_type == 'multipart/alternative') {
$content = explode('�'.$boundary, $content);
$content = $content[2];
echo $content;
$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>');
}这段代码就是用来获取正文的, 可是wordpress的开发者估计只测试很少的一部分发文邮件, 可能也没有把邮件发文当作重点, 没有对其做更多的种类区分。
这里首先判断发文邮件的编码, 如果是 'multipart/alternative' , 就执行if{}中的内容, 一般性的邮件我看了都差不多是这样的格式 'multipart/alternative', 所以大部分的email发布日志都会到这个if中走一遭的, 也就因为走了一遭, 把正文内容走没了。 请看这里:
$content = explode('�'.$boundary, $content);
$content = $content[2];这两句语句, 可能会导致 $content 是空的, 它这里用了 $content = $content[2]; 一般的邮件如果不用两种格式发email的话, 就不太可能出现两个 boundary, 从而就会导致 $content[2] 是没有的, 这样正文也就没有了。 好了, 这个解决方案就是让你的电子邮件工具发email时采用两种模式:"纯文本和HTML"同时发出email, 这个可以在电子邮件客户端中可以设置的,这样就可以在这里取得$content[2]是HTML编码的emial内容了, 也就达到了目的。
不要以为过了这一关就万事大吉了, 不行, 下面还有一个陷阱。 请看这里:
$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-Transfer-Encoding: quoted-printable' 打断前后内容本来是一个好想法, 这样可以输出内容而不输出编码一类的信息了。 不过就是这个 'quoted-printable' 惹的祸, 有很多的邮件根本不用这个编码, 比如outlook我没有找到, outlook采用了base64的编码, 这样这里就检测不到, 这个时候 $content[1] 就是空的, 也就是用empty就可以检测到的, 不过这里没有检测, empty的也就用上去了, 自然你的正文也就不会有了。 所以解决方案是你要设置电子邮件客户端使用 'quoted-printable' 来发文
这个问题有的时候不会发生, 比如说你的 'Content-Transfer-Encoding' 不是 'multipart/alternative' 的时候就不会了, 就我所知, thunderbird 光使用HTML编码发送的时候就不会是 'multipart/alternative' 了, 而是 'text/html' , 这样就可以绕过这个if语句而不会出现没有正文了, 不过你可能会看到有编码等垃圾信息出现在你的post article的正文中了, 这个时候, 根据wp-mail.php 的设定, 你可以在正文开始前先写入这么一个符号 "::", 它就会帮你去掉这些垃圾信息而输出正文了!
第一个问题就这样算是解决了, 可第二个问题就麻烦了。
问题2: 发布的中文日志全部都是乱码
解决了第一个问题之后, 发现我可以发布英文的日志了, 完全ok, 可是当测试中文日志的时候, 意想不到的事情又发生了, 竟然发出去的文章都是乱码, 那怎么看啊, 总不至于叫我每天都用email写英文吧? 可解决方案在那里呢? 不幸的是, 我没有找到确切的解决方案, 这里有一个修改wp-mail.php的方案, 我就不转载了, 因为我觉得没有什么意义, 我要发布的文章不是在自己的服务器上, 没有权利去修改的, 有兴趣的自己看看去: " 用wordpress随时随地写blog "。
我想到了一个办法就是把汉字变成编码 "&#xxxx;" 的形式, 这样就可以在任何网页下显示了, 也就解决了乱码的问题, 可是通过email发这样不现实, 怎么转换成编码呢? 不过幸好我是不需要直接用客户端写日志的, 我是通过" DJ EmailPublish "把我写的日志再发送到别的博客上去而已, 所以我只需要修改 " DJ EmailPublish "就可以了, 不过说要修改 " DJ EmailPublish "把好好的一个汉字拆成 "&#xxxx;" 的编码也不容易, 我最后只能从alinks中找了一段代码, 是将%uxxxx的编码转换成&#xxxx的编码, 可在alinks中将utf-8字符转换成%uxxxx的函数用的是javascript中的escape(), 这样我就不行了, 幸好我又找到了一段可以将utf8字符转换成%uxxxx的php代码,用来替代javascript中的escape()函数, 解决了该问题。
至此完成了我最初想达到的目的, 从这件事情上来看wordpress今后要走的路有很重要的一点是在字符处理上的国际化, 这样就再也不用这么麻烦了!
这篇文章可以用来测试结果, 如果大家有兴趣不妨去这里看看: http://2i2j.yo2.cn/, 不过别急, 这个地方我要到明天早上才发出去, 我要先看看 Live Spaces 能不能获取到这篇文章!
Tags: dj-emailpublish, email, plugins, wordpress, 乱码, 发布日志, 插件, 电子邮件, 解决方案
没有评论:
发表评论