gpt4 book ai didi

python - 如何在 Gmail API 中正确设置 "In-Reply-To"和 "Reference" header

转载 作者:太空宇宙 更新时间:2023-11-04 00:00:01 26 4
gpt4 key购买 nike

我正在尝试回复使用 Gmail API 收到的邮件。我尝试了以下代码,它将发送消息附加到我邮箱中的线程,但对于接收者,它作为新消息发送。声明 In-Reply-To 和 Reference header 的正确方法是什么?

def create_message(origin=None, destination=to, subject=None, msg_txt=None, thr_id=None):
"""Create a message for an email.
Args:
origin: Email address of the sender.
destination: Email address of the receiver.
subject: The subject of the email message.
msg_txt: The text of the email message.
thr_id: the threadId of the message to attach
Returns:
An object containing a base64url encoded email object.
"""
message = MIMEText(msg_txt)
message['to'] = destination
message['from'] = origin
message['subject'] = subject
raw_msg={'raw': (base64.urlsafe_b64encode(message.as_bytes()).decode())}
raw_msg['threadId'] =thr_id
raw_msg['Reference'] = '<CANyAw3CWm33sKL80GMKp-b=8JgXz3MVPkvCVbJ_oK4NuGJcb3w@mail.gmail.com>'
raw_msg['In-Reply-To'] = '<CANyAw3CWm33sKL80GMKp-b=8JgXz3MVPkvCVbJ_oK4NuGJcb3w@mail.gmail.com>'
raw_msg['Message-ID'] = '<CANyAw3CWm33sKL80GMKp-b=8JgXz3MVPkvCVbJ_oK4NuGJcb3w@mail.gmail.com>'
return raw_msg

我的主要方法如下,

def main():
"""Canned reply responder using the Gmail API.
Creates a Gmail API service object and responds to a query with a standard response
whilst giving it a label to ensure only 1 response per thread is sent
"""

# get credentials first and create gmail service object
store = file.Storage('token.json')
creds = store.get()
if not creds or creds.invalid:
flow = client.flow_from_clientsecrets('gmailApiCredentials.json', SCOPES)
creds = tools.run_flow(flow, store)
gmail_service = build('gmail', 'v1', http=creds.authorize(Http()))

# receive email messages
q = 'subject:this is a test message'
messages = list_messages_matching_query(gmail_service, user_id,
query=q,
maxResults=1)
if not messages:
print("No messages to show")
else:
pprint.pprint('Messages to show: {}'.format(messages))

# get thread of first document - so you can label the thread itself if need be
thread_id = messages[0]['threadId']
thread = get_thread(gmail_service, user_id, thread_id)

msg_id = messages[0]['id']
message = get_message(gmail_service, user_id, msg_id)

subject ='Re:this is a test message'
msg = create_message(destination=to, origin=to,
subject=subject,
msg_txt='Hai', thr_id=thread_id)
send_message(gmail_service,"me", msg)
print("Message Sent")

最佳答案

create_message 方法应如下更改以设置“Reference”和“In-Reply-To” header 。

def create_message(origin=None, destination=TO, subject=None, msg_txt=None, thr_id=None, msgID=None):
"""Create a message for an email.
Args:
origin: Email address of the sender.
destination: Email address of the receiver.
subject: The subject of the email message.
msg_txt: The text of the email message.
thr_id: the threadId of the message to attach
Returns:
An object containing a base64url encoded email object.
"""
message = MIMEText(msg_txt)
message['to'] = destination
message['from'] = origin
message['subject'] = subject
message.add_header('Reference', msgID)
message.add_header('In-Reply-To', msgID)
raw_msg = {'raw': (base64.urlsafe_b64encode(message.as_bytes()).decode())}
raw_msg['threadId'] = thr_id
return raw_msg

可以通过以下方法获取正确的msgID,

def get_mime_message(service, user_id, msg_id):
try:
message = service.users().messages().get(userId=user_id, id=msg_id,
format='raw').execute()

msg_str = base64.urlsafe_b64decode(message['raw']).decode()

mime_msg = email.message_from_string(msg_str)

return mime_msg
except errors.HttpError as error:
print('An error occurred: %s' % error

msgID可以通过如下方式获取,

ms = get_mime_message(gmail_service, USER_ID, msg_id)
msgID = format(ms['Message-ID'])

不要混淆 msg_id 和 msgID。 msg_id 是特定于 gmail 的,而 msgID 是全局的。这个 msgID 应该用在“Reference”和“In-Reply-To” header 中。

关于python - 如何在 Gmail API 中正确设置 "In-Reply-To"和 "Reference" header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55984521/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com