使用emaildata 0.3.4在Python 3.6中阅读.eml文件

10

我正在使用 Python 3.6.1 版本,想要读取邮件文件(.eml)进行处理。我正在使用 emaildata 0.3.4 包,但是每当我像文档中那样导入 Text 类时,都会出现模块错误:

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

当我尝试使用这个更新进行更正时,我遇到了与mimetools相关的下一个错误。

>>> ModuleNotFoundError: No module named 'mimetools'

我能否使用emaildata 0.3.4和Python 3.6解析.eml文件?或者是否有其他包可以用来解析.eml文件?谢谢。


2
emaildata 模块已经超过2年没有更新了。它不兼容 Python 3。考虑使用标准库中的 [email] 包。 - Dima Chubarov
谢谢@ Dmitri,为了完备起见,我将在此处包含使用电子邮件包的答案。 - PyRsquared
1个回答

18

使用email包,我们可以读取.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) 

1
添加了一个循环遍历文件名的编辑,我猜这是你想要添加的(随意回滚编辑)。 - PatrickT
有没有一种方法只提取发件人地址? - Amey P Naik
如何查找元数据信息(发件人、抄送、主题等),并检查是否存在任何附件? - DGS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接