Python - 提取纯文本邮件的正文

11

我想提取一封信息的正文并返回它。 我可以过滤字段并显示片段,但无法显示正文。

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

3个回答

7
感谢您。经过一些修改,这里是解决方案:
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

1
今天我刚刚收到一封电子邮件,其中包含一个嵌套在另一个“multipart”中的“multipart”,但是这个操作失败了。现在正在尝试其他方法,这个链接看起来很有希望:https://docs.python.org/3.4/library/email.message.html#email.message.Message.walk - wasabigeek
1
类型错误:initial_value必须为str或NoneType,而不是bytes类型。 - K-Dawg
2
尝试使用 email.message_from_bytes()。 - Fabian Bosler
1
感谢 @FabianBosler 提供的 message_from_bytes() 选项,我也遇到了同样的错误。 - anuprag

0
尝试这个: < p > < code > mail 参数是您的< code > 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

0

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

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

看看这个能否帮到你


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接