MIME 标头无法通过 Gmail API
Posted
技术标签:
【中文标题】MIME 标头无法通过 Gmail API【英文标题】:MIME Headers Not Making it Through Gmail API 【发布时间】:2015-10-16 01:02:40 【问题描述】:我正在尝试通过 Gmail API 自动创建草稿,并且我希望这些草稿成为对现有电子邮件的回复。为此,我相信我需要设置“threadId”标头(特定于 Gmail)、“References”标头和“In-Reply-To”标头。此外,为了让 Gmail 将邮件视为回复,“主题”标头必须与原始电子邮件相匹配。
我将所有这些标头硬编码到一个 MIMEText 对象中,然后将消息作为字符串进行 base-64 编码(urlsafe)并让 Gmail API 传递它。但是,“threadId”、“In-Reply-To”和“References”标题似乎永远不会出现在发送的电子邮件中,因为它们在单击“显示原始”时显示的 MIME 中不存在在 Gmail 用户界面中。
new = MIMEText("reply body text")
new["In-Reply-To"] = "[Message-ID of email to reply to]" #looks like <..@mail.gmail.com>
new["References"] = "[Message-ID of email to reply to]" #looks like <..@mail.gmail.com>
new["threadId"] = "[threadId of message to reply to]" #looks like 14ec476abbce3421
new["Subject"] = "Testsend2"
new["To"] = "[Email to send to]"
new["From"] = "[Email to send from]"
messageToDraft = 'raw': base64.urlsafe_b64encode(new.as_string())
message = 'message': messageToDraft
draft = service.users().drafts().create(userId="me", body=message).execute()
【问题讨论】:
threadId
不应作为raw
密钥的一部分发送,它必须分开才能工作。所以message
应包含raw
: my_raw, @987654326 @: my_thread_id
【参考方案1】:
实际上,它比这简单得多!如果您只在标题中提供正确的主题,并在正文中提供正确的 threadId,Google 将为您计算所有引用。
new = MIMEText("This is the placeholder draft message text.")
new["Subject"] = "Example Mail"
new["To"] = "emtholin@gmail.com"
new["From"] = "emtholin@gmail.com"
raw = base64.urlsafe_b64encode(new.as_string())
message = 'message': 'raw': raw, 'threadId': "14ec598be7f25362"
draft = service.users().drafts().create(userId="me", body=message).execute()
这会产生一个草稿,准备好在正确的线程中发送:
然后,我发送邮件。如您所见,参考是为您计算的:
MIME-Version: 1.0
Received: by 10.28.130.132 with HTTP; Sat, 25 Jul 2015 07:54:12 -0700 (PDT)
In-Reply-To: <CADsZLRz5jWF5h=6Cs1F45QQOiFuqNGmMeb6St5e-tOj3stCNiA@mail.gmail.com>
References: <CADsZLRwmDZ_L5_zWqE8qOgoKuvRiRTWUopqssn4+XYGM_SKrfg@mail.gmail.com>
<CADsZLRz5jWF5h=6Cs1F45QQOiFuqNGmMeb6St5e-tOj3stCNiA@mail.gmail.com>
Date: Sat, 25 Jul 2015 16:54:12 +0200
Delivered-To: emtholin@gmail.com
Message-ID: <CADsZLRxuyFhuGNPwjRrfFVQ0_2MxO=_jstjmsBGmAiwMEvfWSg@mail.gmail.com>
Subject: Example Mail
From: Emil Tholin <emtholin@gmail.com>
To: Emil Tholin <emtholin@gmail.com>
Content-Type: text/plain; charset=UTF-8
This is the placeholder draft message text.
【讨论】:
非常好的解决方案,谢谢。后来我意识到类似的事情是可能的,尽管我更喜欢您的解决方案:如果您生成具有相同收件人并在主题前附加“Re:”的草稿,Gmail 将计算并附加必要的标题。 @monstermac77 没问题! :) 凉爽的!很高兴知道。 @Tholle 知道如何在 Google Apps 脚本中做同样的事情吗?似乎忽略了 threadID in:"message": "raw": rawEncoded, "threadId": threadId @Layla 遗憾的是,我从未使用过 Apps 脚本。也许这个记录在案的reply function 可以提供一些线索? 这会创建一个草稿回复,但它与我手动创建一个不同。当我在 Gmail 中手动执行此操作时:单击回复,然后开始输入消息,然后离开并返回电子邮件,您可以在原始电子邮件的底部看到电子邮件草稿。使用 API 时不会发生这种情况。【参考方案2】:如果您不仅想创建草稿,还想另外发送它,那么扩展上述代码(草稿后的另一行 =...create().execute():
draft = service.users().drafts().create(userId="me", body= message).execute()
message = service.users().drafts().send(userId='me', body='id': draft['id']).execute()
【讨论】:
以上是关于MIME 标头无法通过 Gmail API的主要内容,如果未能解决你的问题,请参考以下文章
HTML 图像未显示在通过 VBA 中的 Gmail API 发送的 MIME 消息中,使用 3D
通过 Gmail REST API 发送的电子邮件/草稿无法在新的 Gmail 用户界面中打开