再次对Outlook无语

之前泡cn.*的时候,新闻组上的很多朋友非常讨厌微软的邮件客户端,因为他们常常不遵守规范不在Header中标明编码,结果导致标题或正文经常是乱码,只能挨个的根据常用编码去人工猜。而MS觉得这不是问题,你在中文windows下写的邮件,当然应该在中文windows下才能正确浏览啊,如果大家都是同样的操作系统同样的语言区域设置,那自然就没乱码了。可是即便是这个理由,也有些牵强。因为Outlook、Outlook Express、Live Mail这些他自己的产品之间的兼容性就做的很差。

我昨天收到两封很重要的邮件,里面的附件很重要,但是我没留意。因为文件名是winmail.dat,我以为是邮件签名或者个人名片或者其它类似的东西呢,反正是不认识的格式,所以就没留意。后来才知道,这是必须用Outlook才能打开的附件。OE啊、web用户啊、雷鸟啊,统统被秒杀。

从这篇KB(http://support.microsoft.com/kb/290809/en-us/)的语气来看,估计微软自己的人也觉得这个玩意儿很脑残。比如:"The path to your personal folders (.pst) file and your log on name are embedded in the Winmail.dat file. Although this data is not explicitly exposed to the recipient, if the recipient opens the Winmail.dat file for editing in a binary or text editor, they can see the path and log on name."

还有更搞笑的:”Outlook Express does not understand TNEF, but it does know to ignore TNEF information. The result is a plain text message.”

winmail.dat是一个TNEF格式的二进制文件。我从网上http://www.kopf.com.br/winmail/下载了一个读取器,但是很不好使,没能正确的识别出来。

然后只好去查MSDN。

TNEF开头是32位的signature(0x223e9f78),以标明这是TNEF。实际存的时候需要根据BE/LE调整下字节序。然后2个字节是key,然后是一个大大的Object。这个key用来唯一标识这个Object。

TNEF_SIGNATURE    Key    Object   

其中Object的格式是:

Message_Seq

Message_Seq

Attach_Seq

Attach_Seq

Message_Seq的开头是一个字节的0x01,而Attach_Seq的开头是一个字节的0x02。从Attach_Seq中读出类型为attAttachTitle(0x00018010)的属性的值,就是附件的文件名。然后读出attAttachMetaFile(0x00068011)的属性的值,就是文件的二进制内容,就得到这个文件了。搞明白之后写一段代码,就很容易从winmail.dat中提取出原来的附件了。不过我是用wireshark手动提取出来的。

前面那个KB中说的"your log on name ”我猜是attOwner,但是我在这个winmail.dat中没有找到。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥