Gmail API 游乐场:发送方法,转换后的 MIME 原始标头在发送时未填充电子邮件字段

Posted

技术标签:

【中文标题】Gmail API 游乐场:发送方法,转换后的 MIME 原始标头在发送时未填充电子邮件字段【英文标题】:Gmail API playground: Send method, converted MIME raw header not populating email fields on send 【发布时间】:2015-08-26 01:28:10 【问题描述】:

我正在使用Google OAuth 2.0 Playground 并尝试发送电子邮件。 autentication 工作正常。这是我要发送的非常简单的消息(更改了电子邮件地址以防止垃圾邮件):

 to: 'Michael To' <FakeMichael@gmail.com>
 from: 'John From' <JohnF@mydomain.com>
 subject: 'Test Message'
 htmlBody: '<b>HI!</b><br>Test Message'

我使用 VBA 将其转换为 Base64 RFC 822,这让我得到了这个(我尝试在其他 *** 帖子中交换“+”和“-”但无济于事):

dG86ICdNaWNoYWVsIFRvJyA8RmFrZU1pY2hhZWxAZ21haWwuY29tPg1mcm9tOiAnSm9obiBGcm9tJyA8Sm9obkZAbXlkb21haW4uY29tPg1zdWJqZWN0OiAnVGVzdCBNZXNzYWdlJw1odG1sQm9keTogJzxiPkhJITwvYj48YnI-VGVzdCBNZXNzYWdlJw == P>

在 Playground 中,我的方法是 POST,我添加了 2 个标题:

raw: and the Base64 string above (no quotes or anything)
Content-Type: message/rfc822 <I added this because I kept getting an a different error. Putting this prevetned that error>

请求 URI(删除了 https 的原因,所以不会让我发布超过 2 个链接)://www.googleapis.com/upload/gmail/v1/users/me/messages/send

我点击“发送请求”并得到 OK 响应:

这是我的要求:

POST /upload/gmail/v1/users/me/messages/send HTTP/1.1
Host: www.googleapis.com
Raw: <string above>
Content-length: 0
Content-type: message/rfc822
Authorization: Bearer <my token>

回复:

HTTP/1.1 200 OK
Alternate-protocol: 443:quic,p=1
Content-length: 91
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Vary: Origin, X-Origin
Server: UploadServer ("Built on Jun 6 2015 11:14:45 (1433614485)")
Etag: "YAnoF_dHYOakPARISZQhTvRsqto/nwevNUuzaUU_lB19L-UhrwaaUSM"
Pragma: no-cache
Cache-control: no-cache, no-store, max-age=0, must-revalidate
Date: Wed, 10 Jun 2015 15:59:36 GMT
Content-type: application/json; charset=UTF-8

  "labelIds": [
    "SENT"
  ], 
  "id": "14dde32bc92c9XYZ", 
  "threadId": "14dde32bc92c9XYZ"

但是,当我转到我的 Gmail 发送邮件文件夹时,邮件在那里,但收件人、主题或正文字段中没有任何内容:See Screenshot

我不得不想象这很简单,但由于我是 Google Gmail API、MIME 和处理 Raw Base64 东西的新手,所以我运气不佳。

提前感谢您的帮助。

--- 编辑 PER THOLLE 的回应 ---

这有帮助!我删除了原始 base64 字符串标题并放入:

From: 'John From' <JohnF@mydomain.com>
Subject: Test Message
To: 'Michael To' <FakeMichael@gmail.com>
Test Message

进入“输入请求正文”并发送,这很棒!

三个后续问题:

    是否有任何安全风险或限制(最大长度?我看到可能有 2mb 的限制,但那会是很多文本。)以这种方式(在正文中)发送它,而不是在标头中使用原始 Base64 字符串? (我将对此进行深入研究)如何将邮件正文设为 HTML? “Content-Type:message/rfc822”的内容类型是否会阻止我发送 HTML?向它发送 HTML 是此应用程序的一项要求,我不能有两种内容类型,是否有可以使用的 HTML 参数,还是我不走运? (我也会做这方面的功课)如何在电子邮件中包含附件,比如 PDF 文件?

再次感谢!

【问题讨论】:

编辑了我的答案以支持 HTML :) 【参考方案1】:

我认为您违反了 RFC 822 标准的一些小细节:

推荐 如果存在,标头将按“返回- 路径”、“接收”、“日期”、“发件人”、“主题”、“发件人”、 “收件人”、“抄送”等

我一辈子都找不到它,但我也认为标题的第一个字符必须大写。试试这个:

From: John From <JohnF@mydomain.com>
Subject: Test Subject
To: Michael To <FakeMichael@gmail.com>

Test Message

如果您选择 message/rfc822 作为您的 Content-Type,您也不想发送 base64 编码的邮件。只需按原样提供上面的示例邮件即可。

POST /upload/gmail/v1/users/me/messages/send HTTP/1.1
Host: www.googleapis.com
Content-length: 108
Content-type: message/rfc822
Authorization: Bearer YOUR_ACCESS_TOKEN

From: John From <JohnF@mydomain.com>
Subject: Test Subject
To: Michael To <FakeMichael@gmail.com>

Test Message

如果您想要 HTML,只需将您的消息修改为:

From: John From <JohnF@mydomain.com>
Subject: Test Subject
To: Michael To <FakeMichael@gmail.com>
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable

<b>Test Message</b>

【讨论】:

太棒了。让我试试,希望能把它关掉! 这适用于 HTML 电子邮件。非常非常感谢你。添加附件就这么简单吗? 甜蜜! ***.com/questions/24908700/…这可能会对你有所帮助。检查“带有附件的邮件”。

以上是关于Gmail API 游乐场:发送方法,转换后的 MIME 原始标头在发送时未填充电子邮件字段的主要内容,如果未能解决你的问题,请参考以下文章

Gmail api与Postman发送

如何在 python 中向 Gmail-API 发送批处理请求?

使用 GMAIL API 跟踪电子邮件发送状态

尝试在 Java 中使用 Gmail API 发送电子邮件时出错

Gmail API - PHP - 使用服务帐户发送电子邮件

退回 <nobody@gmail.com> Gmail API 发送失败