【问题标题】:Python - Extract the body from a mail in plain textPython - 从纯文本邮件中提取正文
【发布时间】:2015-11-05 04:51:42
【问题描述】:

我只想提取邮件正文并将其返回。 我可以过滤字段并显示 sn-p 但不能显示正文。

def GetMimeMessage(service, user_id, msg_id):
    try:
            message = service.users().messages().get(userId=user_id, id=msg_id, format='raw').execute()
            print 'Message snippet: %s' % message['snippet']
            msg_str = base64.urlsafe_b64decode(message['raw'].encode('ASCII'))
            mime_msg = email.message_from_string(msg_str)
            return mime_msg
    except errors.HttpError, error:
            print 'An error occurred: %s' % error

https://developers.google.com/gmail/api/v1/reference/users/messages/get

【问题讨论】:

    标签: python gmail gmail-api


    【解决方案1】:

    谢谢。所以经过一些修改,这里的解决方案:

    def GetMessageBody(service, user_id, msg_id):
        try:
                message = service.users().messages().get(userId=user_id, id=msg_id, format='raw').execute()
                msg_str = base64.urlsafe_b64decode(message['raw'].encode('ASCII'))
                mime_msg = email.message_from_string(msg_str)
                messageMainType = mime_msg.get_content_maintype()
                if messageMainType == 'multipart':
                        for part in mime_msg.get_payload():
                                if part.get_content_maintype() == 'text':
                                        return part.get_payload()
                        return ""
                elif messageMainType == 'text':
                        return mime_msg.get_payload()
        except errors.HttpError, error:
                print 'An error occurred: %s' % error
    

    【讨论】:

    • 我今天刚收到一封电子邮件,其中 multipart 嵌套在另一个 multipart 中,但未能成功。现在尝试其他方式,这似乎很有希望docs.python.org/3.4/library/…
    • TypeError: initial_value 必须是 str 或 None,而不是 bytes
    • 试试 email.message_from_bytes()
    • 感谢 message_from_bytes() 选项@FabianBosler 我遇到了同样的错误。
    【解决方案2】:

    试试这个:

    mail 参数是你的 mime_msg 变量

    def get_mpart(mail):
        maintype = mail.get_content_maintype()
        if maintype == 'multipart':
            for part in mail.get_payload():
                # This includes mail body AND text file attachments.
                if part.get_content_maintype() == 'text':
                    return part.get_payload()
            # No text at all. This is also happens
            return ""
        elif maintype == 'text':
            return mail.get_payload()
    
    
    def get_mail_body(mail):
        """
        There is no 'body' tag in mail, so separate function.
        :param mail: Message object
        :return: Body content
        """
        body = ""
        if mail.is_multipart():
            # This does not work.
            # for part in mail.get_payload():
            #    body += part.get_payload()
            body = get_mpart(mail)
        else:
            body = mail.get_payload()
        return body
    

    【讨论】:

      【解决方案3】:

      base64url 编码的字符串在传入解码函数之前需要进行一些修改,如下所示:

      msg_str = base64.urlsafe_b64decode(message['raw'].replace('-_', '+/').encode('ASCII'))
      

      看看有没有帮助

      【讨论】:

        猜你喜欢
        • 2011-10-09
        • 2012-01-03
        • 1970-01-01
        • 1970-01-01
        • 2016-07-04
        • 1970-01-01
        • 2019-10-21
        • 2011-05-15
        • 2016-12-20
        相关资源
        最近更新 更多