如何从 python 中的 RFC 2822 邮件标头中提取多个电子邮件地址?

Posted

技术标签:

【中文标题】如何从 python 中的 RFC 2822 邮件标头中提取多个电子邮件地址?【英文标题】:How do you extract multiple email addresses from an RFC 2822 mail header in python? 【发布时间】:2016-02-04 07:53:20 【问题描述】:

Python 的email 模块非常适合解析标头。但是,To: 标头可以有多个收件人,并且可能有多个 To: 标头。那么如何拆分每个电子邮件地址呢?我不能用逗号分开,因为可以引用逗号。有没有办法做到这一点?

演示代码:

msg="""To: user1@company1.com, "User Two" <user2@company2.com", "Three, User <user3@company3.com>                               
From: anotheruser@user.com                                                                                                      
Subject: This is a subject                                                                                                      

This is the message.                                                                                                            
"""

import email

msg822 = email.message_from_string(msg)
for to in msg822.get_all("To"):
    print("To:",to)

当前输出:

$ python x.py
To: user1@company1.com, "User Two" <user2@company2.com", "Three, User <user3@company3.com>
$ 

【问题讨论】:

你想要什么输出? 您可能应该使用shlex & Co.. MDA 用(不带引号的)逗号分隔地址行 相关:docs.python.org/2/library/… 【参考方案1】:

通过email.utils.getaddresses() 传递所有To 行:

msg="""To: user1@company1.com, John Doe <user2@example.com>, "Public, John Q." <user3@example.com>
From: anotheruser@user.com
Subject: This is a subject

This is the message.
"""

import email

msg822 = email.message_from_string(msg)
for to in email.utils.getaddresses(msg822.get_all("To", [])):
    print("To:",to)

请注意,我重写了您的 To 行。我相信您的示例不是有效格式。

参考:https://docs.python.org/3/library/email.utils.html#email.utils.getaddresses

【讨论】:

完美。我阅读了文档,但我找不到我想要的东西。谢谢! python 3 的链接:docs.python.org/3/library/… @Neara - 谢谢。已更新。

以上是关于如何从 python 中的 RFC 2822 邮件标头中提取多个电子邮件地址?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式根据 RFC2822 验证消息 ID

RFC 2822电子邮件验证

RFC 2822兼容(大部分)电子邮件地址正则表达式

在 Java 中解析 RFC 2822 电子邮件地址

电子邮件地址(RFC 2822)

将 Python 日期时间转换为 rfc 2822