解析电子邮件字段

3

我希望从To:邮件字段中解析出电子邮件地址。

实际上,在循环处理mbox中的电子邮件时:

mbox = mailbox.mbox('test.mbox')
for m in mbox:
  print m['To']

我们可以获得以下内容:

我们可以获得这些东西:

info@test.org, Blahblah <blah@test.com>, <another@blah.org>, "Hey" <last@one.com>

这应该被解析为:

[{email: "info@test.org", name: ""}, 
 {email: "blah@test.com", name: "Blahblah"},
 {email: "another@blah.org", name: ""},
 {email: "last@one.com", name: "Hey"}]

是否有已经内置的东西(在mailbox或其他模块中)来实现这个功能,还是没有?

我读了几遍这篇文档,但没有发现相关的内容。

4个回答

5
您可以使用 email.utils.getaddresses() 来实现此功能:
>>> getaddresses(['info@test.org, Blahblah <blah@test.com>, <another@blah.org>, "Hey" <last@one.com>'])
[('', 'info@test.org'), ('Blahblah', 'blah@test.com'), ('', 'another@blah.org'), ('Hey', 'last@one.com')]

(请注意,该函数期望一个列表,因此您需要在[...]中括起字符串。)

1
正如@TheSpooniest指出的那样,email有一个解析器:
import email

s = 'info@test.org, Blahblah <blah@test.com>, <another@blah.org>, "Hey" <last@one.com>'

for em in s.split(','):
    print email.utils.parseaddr(em) 

给出:
('', 'info@test.org')
('Blahblah', 'blah@test.com')
('', 'another@blah.org')
('Hey', 'last@one.com')

1
当名称或电子邮件中包含逗号时,这不起作用:"Example, John" <foo,bar@example.com> - Boldewyn

1

email.parser有你需要的模块。因为解析器将使用此结构返回消息,所以email.message仍然相关,因此您将从中获取标题数据。但是要实际读取文件,email.parser是正确的选择。


email.parser 如何解析 To 头部的内容? - user1907906

0

Python提供了email.Header.decode_header()用于解码头文件。该函数解码每个原子并返回一个元组列表(文本,编码),您仍然需要解码和连接以获取完整的文本。

对于地址,Python提供了email.utils.getaddresses()将地址拆分成元组列表(显示名称,地址)。显示名称也需要解码,并且地址必须匹配RFC2822语法。 函数getmailaddresses()完成所有工作。

这里有一个教程可能会有所帮助http://blog.magiksys.net/parsing-email-using-python-header


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