- 29
- Jul
今天做LUPA社区分配下来的任务,要求从一大堆电子邮件中过滤出失效的邮件地址。
这个需要人为地根据邮件的内容判断,不过还是有不少邮件可以通过特定的标题或正文进行判断,比如一些邮件是未发送成功的退信,它们具备相同的特征。
然而问题是,除去这些邮件外,还有一些无规律的邮件,我们需要用Thunderbird一封封地打开并检查内容,才能知道结果。
看了下我用的邮件客户端,没有将所有邮件(eml文件格式)批量导入,并批量查看的功能。所以打算自己写一个简单的邮件查看器,忙忽了一会,终于实现了。
-----
图形部分就不多说了,那个TreeView,我在Ubuntu Tweak里已经写的麻木掉了。TextView也比较好用。
这个程序的重点在于解析eml电子邮件格式。众所周知,电子邮件的编码众多,造成了解码困难,乱码不断。我现在用的Evolution邮件客户端,就不能完美地解析GB2312编码的邮件标题(估计是Bug),请看下图:
邮件列表中的主题是正常的,到了信件预览那就是乱码了。估计Evolution使用了不同的机制来处理列表和预览的邮件内容,所以才乱码了。
这也变相说明了,电子邮件的编码处理之繁杂吧!
好在Python下有一个强大的email,可以方便地处理Email文件,当然编码还是要自己对付的。
网上找了个例子,马上尝试了下这个email库,发现只能解析unicode的邮件,中文邮件都变成???了。
因为有的邮件是unicode,有的是gbk,有的又是gb2312,要准确的判断,就要花很多时间去研究电子邮件的本质。怎样才能快速达到我要的目的呢。
于是想了个办法,第一次用email库解析出来的文本,尝试解码成gbk,再尝试解码成gb2312。因为我发现,本来就不是gb编码的文本,再解码成gb的话,会失败并抛出异常。既然如此,就从大往小依次解码,出错就pass,成功就保留,这样不管邮件是什么编码的,都能一次搞定了!
构思好以后,又写了不到两百行代码。终于实现这个“简易邮件查看器”了。
经过试用,顺利地解码了317封邮件,解码正确率100%(其中邮件编码有unicode,也有gbk和gb2312)。更复杂的条件暂时没加进去,如果还有big5的话,可能就不行了吧。
因为这个工具已经能完成工作任务了,所以先暂时这样了,以后若有需要,再稍加改进。
这个用户可真恶搞,到LUPA注册,居然用abc@163.com的邮件,结果163.com回了个邮箱挤爆的通知。哈哈!
源码可以去发芽网查看。可恶的WordPress,为啥总是把空格吞掉?
http://www.fayaa.com/code/view/222/


您好,Python 中可以用 chardet 模块来自动检测各种字符集。
import chardet
chardet.detect('字符串样本')
你用的编辑器是简单文本(源代码那种)编辑器吗?
如果是这样,可以尝试在代码高亮后点击“一键复制HTML"然后贴上来
如果是复杂的HTML编辑器,那就另说了
另,你把feedsky的链接放在整个页面的最后吧,否则每次加在页面最后总是在feedsky上卡一段时间。然后你的主题背景色会在这段时间保持灰色....
@lqs:真是谢谢你,原来Python还有这个库啊。
@半瓶墨水:有幸啊,发芽网的创始人来了。
我点了“一键复制HTML”,发芽网也弹出对话框说成功了,但是无论我是按Ctrl+V还是右键看粘贴,都没有内容。这是怎么回事呢?
说一下我的环境吧,Firefox 3.0+Ubuntu 8.04。
另外,好像有上过一个网站,说我的Firefox没打开JavaScript剪贴版支持。发芽网是不是没有判断过这个?
Feedsky好像进不去了,干脆去掉它得了!
邮箱提供商纷纷表示,退信对他们而言没有什么影响~~~~~~
@TualatriX
@半瓶墨水
因为安全策略,FireFox 默认是不允许 javascript 使用剪贴板的。
需要打开的话,可以 about:config 里边修改::
pref("capability.policy.default.Clipboard.cutcopy", "allAccess");
pref("capability.policy.default.Clipboard.paste", "allAccess");
@TualatriX
需要的话, Ubuntu 里可以用 python-gtkhtml2 来显示 html 邮件。
唔,目录选择对话框起始目录为当前目录,或上次目录可能比现在的 HOME 目录好些,
不要 dialog.set_current_folder(os.getenv("HOME"))