使用 gmail API 起草回复不会将草稿附加到线程

问题描述 投票:0回答:1

我想实现使用 Python 中的 gmail API 附加草稿作为对现有电子邮件线程的回复的功能,但我打算回复线程的草稿被创建为独立草稿。

create()
方法的文档位于此处,RFC 2822 标准的文档位于此处。我相信我已经正确设置
Subject
标头以匹配正在回复的消息的
Subject
标头,
In-Reply-To
标头以匹配正在回复的消息的
Message-ID
标头,以及
References
标头与要回复的消息的
References
标头匹配,后跟
Message-ID
(用空格分隔)。

用于从正在回复的消息中获取标头的代码位于

get_message_headers()
中,用于设置回复标头和创建草稿的代码位于
reply_draft()
中。有谁知道我缺少什么来创建草稿作为对线程的回复而不是新草稿?

    def get_message_headers(self, message_id):
        """Get a message and return its References, In-Reply-To, and Subject headers"""
        payload = (
            self.service.users()
            .messages()
            .get(userId="me", id=message_id)
            .execute()["payload"]
        )
        references_value = None
        in_reply_to_value = None
        subject = None

        for header in payload["headers"]:
            if header["name"] == "References":
                refs = header["value"]
            elif header["name"] == "Message-ID":
                in_reply_to_value = header["value"]
            elif header["name"] == "Subject":
                subject = header["value"]
        references_value = refs + " " + in_reply_to_value
        return references_value, in_reply_to_value, subject

    def reply_draft(
        self, content, other, subject, thread_id, references_value, in_reply_to_value
    ):
        """Create and insert a draft email.
        Print the returned draft's message and id.
        Returns: Draft object, including draft id and message meta data.
        """
        try:
            message = EmailMessage()

            message.set_content(content)

            message["To"] = other
            message["From"] = self.me
            message["Subject"] = subject
            message["References"] = references_value
            message["In-Reply-To"] = in_reply_to_value

            # encoded message
            encoded_message = base64.urlsafe_b64encode(message.as_bytes()).decode()
            body = {"message": {"raw": encoded_message}}
            body["threadId"] = str(thread_id)

            draft = (
                self.service.users().drafts().create(userId="me", body=body).execute()
            )

        except HttpError as error:
            print(f"An error occurred: {error}")
            draft = None

        return draft
python email google-api gmail rfc2822
1个回答
0
投票

如果我正确理解您的问题,您会收到一条消息,并且您想要创建对该消息的回复草稿。

您只需在threadId中添加您要回复的消息的id即可。

try:
    # Call the Gmail API
    service = build('gmail', 'v1', credentials=creds)
    message = EmailMessage()

    message.set_content('This is automated draft mail')

    message['To'] = '[redacted]'
    message['From'] = [redacted]
    message['Subject'] = 'Automated draft'

    # encoded message
    encoded_message = base64.urlsafe_b64encode(message.as_bytes()).decode()

    create_message = {
        'message': {
            'threadId': message_id,   # The id of the main message to reply to
            'raw': encoded_message
        }
    }
    # pylint: disable=E1101
    draft = service.users().drafts().create(userId="me",
                                            body=create_message).execute()

    print(F'Draft id: {draft["id"]}\nDraft message: {draft["message"]}')

except HttpError as error:
    # TODO(developer) - Handle errors from gmail API.
    print(f'An error occurred: {error}')
© www.soinside.com 2019 - 2024. All rights reserved.