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

由于 To 标头而被 Gmail API 拒绝的电子邮件

通过 Gmail REST API 发送的电子邮件/草稿无法在新的 Gmail 用户界面中打开

在 gmail api 中搜索特定的 in-reply-to 标头

无法通过 gmail api 向多个发件人发送电子邮件

似乎无法通过 Gmail API 进行身份验证以阅读电子邮件