【问题标题】:Gmail api: How do I get the recipient's email using the ID?Gmail api:如何使用 ID 获取收件人的电子邮件?
【发布时间】:2021-01-27 07:39:29
【问题描述】:

我正在尝试使用我检索到的 ID 获取收件人的电子邮件。下面是代码。

messages = service.users().threads().list(userId='me', q='to:').execute().get('threads', [])
    for message in messages:
        #print(message)
        # print(dir(message))
        # print(message.get())
        if search in message['snippet']:
            #print(message['id'])
            message_id = message['id']
            # print(message_id)
            full_message = service.users().messages().get(userId='me', id=message_id, format="raw").execute()
            #print(full_message)
            msg_headers = full_message['payload']['headers']
            #print(msg_headers)
            msg_str = base64.urlsafe_b64decode(full_message['raw'].encode('ASCII'))
            mime_msg = email.message_from_bytes(msg_str)

            #print(mime_msg)

            x = re.findall('id=(\w+)\'', str(mime_msg))
            print(x)
            if len(x)> 0:
                return x[0]
                if msg_headers[x]['name'] == "To":
                    return msg_headers[x[0]]['value']
            else:
                return None

我收到以下错误。我该如何解决这个问题?

Traceback (most recent call last):
  File "C:\test\test2.py", line 102, in <module>
    test = get_email_with("Test string")
  File "C:\test\test2.py", line 55, in get_email_with
    msg_headers = full_message['payload']['headers']
KeyError: 'payload'

【问题讨论】:

标签: python google-api gmail-api google-api-python-client


【解决方案1】:

问题:

当格​​式设置为RAW 时,字段payload 不会填充到响应中。

来自 API official docs

RAW:将原始字段中包含正文内容的完整电子邮件数据作为 base64url 编码字符串返回; 未使用有效负载字段

解决办法:

调用messages().get时使用FULLMETADATA作为格式,而不是RAW(格式是选项参数,如果未指定,则默认使用FULL)。

所以你应该改变这个:

full_message = service.users().messages().get(userId='me', id=message_id, format="raw").execute()

到这里:

full_message = service.users().messages().get(userId='me', id=message_id).execute()

或者,也可以使用format="raw" 并解码base-64 编码的字符串full_message["raw"]编辑:不过,在这种情况下,您必须删除以下行:msg_headers = full_message['payload']['headers']

编辑:

因此,如果您想检索收件人,您可以执行以下操作:

full_message = service.users().messages().get(userId='me', id=message_id).execute()
msg_headers = full_message['payload']['headers']
for header in msg_headers:
    if header["name"] == "To":
        return header["value"]

参考:

【讨论】:

  • @lamblichus 谢谢!当我不使用“raw”时,我的 base-64 解码出现错误。
  • @yeroduk 因为你不会使用raw,所以你不需要解码。您只需要在msg_headers 中查找To 标头。我已经用代码 sn-p 编辑了我的答案,希望这对你有帮助。如果您想使用raw,则必须删除此行:msg_headers = full_message['payload']['headers']
【解决方案2】:

Gmail 的回复可能有点令人困惑。你在正确的轨道上

 msg_headers = full_message['payload']['headers']

其中一个标题名为“Delivered-To”,其值将是邮件发送到的电子邮件地址。所以基本上你需要搜索你的 msg_headers 并找到名为“Delivered-To”的那个

不幸的是,我不是 python 开发人员,我无法帮助您编写代码。 Python quickstart 可能会给你一些关于如何从对象中获取响应的想法。

回复

 "payload": {
    "partId": "",
    "mimeType": "multipart/alternative",
    "filename": "",
    "headers": [
      {
        "name": "Delivered-To",
        "value": "xxxx@gmail.com"
      },

【讨论】:

    猜你喜欢
    • 2021-04-19
    • 2018-11-03
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    相关资源
    最近更新 更多