如何获取IMAP邮件的发件人姓名和正文内容?

12

我正在使用这段代码:

import imaplib
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login(myusername, mypassword)
mail.list()
# Out: list of "folders" aka labels in gmail.
mail.select("inbox") # connect to inbox.

result, data = mail.search(None, "ALL")

ids = data[0] # data is a list.
id_list = ids.split() # ids is a space separated string
latest_email_id = id_list[-1] # get the latest

result, data = mail.fetch(latest_email_id, "(RFC822)") # fetch the email body (RFC822) for the given ID

raw_email = data[0][1] # here's the body, which is raw text of the whole email
# including headers and alternate payloads

print raw_email

除了一个问题以外,它可以正常工作。当我打印raw_email时,会返回大量额外的信息。我该如何处理这些额外的信息并仅获取发件人和正文文本?

3个回答

25

Python的email包可能是一个不错的起点。

import email
msg = email.message_from_string(raw_email)

print msg['From']
print msg.get_payload(decode=True)

那应该就能满足你的需求了,但当一封电子邮件有多个部分时(附件、正文的文本和HTML版本等),情况会变得更加复杂。

在这种情况下,msg.is_multipart() 将返回 True,而 msg.get_payload() 将返回一个列表而不是字符串。在email.message 文档中有更多信息。

或者,你可以直接向 IMAP 服务器请求所需的信息,而不是解析原始的 RFC822 格式的消息——如果邮件包含附件,则可能非常大。只需将您的 mail.fetch 行更改为:

mail.fetch(latest_email_id, "(BODY[HEADER.FIELDS (FROM)])")

只需请求(并返回)电子邮件中的From行,就可以从服务器获取它。同样将第二个参数设置为"(UID BODY[TEXT])"将返回电子邮件正文。 RFC2060列出了此处应有效的参数列表。


12

IMAP高级库:https://github.com/ikvk/imap_tools(我是作者)

from imap_tools import MailBox, A
with MailBox('imap.mail.com').login('test@mail.com', 'password', 'INBOX') as mailbox:
    for msg in mailbox.fetch(A(all=True)):
        sender = msg.from_
        body = msg.text or msg.html

1
非常感谢!imaplib和Python的email包的API让我疯了,这个好多了! - xjcl
@xjcl,享受=D - Vladimir
如果您正在宣传自己的代码,您需要明确说明。请查看我们的推广政策 - tripleee
2
真的很酷的库。 - Blue_Alien

2

另外,你也可以使用Red Box(我是作者):

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(all=True):

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

以下是文档中相关链接: 安装方法:
pip install redbox

链接:


(注:此内容为HTML格式,已保留标签)

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