繁体   English   中英

使用 gmail API 解码 email 时遇到问题

[英]Trouble decoding email using gmail API

我很难让 python 阅读我的电子邮件。 我正在尝试从 email 的主体中提取信息。 我遇到的问题是,当我直接从原始源运行 email 上的代码时,即使在通过 base64 解码器运行它之后,它仍然返回不可读的 Z95A1446A7120E4AF5C0C8878ABB7E6D2 数据。 但是,如果我将相同的 email 转发给自己,那么代码将遍历转发的 email,它可以完美地工作并适当地解码整个 email。 这是我用来获取 email 主体的 function。 我注意到直接来自源的 content_type 是“文本”,但是当我将其转发给自己时,它会将其读取为“多部分”。 任何帮助是极大的赞赏。 我不知道从这里到 go 的位置。

提前致谢!

def get_message(service, user_id, msg_id):
    try:
        # Makes the connection and GETS the emails in RAW format.
        message = service.users().messages().get(userId=user_id, id=msg_id, format='raw').execute()
        # Changes format from RAW to ASCII
        msg_raw = base64.urlsafe_b64decode(message['raw'].encode('ASCII'))
        # Changes format type again
        msg_str = email.message_from_bytes(msg_raw)
        # This line checks what the content is, if multipart (plaintext and html) or single part
        content_types = msg_str.get_content_maintype()
        print(content_types)
        if content_types == 'multipart':
            # Part1 is plaintext and part2 is html text
            part1, part2 = msg_str.get_payload()
            raw_email = part1.get_payload()
            remove_char = ["|", "=20", "=C2=A0"]
            for i in remove_char:
                raw_email = raw_email.replace(i, "")
            raw_email = "".join([s for s in raw_email.strip().splitlines(True) if s.strip()])
            print('Inside correct part')
            print(raw_email)
            return str(raw_email)
        else:
            print('Inside the Else')
            print(msg_str.get_payload())
            return msg_str.get_payload()
    except:
        print('An error has occured during the get_message function.')

编辑:这是 function 从原始来源查看时打印出来的内容:

text
Inside the Else 
PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy93M2MvL2R0ZCB4aHRtbCAxLjAgdHJhbnNpdGlvbmFs
Ly9lbiIgImh0dHA6Ly93d3cudzMub3JnL3RyL3hodG1sMS9kdGQveGh0bWwxLXRyYW5zaXRpb25h
bC5kdGQiPjxodG1sIHN0eWxlPSJtYXJnaW46IDA7cGFkZGluZzogMDtmb250LWZhbWlseTogJ0hl
bHZldGljYSBOZXVlJywgJ0hlbHZldGljYScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7
Plus about 100 lines of stuff like this.  

如果我将其转发给自己,这是从同一个 email 打印出来的内容:

multipart
Inside correct part
---------- Forwarded message ---------
From: <originalSource@email.com>
Date: Wed, Jun 10, 2020 at 10:34 AM
Subject: You added cash to your Account
To: <xxxxxxxxxx@gmail.com>


[image: card] Account ending in XXXX
Hi, XXXX XXXX,
Success!

You added cash with 

解决方案

base64 会将数据解码为字符串,而不是字节。 因此你应该改变这个

msg_str = email.message_from_bytes(msg_raw)

为了这

msg_str = email.message_from_string(msg_raw)

查看 Python 中的此文档示例,了解有关此的更多信息。

我希望这对你有所帮助。 让我知道您是否需要其他任何内容,或者您是否不理解某些内容。 :)

Use Gmail documentation provided API for decoding https://www.tabnine.com/code/java/classes/com.google.api.client.util.Base64

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM