2014-06-27 63 views
16

我正在尝试新的Gmail REST API如何使用新的Gmail REST API成功发送消息?

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

首先我授权。 enter image description here

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

{  
    "raw": "c2VuZGluZyBhIG1haWwgdXNpbmcgR21haWwgUkVTVCBBUEk=", 
    "payload": { 
    "headers": [ 
     { "name": "to",  "value": "[email protected]" }, 
     { "name": "from", "value": "[email protected]" }, 
     { "name": "subject", "value": "Test Gmail REST API" } 
    ], 
    "mimeType": "text/plain" 
    } 
} 

我也得到一个200 OK及以下结果回来,这看起来不错。

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

但是,邮件将无法发送成功,我可以在收件箱中;:"An error occurred, your message has not been sent."

enter image description here

问题找到[email protected]的消息:
1.是否有人测试这成功了吗?
2.我必须添加一些其他参数才能使其运行?



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

  1. 上传URI为媒体上传请求,并且
  2. 元数据URI为仅元数据请求

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

+0

肯定,我当然第一个授权请求,否则我想我不会得到一个'200 OK'回来... – Taifun

+0

@Taifun,你是如何创建的RFC 2822字符串,是否有任何图书馆或硬编码它,任何例子? – Sasikanth

+0

@Sasikanth这取决于你最喜欢的编程语言。 [看我下面的答案](http://stackoverflow.com/a/24461102/1545993)如何网络安全的base64编码完整的消息 – Taifun

回答

40

明白了!

阅读RFC 2822 specification后我才发现,需要完整的消息在raw参数传递,看到的例子:

From: John Doe <[email protected]> 
To: Mary Smith <[email protected]> 
Subject: Saying Hello 
Date: Fri, 21 Nov 1997 09:55:06 -0600 
Message-ID: <[email protected]> 

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

编码完整信息的base64所以以后,通过它在raw参数没有使用任何其他参数,它工作正常。

编辑1:
作为@Amit提到的,它必须是网络安全base64编码,又见https://code.google.com/p/stringencoders/wiki/WebSafeBase64

所以要以base64阿尔法转换成格式是“基于web安全”的 以下更改建议:

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

要只CON对我而言,+-/_就足够了。

编辑2:
要在这里回答@Hjulle问题的例子:你只需要userId和请求主体的raw参数。假设,你的电子邮件地址是[email protected]

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

RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h 
cnlAZXhhbXBsZS5uZXQ+IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92 
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh 
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4= 

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

RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h 
cnlAZXhhbXBsZS5uZXQ-IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92 
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh 
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4= 

现在传递给API Explorer的raw参数。

+1

需要的网址编码。 http://stackoverflow.com/questions/22128789/converting-string-to-web-safe-base64-format –

+0

https://gist.github.com/AkashkumarDev/20ab002e7f5785ae778e 任何想法在哪里是问题? – akdev

+0

@akdev对于问题请发起一个新问题,而不是在这里评论。谢谢。 – Taifun

1

注:这是一个PHP特定的答案,但我相信你们中的一些人会觉得它有用。

如果您正在努力在PHP中正确设置原始数据,那么使用PHPMailer会使您的工作变得更简洁,更轻松。 ,你设置的基本细节:

$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(); 

,包括在你的代码库(在你的composer.json的要求部分“〜5.2”,如果你使用的作曲家,只需添加“的PHPMailer/PHPMailer的”)后

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

相关问题