【问题标题】:How to receive mail using python如何使用python接收邮件
【发布时间】:2011-06-21 23:06:55
【问题描述】:

我想使用 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”且正文为“This is a test message”的电子邮件,它在 IDLE 中看起来像这样。

>>>>Tester >>>>None

所以它似乎准确地评估了主题而不是身体,我认为它在解析方法中对吗?问题是我对这些库了解得不够多,无法弄清楚如何更改它以返回主题和正文。

【问题讨论】:

    标签: python email


    【解决方案1】:

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

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

    walk() 函数深度优先遍历电子邮件的各个部分,您正在寻找具有内容类型的部分。内容类型可以是text/plaintext/html,有时一封电子邮件可以同时包含两者(如果邮件content_type 设置为multipart/alternative)。

    【讨论】:

      【解决方案2】:

      电子邮件解析器返回一个email.message.Message 对象,该对象不包含body 键,如果您运行就会看到

      print message.keys()
      

      你想要的是get_payload() 方法:

      for message in messages:
          print message['subject']
          print message.get_payload()
      pop_conn.quit()
      

      但是当涉及到多部分消息时,这会变得复杂; get_payload() 返回一个部件列表,每个部件都是一个Message 对象。您可以使用get_payload(i) 获取多部分消息的特定部分,它返回ith 部分,如果i 超出范围,则引发IndexError,如果消息不是,则引发TypeError多部分。

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

      http://docs.python.org/library/email.message.html#email.message.Message 上还有更多关于 email.parser 模块的信息。

      【讨论】:

        【解决方案3】:

        消息中正确编码的返回数据也包含一些多语言内容

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

        【讨论】:

          【解决方案4】:

          以下是我使用 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)
          

          现在get_message_body 由于 MIME 格式实际上非常棘手。我使用了this answer中建议的功能。

          此特定示例适用于 Gmail,但 IMAP 是一种标准协议,因此它也适用于其他电子邮件提供商,可能需要稍作改动。

          【讨论】:

            【解决方案5】:

            如果你想使用 IMAP4。使用 Outlook python 库,在这里下载:https://github.com/awangga/outlook 从您的收件箱中检索未读电子邮件:

            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()
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-08-02
              • 2019-10-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-05-19
              • 2016-07-02
              • 1970-01-01
              相关资源
              最近更新 更多