我目前正在尝试测试新的 Gmail REST API。
在 API Explorer 中,可以使用 OAuth 2.0 授权请求并执行请求,即发送消息。
首先我授权了。
我正在使用以下测试数据(当然我使用了有效的
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",
}
但是邮件不会发送成功,我可以在收件箱中找到来自
[email protected]
的消息;:"An error occurred, your message has not been sent."
问题:
1.有人测试成功了吗
2. 我是否需要添加一些其他参数才能使其运行?
编辑:有2种不同的HTTP请求方法,
The API Explorer currently supports metadata requests only
,这意味着没有附件的纯文本消息,这就是我正在尝试做的。
明白了!
阅读了RFC 2822规范后我发现,完整的消息需要在
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 alpha 转换为“网络安全”的格式 建议进行以下更改:
+ --> - (char 62, plus to dash) / --> _ (char 63, slash to underscore) = --> * padding
仅将
+
转换为 -
并将 /
转换为 _
对我来说就足够了。
编辑2:
要回答@Hjulle 的问题,这里举一个例子:您只需要
userId
并在请求正文中使用 raw
参数。假设您的电子邮件地址是 [email protected]
首先使用在线编码器对完整消息进行 Base64 编码(见上文),然后您将得到以下字符串:
RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h
cnlAZXhhbXBsZS5uZXQ+IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4=
现在将
+
转换为 -
并将 /
转换为 _
你会得到
RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h
cnlAZXhhbXBsZS5uZXQ-IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4=
现在将其传递到 API Explorer 的
raw
参数中。
这对我有用
网址:
https://www.googleapis.com/upload/gmail/v1/users/me/messages/send
(POST 方法)
标题中:- “
Authorization
”:“Bearer ya29.Il-iBylW9AUr6V0QO72ryo17r7hf8i5zh8dU63ZjDNaxAApumh6T7lh20my_DQZomtL_qokZnJEgapYN20LmdlG6lFbqGASL5lqFAKnOoUtZA992JwOlUQxMVW6_Yto7jQ
”,
“Content-Type
”:“message/rfc822
”
体内:-
{"raw": "From: <[email protected]>
To: <[email protected]>
Subject: Saying Hello
This is a message just to say hello. So, "Hello"."}
注意:这是 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,以获得有效的网络安全编码字符串。
rtrim(strtr(base64_encode($mime), '+/', '-_'), '=');
您也可以将其作为消息发送。 例如
POST https://www.googleapis.com/upload/gmail/v1/users/me/messages/send
Headers:-
"Authorization":"Bearer <Your-Token>",
"Content-Type" : "message/rfc822"
Body:
"From: <[email protected]>
To: <[email protected]>
Subject: Saying Hello
This is a message just to say hello. So, 'Hello'"