【问题标题】:Reading .eml files with Python 3.6 using emaildata 0.3.4使用 emaildata 0.3.4 使用 Python 3.6 读取 .eml 文件
【发布时间】:2018-01-22 13:49:56
【问题描述】:

我正在使用 python 3.6.1,我想读入电子邮件文件 (.eml) 进行处理。我正在使用 emaildata 0.3.4 包,但是每当我尝试按照文档中的方式导入 Text 类时,都会收到模块错误:

import email
from email.text import Text
>>> ModuleNotFoundError: No module named 'cStringIO'

当我尝试使用 this update 进行更正时,我收到与 mimetools 相关的下一个错误

>>> ModuleNotFoundError: No module named 'mimetools'

是否可以使用 emaildata 0.3.4 和 python 3.6 来解析 .eml 文件?或者还有其他我可以用来解析 .eml 文件的包吗?谢谢

【问题讨论】:

  • emaildata 模块已超过 2 年未更新。它与 python 3 不兼容。考虑使用标准库中的email 包。
  • 谢谢@Dmitri,为了完整起见,我将在此处使用电子邮件包提供答案。

标签: python parsing nlp eml


【解决方案1】:

使用电子邮件包,我们可以读取 .eml 文件。然后,使用BytesParser 库来解析文件。最后,通过get_body() 方法和get_content() 方法使用plain 首选项(用于纯文本)来获取电子邮件的原始文本。

import email
from email import policy
from email.parser import BytesParser
import glob
file_list = glob.glob('*.eml') # returns list of files
with open(file_list[2], 'rb') as fp:  # select a specific email file from the list
    msg = BytesParser(policy=policy.default).parse(fp)
text = msg.get_body(preferencelist=('plain')).get_content()
print(text)  # print the email content
>>> "Hi,
>>> This is an email
>>> Regards,
>>> Mister. E"

当然,这是一个简化的示例 - 没有提及 HTML 或附件。但它基本上完成了问题的要求和我想做的事情。

以下是您如何遍历多封电子邮件并将每封电子邮件另存为纯文本文件:

file_list = glob.glob('*.eml') # returns list of files
for file in file_list:
    with open(file, 'rb') as fp:
        msg = BytesParser(policy=policy.default).parse(fp)
        fnm = os.path.splitext(file)[0] + '.txt'
        txt = msg.get_body(preferencelist=('plain')).get_content()
        with open(fnm, 'w') as f:
            print('Filename:', txt, file = f) 

【讨论】:

  • 添加了一个带有循环文件名的编辑,我猜你打算添加它(随意回滚编辑)。
  • 有没有办法只提取发件人地址?
  • 如何查找元数据信息(来自、发件人、抄送、主题等)并检查是否存在任何附件?
猜你喜欢
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
  • 2015-04-19
  • 2018-04-26
  • 2015-10-02
  • 2012-01-19
  • 2013-01-25
相关资源
最近更新 更多