如何使用新的Gmail REST API成功发送邮件?

时间:2014-06-27 20:38:02

标签: rest gmail gmail-api

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

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

首先我授权。 enter image description here

我正在使用以下测试数据(当然我使用了有效的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."

enter image description here

问题:
1。有人测试过这个吗?
2.我是否必须添加其他参数才能使其运行?



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

  1. 媒体上传请求的上传URI,以及
  2. 仅元数据请求的元数据URI
  3. The API Explorer currently supports metadata requests only,这意味着没有附件的纯文本邮件,这就是我想要做的。

3 个答案:

答案 0 :(得分:50)

得到了它!

在阅读我发现的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转换为“web-safe”格式   建议进行以下更改:

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

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

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

First Base64使用online encoder编码完整的消息(见上文),你得到这个字符串:

RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h
cnlAZXhhbXBsZS5uZXQ+IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4=

现在将+转换为-,将/转换为_即可

RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h
cnlAZXhhbXBsZS5uZXQ-IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4=

现在在API Explorer的raw参数中传递此内容。

答案 1 :(得分: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), '+/', '-_'), '=');

答案 2 :(得分:0)

这对我有用

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