python - 如何使用 gmail API 将现有电子邮件发送到新线程
问题描述
我正在尝试使用 Flask 中的 gmail API 将现有电子邮件发送到另一个线程。
上下文:
我已经创建了一个新的消息对象并成功地分别使In-Reply-To
,References
和threadId
等于message_id
and thread_id
。(遵循Gmail 的 API 参考)
def create_message(sender, to, subject, thread_id, message_id, message_text, service):
"""Create a message for an email.
Args:
sender: Email address of the sender.
to: Email address of the receiver.
subject: The subject of the email message.
message_text: The text of the email message.
Returns:
An object containing a base64url encoded email object.
"""
if type(message_text) != str:
message_text = str(message_text)
message = MIMEText(message_text)
message['to'] = to
message['from'] = sender
message['subject'] = subject
message['In-Reply-To'] = message_id
message['References'] = message_id
message['threadId'] = thread_id
print('created message threadId: %s does == ..' %message['threadId'])
print(thread_id)
raw = base64.urlsafe_b64encode(message.as_bytes())
raw = raw.decode()
body = {'raw': raw}
messages = service.users().messages()
send = messages.send(userId='me', body=body).execute()
问题:
我能够成功地将新消息发送到我的收件箱,但是threadId
即使上面代码中的打印语句显示相同,它们也是使用新消息创建的threadId
。
然后,当我按照此线程中的代码示例进行操作时:
body = {'message': {'raw': raw, 'threadId': thread_id}}
我收到以下错误:
googleapiclient.errors.HttpError: <HttpError 400 when requesting https://www.googleapis.com/gmail/v1/users/me/messages/send?alt=json returned "'raw' RFC822 payload message string or uploading message via /upload/* URL required">
问题:
如何生成这些电子邮件,以便它们使用相同的线程threadId
?
注意:我在这里找到了 javascript 的类似问题,在这里找到了 java的类似问题,但没有找到 python 的答案。
解决方案
正如可以从您提供的链接中的信息中收集的那样,您不需要提供In-Reply-To
和References
来启用线程,threadId
在请求正文中提供 并使Subject
原始消息正文中的 匹配,如文档中指定的那样就足够了。
请执行以下修改:
删除该行message['threadId'] = thread_id
- threadId 属于请求正文,而不是消息正文
样本:
def create_message(sender, to, subject, thread_id, message_text, service):
"""Create a message for an email.
Args:
sender: Email address of the sender.
to: Email address of the receiver.
subject: The subject of the email message.
message_text: The text of the email message.
Returns:
An object containing a base64url encoded email object.
"""
if type(message_text) != str:
message_text = str(message_text)
message = MIMEText(message_text)
message['to'] = to
message['from'] = sender
message['subject'] = subject
raw = base64.urlsafe_b64encode(message.as_bytes())
raw = raw.decode()
body = {'raw': raw, 'threadId':thread_id}
messages = service.users().messages()
send = messages.send(userId='me', body=body).execute()
推荐阅读
- angularjs - Python烧瓶和AngularJS与链接http post请求顺序
- python - 在 python 中压缩和过滤
- angular - 在 Angular 中设置全球时区
- javascript - 防止鼠标第四个和第五个按钮在浏览器历史记录中向后/向前导航?
- numpy - numpy 和 mathdotnet.com 之间的移动平均差异
- javascript - 如果其他按钮具有特定类,则切换按钮
- git - git push 不显示远程存储库中的更改
- python - Django formset动态无法添加表单
- scala - 使用在集群上具有不同版本的依赖项构建 jar
- apache-spark - 在内存受限的设置中运行 Spark