29

我目前正在尝试测试新的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" 
   }
}

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

{
  "id": "146dee391881b35b",
  "threadId": "146dee391881b35b",
}

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

在此处输入图像描述

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



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

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

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

4

3 回答 3

59

知道了!

在阅读了RFC 2822 规范后我发现,需要在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 提到的,它必须是网络安全的 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请求正文中的andraw参数。假设,您的电子邮件地址是jdoe@machine.example

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

RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h
cnlAZXhhbXBsZS5uZXQ+IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4=

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

RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h
cnlAZXhhbXBsZS5uZXQ-IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4=

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

于 2014-06-27T21:35:30.013 回答
1

这对我有用

网址: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"

体内:-

{"raw": "From: <from@gmail.com> 
To: <to@gmail.com> 
Subject: Saying Hello
This is a message just to say hello. So, "Hello"."}
于 2019-10-21T11:28:32.240 回答
1

注意:这是一个 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), '+/', '-_'), '=');

于 2016-05-16T14:18:21.807 回答