May 25, 2007
使用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 能不能获取到这篇文章!
您喜欢本文吗?即刻订阅"偶爱偶家",精彩文章不再错过!现在就给我们留个话吗?


27 responses to "wordpress电子邮件发布日志"
用了不少时间啊,我今晚改新模版到中文,添加一些侧边栏,再去通过w3c的验证,也折腾到现在,我才是真的笨~
[Reply]
怎么弄得啊?
[Reply]
唉, 发现折腾了半天, live spaces用dj emailpublish还是发不上去, 又不知道live spaces是如何做的, 只能靠用邮件和 dj emailpublish来对比测试了, 今天晚上继续努力, 争取明天之前搞定这个问题。 对wordpress建立的博客算是搞定了。 可以看这篇文章看效果:
http://2i2j.yo2.cn/articles/118965.html
[Reply]
我写了那么多,又提交失败~
去看了,yo2会不会人工干预只发标题呢,搞定live spaces吧,那里没人管,嘿嘿。
我的永久链接再也不变了,和你的有点象,我没有加ID进去,不想用分类参数的,可是日期的总是有些问题,比如被重定向什么的,最后用了两个重定向插件,顺利的换成了新的形式,
[Reply]
终于搞定live spaces 的邮件发布问题了, 果然够变态的一个判断模式, 晚上回去把东西改一改就ok了。
[Reply]
嗯~
相信我,能這麼弄的人不笨 ^_^
只是我不懂的是,如果預設是用 UTF-8 的
wordpress 不用轉 &#xxx; 才對啊,一般會用
到 &#xxx; 是要在 big5 或 gb2312 的網頁下
秀 utf8 字元時,才需這麼轉啊?
還是您要 utf-8 blog 發布文章到 gb2312 blog?
我是假設都是 utf-8 blogs.
如果您改好了,請 email 乙份給我參考吧,
感恩 ^_^
[Reply]
嗯, 你说对了, utf-8的模式下不需要换成&#xxxx的编码的, 我是被这个base64或者quoted-printable这个编码给搞的糊涂了, 但转成&#xxxx的编码的话, 那就可以在quoted-printable这样的编码下应用自如了. 今天我已经把插件改成了另外一种模式, 这样的话, 就不需要转成&#xxxx编码了.
但如果我这些都不做的话, 的确是有问题的, 你的插件无法直接用于wordpress上, 你在插件中进行base64的编码了, 但wordpress 的 wp-mail.php中却是不进行解码的, 所以都是乱码.
我修改之后就是把你base64编码去掉了, 采用不编码的字符直接发送就可以了. 只不过在邮箱内部看起来是乱码的.
[Reply]
感謝您提的問題,我已改版為 1.5 版了,就您的問題,在 Email Encoding 設成 ‘none’,其他設成 base64 即可。
[Reply]
谢谢, 已经看到了, 我直接用原来的那个, 不使用wp_mail()也可以了
[Reply]
你一直用的离线客户端发布日志的?
那tag的问题你是怎么解决的啊?
还有那个永久链接中缩略名的问题你说是修改了post.php,可以说下怎么修改的吗?
嘿嘿,还有,留言本和友情链接页面是怎么做的。我最近想玩玩WP。。很多问题。
[Reply]
是的, 我一直采用wlw进行离线发布日志, tags的问题采用utw插件, 可以在文章用以[tags][/tags]的格式包含tags的, 直接写入文章即可.
永久链接我是修改了post.php, 不过新版的wlw2已经可以直接输入缩略名了. 我的修改的post.php稍后我会发到你的邮箱. 你可以看看.
留言板和友情链接就是两个page, 但我建了两个page的模板, 一并发给你, 你可以参考然后建立与你主题相对应的page模板.
[Reply]
谢谢你的解答,你的邮件我已经收到了。
新版的wlw可以直接输入缩略名?
我这里的wlw版本号为1.0(12.0.1193.524)
请问这个版本可以直接输入缩略名吗?在哪里输入?
我装了utw插件,但是一直不知道可以直接在文章中以[tags][/tags]的格式包含tags。
缩略名的问题我搜索到一种方法是修改xml-rpc.php
你的archives是用的什么插件啊?
[Reply]
是这个wlw的版本, 就在下面的数据域中, 数据域就是缩略名. 不过是需要wp2.2版本才能使用的. wp2.1.x没有这个数据域
缩略名的那个修改xml-rpc.php的也是可以的, 只不过修改post.php更加彻底一点, 把后台发布日志也修改掉了. 甚至连email发布日志也修改了.
archive用的是Extended Live Archives插件!
如果你是utw的最新版本, 要离线发布日志带tags, 还是需要修改一个地方的.在这里
http://blog.2i2j.com/being-humble-opinion/new-utw-lose-tags-from-wlw.html
[Reply]
直接在文章以[tags][/tags]的格式没有成功添加tag。
我也打开了UTW的内嵌标签,但是仍然不成功。
[Reply]
郁闷了。
我用的是wp2.2
但是tag和缩略名都发布不了,按照你的修改之后,也还是发布不了。。
update:缩略名的问题解决了,是我修改了xml-rpc.php的问题,换回原版的就OK了。
但是tag仍然不行。。
[Reply]
tags无法发布是不是你在utw中没有设置过? 需要在后台的utw中设置成embedded tags 打勾就可以了.
[Reply]
设置过了,但是还是不行。。
[Reply]
你试试wp后台发文的时候采用[tags][/tags]这样的格式能不能发布tags?
[Reply]
郁闷,后台也不可以。。
按照你说的那个方法修改之后,在后台发文包含进去也不行。换回原版的,再在后台发文包含[tags][/tags]就可以发布tag
update:找到问题所在了,是我疏忽,少注释了一句“return $postID;”
[Reply]
想请教下如何在WLW里设置数据域以达到不用进后台就能写好缩略名的方法.
我用的也是yo2的博客,如果方便的话烦请发到邮箱里,谢谢
[Reply]
唉!我遇到的问题是,邮件无法发日志。
在WP后台填写的东西都正确的,对应的Gmail也开启了POP收发功能。
[Reply]
具体怎么解决邮箱发文章全是乱码的问题啊?
[Reply]
具体怎么解决邮箱发文章全是乱码的问题啊
[Reply]
http://www.6inchboot.com/
UGG boots;cheap UGG;UGG classic
[Reply]
这个试过,没成功。还是要再试下
[Reply]
測試的結果失敗….
[Reply]
[...] 原文:http://blog.2i2j.com/being-humble-opinion/post-article-with-email-in-wordpress.html 分类: 博客技术 收藏和分享到: 标签: Wordpress, wordpress使用邮件发布日志, wordpress邮件发布日志, 电子邮件发布日志 相关文章给 Wordpress 开启 Gzip 功能 (3)WordPress Smiles 图标打包下载 (0)Wordpress插件WP-PostViews使用说明 (1) $(document).ready(function () { $(’.lava’).css({left:$(’span.item:first’).position()['left']}); $(’.item’).mouseover(function () { $(’.lava’).stop().animate({left:$(this).position()['left']}, {duration:200}); $(’.panel’).stop().animate({left:$(this).position()['left'] * (-4)}, {duration:200}); }); }); 最新文章 热门文章 最多评论 随便看看 [...]