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

5 投票
4 回答
16339 浏览
提问于 2025-04-16 12:52

我有一个用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 个回答

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
to = email.utils.parseaddr(msg['cc'])

这个对我来说有效。

21

再来一步,使用 email.utils

email.utils.parseaddr(address)

这个函数可以解析一个地址,通常是像“收件人”或“抄送”这样的字段里的值。它会把这个地址拆分成真实姓名和电子邮件地址两部分。如果解析成功,它会返回一个包含这两部分信息的元组;如果解析失败,就会返回一个包含两个空字符串的元组 ('', '')。

注意:这个函数最初是参考了 rfc822,但现在已经不再使用了。

撰写回答