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

问题描述 投票:0回答:4

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

但是邮件不会发送成功,我可以在收件箱中找到来自

[email protected]
的消息;:
"An error occurred, your message has not been sent."

enter image description here

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



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

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

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

rest gmail gmail-api
4个回答
63
投票

明白了!

阅读了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
参数中。


3
投票

这对我有用

网址:

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"."}

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,以获得有效的网络安全编码字符串。

rtrim(strtr(base64_encode($mime), '+/', '-_'), '=');


1
投票

您也可以将其作为消息发送。 例如

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'"
© www.soinside.com 2019 - 2024. All rights reserved.