Python 3.8.10中email.utils.parseaddr解析邮件头地址异常
问题分析与解决
你遇到的问题是因为email.utils.parseaddr()遵循RFC邮件格式规范,显示名中包含逗号时必须用双引号包裹,否则会把逗号识别为多个地址的分隔符,导致解析错误。
为什么会出错?
在你的测试用例里:
testHdr = "LastName, FirstName <FirstName.LastName@domain.com>"
parseaddr()会把逗号前的LastName当成第一个无邮箱地址的显示名,直接返回('', 'LastName'),剩下的部分被当作另一个地址但被忽略了——因为parseaddr()只返回解析到的第一个地址。
解决方案
有两种处理方式:
1. 修正邮件头格式(符合RFC规范)
把包含逗号的显示名用双引号包裹,这样parseaddr()就能正常解析:
import email.utils testHdr = "\"LastName, FirstName\" <FirstName.LastName@domain.com>" print(email.utils.parseaddr(testHdr)) # 输出 ('LastName, FirstName', 'FirstName.LastName@domain.com')
2. 使用更健壮的getaddresses() API
如果无法修改输入的邮件头格式,改用email.utils.getaddresses(),它能处理逗号分隔的地址列表,即使显示名未加引号也能正确解析:
import email.utils testHdr = "LastName, FirstName <FirstName.LastName@domain.com>" # getaddresses接收地址列表(这里把单个字符串放列表里),返回所有解析到的地址元组 address_list = email.utils.getaddresses([testHdr]) print(address_list[0]) # 输出 ('LastName, FirstName', 'FirstName.LastName@domain.com')
总结
不是你用法错误,而是输入的邮件头格式不符合RFC规范,或者你可以选择更适合处理这类场景的getaddresses() API。
内容的提问来源于stack exchange,提问作者dawydiuk
相关产品推荐
相关产品推荐

