Gmail api:如何使用 ID 获取收件人的电子邮件?

Gmail api: How do I get the recipient's email using the ID?

我正在尝试使用我检索到的 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'

Gmail 的回复可能有点混乱。

你走在正确的轨道上
 msg_headers = full_message['payload']['headers']

调用的 headers 之一的名称为“Delivered-To”,该值将是邮件发送到的电子邮件地址。所以基本上你需要搜索你的msg_headers并找到一个名为“Delivered-To”的那个

很遗憾,我不是 python 开发人员,我无法帮助您编写代码。 Python quickstart 可能会给您一些关于如何从 object.

中获取响应的想法

回应

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

问题:

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

来自API official docs:

RAW: Returns the full email message data with body content in the raw field as a base64url encoded string; the payload field is not used.

解决方案:

在调用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"]

参考: