我想实现使用 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
如果我正确理解您的问题,您会收到一条消息,并且您想要创建对该消息的回复草稿。
您只需在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}')