我有一组存储在E:/驱动器中的.msg文件,我必须阅读它并从中提取一些信息。为此我在Python 3.6中使用以下代码
from email.parser import Parser
p = Parser()
headers = p.parse(open('E:/Ratan/msg_files/Test1.msg', encoding='Latin-1'))
print('To: %s' % headers['To'])
print('From: %s' % headers['From'])
print('Subject: %s' % headers['subject'])
在输出中我得到如下。
To: None
From: None
Subject: None
我没有在To,FROM和subject字段中获得实际值。
有没有想过为什么不打印实际值?
请从此链接下载我的示例msg文件: drive.google.com/file/d/1pwWWG3BgsMKwRr0WmP8GqzG3WX4GmEy6/vi EW
答案 0 :(得分:-1)
以下是如何使用python的一些标准电子邮件库的演示。
您没有在问题中向我们展示您的输入文件,并且g-drive网址是一个死链接。
下面的代码看起来和你的一样,并且运行正常,所以我不知道你的环境有什么奇怪的,模拟一些Windows'rb'二进制打开废话,CRLF或Latin1编码。
我投入.upper()
但除了表明API不区分大小写之外什么也没做。
#! /usr/bin/env python3
from email.parser import Parser
from pathlib import Path
import mailbox
def extract_messages(maildir, mbox_file, k=2, verbose=False):
for n, message in enumerate(mailbox.mbox(mbox_file)):
with open(maildir / f'{n}.txt', 'w') as fout:
fout.write(str(message))
hdrs = 'From Date Subject In-Reply-To References Message-ID'.split()
p = Parser()
for i in range(min(k, n)):
with open(maildir / f'{i}.txt') as fin:
msg = p.parse(fin)
print([len(msg[hdr.upper()] or '')
for hdr in hdrs])
for k, v in msg.items():
print(k, v)
print('')
if verbose:
print(msg.get_payload())
if __name__ == '__main__':
# from https://mail.python.org/pipermail/python-dev/
maildir = Path('/tmp/py-dev/')
extract_messages(maildir, maildir / '2018-January.txt')