如何使用新的 Gmail REST API 成功发送消息?

Posted

技术标签:

【中文标题】如何使用新的 Gmail REST API 成功发送消息?【英文标题】:How to send a message successfully using the new Gmail REST API? 【发布时间】:2014-08-19 01:42:40 【问题描述】:

我目前正在尝试测试新的Gmail REST API

在API Explorer 中,可以使用 OAuth 2.0 授权请求并执行请求,即发送消息。

首先我授权。

我正在使用以下测试数据(当然我使用了有效的to 电子邮件地址):

    
   "raw": "c2VuZGluZyBhIG1haWwgdXNpbmcgR21haWwgUkVTVCBBUEk=",  
   "payload":  
     "headers": [ 
        "name": "to",      "value": "info@something.com"   , 
        "name": "from",    "value": "taifunbaer@gmail.com" , 
        "name": "subject", "value": "Test Gmail REST API"   
     ],
     "mimeType": "text/plain" 
   

我还收到了200 OK 和以下结果,看起来不错。


  "id": "146dee391881b35b",
  "threadId": "146dee391881b35b",

但是,邮件不会发送成功,我可以在收件箱中找到来自nobody@gmail.com的消息;:"An error occurred, your message has not been sent."

问题:1.有人测试成功了吗? 2. 我是否必须添加一些其他参数才能使其运行?

编辑:有 2 种不同的 HTTP 请求方法,

    媒体上传请求的上传 URI,以及 仅元数据请求的元数据 URI

The API Explorer currently supports metadata requests only,意思是没有附件的纯文本消息,这就是我想要做的。

【问题讨论】:

当然,我当然先授权了请求,否则我想我不会得到200 OK 回复... @Taifun,您是如何创建 RFC 2822 字符串的,是否有任何库或硬编码,有示例吗? @Sasikanth 这取决于你最喜欢的编程语言。 see my answer below 如何对完整的消息进行 web-safe base64 编码 【参考方案1】:

知道了!

看了RFC 2822 specification后发现,完整的消息需要在raw参数中传递,看例子:

From: John Doe <jdoe@machine.example> 
To: Mary Smith <mary@example.net> 
Subject: Saying Hello 
Date: Fri, 21 Nov 1997 09:55:06 -0600 
Message-ID: <1234@local.machine.example>

This is a message just to say hello. So, "Hello".

所以在对完整消息进行base64编码后,将其传递给raw参数而不使用任何其他参数,它就可以正常工作了。

编辑 1: 正如@Amit 提到的,它必须是web-safe base64 编码,另见https://code.google.com/p/stringencoders/wiki/WebSafeBase64

因此,要将 base64 alpha 转换为“网络安全”的格式 建议进行以下更改:

+ --> - (char 62, plus to dash)
/ --> _ (char 63, slash to underscore)
= --> * padding

仅将+ 转换为-/ 转换为_ 对我来说就足够了。

编辑 2: 在这里举个例子回答@Hjulle 的问题:您只需要userId 和请求正文中的raw 参数。假设您的电子邮件地址是jdoe@machine.example

首先使用 online encoder 对完整的消息(见上文)进行 Base64 编码,然后您会得到以下字符串:

RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h
cnlAZXhhbXBsZS5uZXQ+IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4=

现在将+ 转换为-/ 转换为_,你会得到

RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h
cnlAZXhhbXBsZS5uZXQ-IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4=

现在将其传递到 API Explorer 的 raw 参数中。

【讨论】:

需要 URL 编码。 ***.com/questions/22128789/… gist.github.com/AkashkumarDev/20ab002e7f5785ae778e 知道哪里有问题吗? @akdev 如有问题,请开始一个新问题,而不是在这里发表评论。谢谢。 ***.com/questions/25396463/… 对我不起作用***.com/questions/28122074/gmail-api-emails-bouncing【参考方案2】:

注意:这是一个特定于 php 的答案,但我相信你们中的一些人会发现它很有用。

如果您像我一样在 PHP 中正确设置原始数据时遇到困难,使用 PHPMailer 会让事情变得更简洁、更轻松。

在你的代码中包含库后(如果你使用composer,只需在你的composer.json的require部分添加“phpmailer/phpmailer”:“~5.2”),你设置基本细节:

$mail = new PHPMailer();
$mail->From = 'FROM_EMAIL';
$mail->FromName = 'FROM_NAME';
$mail->addAddress('TO_EMAIL','TO_NAME');
$mail->Subject = 'EMAIL_SUBJECT';
$mail->Body = 'EMAIL_BODY';
$mail->preSend(); 
$mime = $mail->getSentMIMEMessage();

现在您可以对 $mime 进行 base64 编码以获取 Gmail API 的原始字符串。使用它而不是简单的 base64_encode,以获得有效的 Web 安全编码字符串。 rtrim(strtr(base64_encode($mime), '+/', '-_'), '=');

【讨论】:

问题是:“使用新的 Gmail REST API?”...那么为什么要谈论 PHPMailer... @mcfly 因为我花了两天时间研究如何在 PHP 中实现它,我想为什么不在这个可爱的知识共享平台上与像我一样遇到这个答案的人分享我的发现,因为他们找不到他们要找的东西。请注意顶部的免责声明。周一快乐! 仍然不在正确的主题中...我可以发布如何使用 python 和 java 发送和发送电子邮件,寻找真正主题答案的人会很高兴在这里找到这个。 从某种意义上说,这确实回答了这个问题,即您获得了由 PHPMailer 构建的完全准备好的消息,然后使用 Gmail API 发送它。这个想法是获取一些 3rd 方库,而不是处理消息的原始设置。【参考方案3】:

这对我有用

网址:https://www.googleapis.com/upload/gmail/v1/users/me/messages/send(POST 方法)

InHeaders:- "Authorization" : "Bearer ya29.Il-iBylW9AUr6V0QO72ryo17r7hf8i5zh8dU63ZjDNaxAApumh6T7lh20my_DQZomtL_qokZnJEgapYN20LmdlG6lFbqGASL5lqFAKnOoUtZA992JwOlUQxMVW6_Yto7jQ", "Content-Type" : "message/rfc822"

InBody:-

"raw": "From: <from@gmail.com> 
To: <to@gmail.com> 
Subject: Saying Hello
This is a message just to say hello. So, "Hello"."

【讨论】:

以上是关于如何使用新的 Gmail REST API 成功发送消息?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 进行 base64 解码,并使用基于 REST 的 Gmail API 下载附件

Gmail现在支持安排电子邮件,如何使用gmail rest api工作,还是api支持此功能?

如何使用来自 postmnan 本机应用程序的 gmail rest api 发送邮件

Gmail REST API 是不是有权访问标签颜色?

Drive Rest Api正在使用一个电子邮件ID,但不适用于其他gmail ID

使用相同控制台应用程序的 Gmail REST API 和 Gmail IMAP 的 API 配额