像Python中的文本文件一样打开Outlook .msg吗?

时间:2018-07-04 14:00:59

标签: python email encoding

我想将Outlook .msg文件视为字符串,并检查其中是否存在子字符串。

因此,我认为导入win32库(在类似的SO线程中建议这样做)会过分杀人。

相反,我试图以与.txt文件相同的方式打开文件:

file_path= 'O:\\MAP\\177926 Delete comiitted position.msg'

mail = open(file_path)
mail_contents = mail.read()
print(mail_contents)

但是我知道

UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 870: character maps to <undefined>

我可以指定要使其工作的任何解码方式吗?

我也尝试过

mail = open(file_path, encoding='utf-8')

返回

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd0 in position 0: invalid continuation byte

2 个答案:

答案 0 :(得分:1)

除非您愿意做很多工作,否则您确实应该为此使用一个库。

首先,.msg文件是二进制文件,因此不应将内容作为字符串读取。字符串通常以null byte结尾,二进制文件中可能包含很多字符串,这可能意味着您没有查看所有数据(可能取决于实现)。

另外,.msg文件在文件的不同部分/块中可以具有普通的ascii和/或unicode,因此将其视为一个字符串来搜索子字符串真的很困难。

作为一种替代方法,您可以将邮件另存为.eml(即电子邮件的纯文本版本),但是仍然需要克服一些问题才能搜索特定的文本:

  • e-mail中的所有数据均为低位ASCII(1-127),这意味着必须将特殊字符编码为低位ASCII字节。标头(例如“主题”),正文,附件有几种不同的编码。
  • 正文:可以是纯文本或hml(或两者)。行和单词可以分割,因为有最大的行长。甚至可以使用base64使用不同的编码,在这些编码中您永远找不到想要的文本。
  • 要正确解码所有内容,还需要做更多的工作,但这应该可以使您了解要查找所需文本的工作。

答案 1 :(得分:0)

当您遇到此类问题时,尝试使用Python Latin-1编码是不错的选择。

mail = open(file_path, encoding='Latin-1')

我们经常将Windows cp1252与实际的Python Latin-1混淆。实际上,后者将所有可能的字节值映射到前256个Unicode代码点。

有关更多信息,请参见this