如何使用python接收邮件
我想用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
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是一个标准协议,因此它也适用于其他电子邮件提供商,可能需要做一些小改动