我正在使用此代码:
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
它返回一堆额外的信息时,我怎么能解析一下额外的信息,只得到From和正文?
答案 0 :(得分:16)
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有一个在这里应该有效的参数列表。
答案 1 :(得分:5)
from imap_tools import MailBox, Q
with MailBox('imap.mail.com').login('test@mail.com', 'password', 'INBOX') as mailbox:
for msg in mailbox.fetch(Q(all=True)):
sender = msg.from_
body = msg.text or msg.html