为 python 中的 api 封外发 Gmail 邮件设置自定义标签
set custom labels for outgoing gmail api messages in python
我正在尝试使用 python 的 Gmail API 客户端发送电子邮件(它是 Google APIs client). I have gone through the quickstart guide 的一部分,并且成功地配置了客户端,因此我的邮件可以正确到达收件人. 但是,这些消息最终也出现在我自己的电子邮件收件箱中。
这是生成消息的代码片段:
def create_message(to, subject, message_text, attachments=None):
message = MIMEText(message_text) if not attachments else MIMEMultipart()
# set message metadata
message['to'] = to
message['subject'] = subject
if attachments:
msg = MIMEText(message_text)
message.attach(msg)
for attachment in attachments:
main_type, sub_type = attachment.content_type.split('/', 1)
if main_type == 'text':
msg = MIMEText(await attachment.read(), _subtype=sub_type)
elif main_type == 'image':
msg = MIMEImage(await attachment.read(), _subtype=sub_type)
elif main_type == 'audio':
msg = MIMEAudio(await attachment.read(), _subtype=sub_type)
else:
msg = MIMEBase(main_type, sub_type)
msg.set_payload(attachment.read())
msg.add_header('Content-Disposition', 'attachment', filename=attachment.filename)
message.attach(msg)
return message
这是发送消息的代码片段(假设 service
是 Gmail API 的预配置实例)
message = create_message(to, subject, content, attachments)
body = {'raw': base64.urlsafe_b64encode(message.as_bytes()).decode('utf8')}
result = (service.users().messages().send(userId='me', body=body).execute())
print(result)
有趣的是,结果显示邮件(默认情况下)附加了以下标签:
{
...
"labelIds": [
"UNREAD",
"SENT",
"INBOX"
]
...
}
INBOX
标签导致邮件出现在我自己的收件箱中。我的问题是如何在发送前为外发消息设置标签?我已经浏览了 API 文档,但它没有提到如何设置自定义标签。我能想到的唯一解决方法是使用 messageId
重新查询我的收件箱并删除不必要的标签。
我暂时找到了一个不错的解决方法:
Gmail API 提供了一种方法 modify 可以根据邮件的 ID 更新邮件的标签。所以我所做的是从 result
中提取 id
并将其与要删除的标签一起传递给 modify
。
message = create_message(to, subject, content, attachments)
body = {'raw': base64.urlsafe_b64encode(message.as_bytes()).decode('utf8')}
result = service.users().messages().send(userId='me', body=body).execute()
result = (service.users().messages().modify(
userId='me',
id=result['id'], # extracts the sent message id
body={"removeLabelIds": ["INBOX", "UNREAD"]}, # sets which labels to remove
)).execute()
print(result)
我正在尝试使用 python 的 Gmail API 客户端发送电子邮件(它是 Google APIs client). I have gone through the quickstart guide 的一部分,并且成功地配置了客户端,因此我的邮件可以正确到达收件人. 但是,这些消息最终也出现在我自己的电子邮件收件箱中。
这是生成消息的代码片段:
def create_message(to, subject, message_text, attachments=None):
message = MIMEText(message_text) if not attachments else MIMEMultipart()
# set message metadata
message['to'] = to
message['subject'] = subject
if attachments:
msg = MIMEText(message_text)
message.attach(msg)
for attachment in attachments:
main_type, sub_type = attachment.content_type.split('/', 1)
if main_type == 'text':
msg = MIMEText(await attachment.read(), _subtype=sub_type)
elif main_type == 'image':
msg = MIMEImage(await attachment.read(), _subtype=sub_type)
elif main_type == 'audio':
msg = MIMEAudio(await attachment.read(), _subtype=sub_type)
else:
msg = MIMEBase(main_type, sub_type)
msg.set_payload(attachment.read())
msg.add_header('Content-Disposition', 'attachment', filename=attachment.filename)
message.attach(msg)
return message
这是发送消息的代码片段(假设 service
是 Gmail API 的预配置实例)
message = create_message(to, subject, content, attachments)
body = {'raw': base64.urlsafe_b64encode(message.as_bytes()).decode('utf8')}
result = (service.users().messages().send(userId='me', body=body).execute())
print(result)
有趣的是,结果显示邮件(默认情况下)附加了以下标签:
{
...
"labelIds": [
"UNREAD",
"SENT",
"INBOX"
]
...
}
INBOX
标签导致邮件出现在我自己的收件箱中。我的问题是如何在发送前为外发消息设置标签?我已经浏览了 API 文档,但它没有提到如何设置自定义标签。我能想到的唯一解决方法是使用 messageId
重新查询我的收件箱并删除不必要的标签。
我暂时找到了一个不错的解决方法:
Gmail API 提供了一种方法 modify 可以根据邮件的 ID 更新邮件的标签。所以我所做的是从 result
中提取 id
并将其与要删除的标签一起传递给 modify
。
message = create_message(to, subject, content, attachments)
body = {'raw': base64.urlsafe_b64encode(message.as_bytes()).decode('utf8')}
result = service.users().messages().send(userId='me', body=body).execute()
result = (service.users().messages().modify(
userId='me',
id=result['id'], # extracts the sent message id
body={"removeLabelIds": ["INBOX", "UNREAD"]}, # sets which labels to remove
)).execute()
print(result)