如何使用python接收邮件

如何使用python接收邮件,python,email,Python,Email,我想用python接收电子邮件。到目前为止,我已经能够得到的主题,但不是身体。以下是我一直使用的代码: import poplib from email import parser pop_conn = poplib.POP3_SSL('pop.gmail.com') pop_conn.user('myusername') pop_conn.pass_('mypassword') #Get messages from server: messages = [pop_conn.retr(i) fo

我想用python接收电子邮件。到目前为止,我已经能够得到的主题,但不是身体。以下是我一直使用的代码:

import poplib
from email import parser
pop_conn = poplib.POP3_SSL('pop.gmail.com')
pop_conn.user('myusername')
pop_conn.pass_('mypassword')
#Get messages from server:
messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)]
# Concat message pieces:
messages = ["\n".join(mssg[1]) for mssg in messages]
#Parse message intom an email object:
messages = [parser.Parser().parsestr(mssg) for mssg in messages]
for message in messages:
    print message['subject']
    print message['body']
pop_conn.quit()
我的问题是,当我运行这段代码时,它会正确地返回主题,而不是主体。因此,如果我发送一封主题为“Tester”的邮件,邮件主体为“thisatestmessage”,它在空闲状态下看起来是这样的

>>>>Tester >>>>None

因此,它似乎准确地评估了主体,而不是主体,我认为它在解析方法中,对吗?问题是我对这些库的了解不够,无法弄清楚如何更改它,使其同时返回主题和正文。

电子邮件解析器返回
email.message.message
对象,该对象不包含
body
键,如果您运行

print message.keys()
您需要的是
get\u payload()
方法:

for message in messages:
    print message['subject']
    print message.get_payload()
pop_conn.quit()
但当涉及到多部分信息时,这就变得复杂了
get_payload()
返回部件列表,每个部件都是一个
消息
对象。您可以通过使用
get_payload(i)
获取多部分消息的特定部分,它返回
i
th部分,如果
i
超出范围,则引发
indexer
,如果消息不是多部分,则引发
TypeError

正如Gustavo Costa De Oliveir所指出的,您可以使用
walk()
方法来按顺序获取各个部分——它对消息的各个部分和子部分进行深度优先遍历


有关电子邮件解析模块的更多信息,请访问。

对象消息没有正文,您需要解析多个部分,如下所示:

for part in message.walk():
    if part.get_content_type():
        body = part.get_payload(decode=True)

walk()
函数首先遍历电子邮件的各个部分,然后查找具有内容类型的部分。内容类型可以是
text/plain
text/html
,有时一封电子邮件可以同时包含这两种类型(如果邮件
content\u type
设置为
multipart/alternative
)。

它还可以返回正确编码的数据,在邮件中包含一些多语言内容


charset = part.get_content_charset()
content = part.get_payload(decode=True)
content = content.decode(charset).encode('utf-8')

如果你想使用IMAP4。使用outlook python库,请在此处下载: 要从收件箱中检索未读电子邮件,请执行以下操作:

import outlook
mail = outlook.Outlook()
mail.login('emailaccount@live.com','yourpassword')
mail.inbox()
print mail.unread()
要检索电子邮件元素,请执行以下操作:

print mail.mailbody()
print mail.mailsubject()
print mail.mailfrom()
print mail.mailto()

下面是我如何使用python 3新功能解决问题的:

import imaplib
import email

mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login(username, password)
mail.select(readonly=True)  # refresh inbox
status, message_ids = mail.search(None, 'ALL')  # get all emails
for message_id in message_ids[0].split():  # returns all message ids
    # for every id get the actual email
    status, message_data = mail.fetch(message_id, '(RFC822)')
    actual_message = email.message_from_bytes(message_data[0][1])

    # extract the needed fields
    email_date = actual_message["Date"]
    subject = actual_message["Subject"]
    message_body = get_message_body(actual_message)
现在,由于MIME格式,获取消息体实际上相当棘手。我使用了中建议的函数

这个特定的例子适用于Gmail,但IMAP是一个标准协议,因此它也适用于其他电子邮件提供商,可能需要做一些小改动