【问题标题】:Open Outlook .msg like a text file in Python?像 Python 中的文本文件一样打开 Outlook .msg?
【发布时间】:2018-12-13 00:05:55
【问题描述】:

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

所以我认为导入类似 SO 线程中建议的 win32 库会有点过头了。

相反,我尝试以与 .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

【问题讨论】:

  • 试试mail = open(file_path, encoding='utf-8'),而不是utf
  • 谢谢,这是我试过的,只是我在问题中的错误,现在更新。
  • 然后,试试mail = open(file_path, encoding='Latin-1')。错误可能会消失,但请确保输出是您想要的。
  • 非常感谢,这成功了!您要发布答案吗?

标签: python email encoding


【解决方案1】:

除非你愿意做很多工作,否则你真的应该为此使用库。

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

此外,.msg 文件可以在文件的不同部分/块中包含纯 ascii 和/或 unicode,因此很难将其视为一个字符串来搜索子字符串。

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

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

【讨论】:

    【解决方案2】:

    当您遇到此类问题时,最好尝试 Python Latin-1 编码。

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

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

    更多信息请参见this

    【讨论】:

      猜你喜欢
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      • 2015-09-03
      • 1970-01-01
      • 2013-10-23
      • 1970-01-01
      相关资源
      最近更新 更多