为 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)