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
时使用FULL
或METADATA
作为格式,而不是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"]
参考:
我正在尝试使用我检索到的 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
时使用FULL
或METADATA
作为格式,而不是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"]