使用Python IMAP获取发件人电子邮件地址

5
我有一份 Python IMAP 脚本,但我的问题是每次我想要获取发件人的电子邮件地址 (From) 时,我总是得到发件人的名字和他们的电子邮件地址:

例如:

Souleiman Benhida <souleb@gmail.com>

如何仅提取电子邮件地址(souleb@gmail.com)?
我以前在PHP中做过这件事:
    $headerinfo = imap_headerinfo($connection, $count)
    or die("Couldn't get header for message " . $count . " : " . imap_last_error());
$from = $headerinfo->fromaddress;

但是,在Python中我只能获取带有地址的全名,如何仅获取地址?我目前使用的是这个:
    typ, data = M.fetch(num, '(RFC822)')
mail = email.message_from_string(data[0][1])
headers = HeaderParser().parsestr(data[0][1]) 
message = parse_message(mail)  #body
org = headers['From']

谢谢!

4个回答

21

只要再进行一步,使用email.utils

email.utils.parseaddr(address)

将地址解析为其组成部分的真实名称和电子邮件地址部分 - 该地址应为某些包含地址字段(例如 To 或 Cc)的值。除非解析失败,否则返回该信息的元组。在解析失败的情况下,将返回一个('','')的二元组。

注意:原先引用了已经不建议使用的rfc822


1
+1 你可能还想提到自2.3版本以来rfc822已被弃用,而parseaddr的新家是email.utils.parseaddr。 - Jarret Hardie
@Soule:是的。这里是Python 2.6文档中关于email.utils.parseaddr的内容(http://docs.python.org/release/2.6/library/email.util.html#email.utils.parseaddr)。 - dkarp

0

我的外部库https://github.com/ikvk/imap_tools可以让您处理邮件而不必阅读IMAP规范。

from imap_tools import MailBox, A

# get all emails from INBOX folder
with MailBox('imap.mail.com').login('test@mail.com', 'pwd', 'INBOX') as mailbox:
    for msg in mailbox.fetch(A(all=True)):
        print(msg.date, msg.from_, msg.to, len(msg.text or msg.html))

msg.from_,msg.to-已解析的地址,例如:'Sender@ya.ru'


0

我不喜欢现有的解决方案,所以我决定为我的电子邮件发送器创建一个姊妹库,名为Red Box

以下是搜索和处理电子邮件的方法,包括获取from地址:

from redbox import EmailBox

# Create email box instance
box = EmailBox(
    host="imap.example.com", 
    port=993,
    username="me@example.com",
    password="<PASSWORD>"
)

# Select an email folder
inbox = box["INBOX"]

# Search and process messages
for msg in inbox.search(unseen=True):

    # Process the message
    print(msg.from_)
    print(msg.to)
    print(msg.subject)
    print(msg.text_body)
    print(msg.html_body)

    # Flag the email as read/seen
    msg.read()

我也为它编写了广泛的文档。它还有查询语言,完全支持嵌套逻辑操作。


0
to = email.utils.parseaddr(msg['cc'])

这对我有效。


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