Angularjs 用Gmail发送电子邮件';s API是否仅使用令牌?

Angularjs 用Gmail发送电子邮件';s API是否仅使用令牌?,angularjs,api,google-api,gmail,gmail-api,Angularjs,Api,Google Api,Gmail,Gmail Api,我正在尝试使用谷歌的API发送电子邮件。我有一个由AngularJS支持的web应用程序,用户使用oauth2使用他们的google帐户(通过passport.js)登录。一个新的访问令牌被写入他们在我的数据库上的帐户。他们的谷歌用户ID也会写入他们的帐户。我希望用户能够通过HTTP请求发送电子邮件,只需使用他们的用户Id和访问令牌。我正在使用Postman发出一些测试请求,但我不断收到以下错误: { "error": { "errors": [ { "d

我正在尝试使用谷歌的API发送电子邮件。我有一个由AngularJS支持的web应用程序,用户使用oauth2使用他们的google帐户(通过passport.js)登录。一个新的访问令牌被写入他们在我的数据库上的帐户。他们的谷歌用户ID也会写入他们的帐户。我希望用户能够通过HTTP请求发送电子邮件,只需使用他们的用户Id和访问令牌。我正在使用Postman发出一些测试请求,但我不断收到以下错误:

{
  "error": {
    "errors": [
      {
        "domain": "global",
        "reason": "insufficientPermissions",
        "message": "Insufficient Permission"
      }
    ],
    "code": 403,
    "message": "Insufficient Permission"
  }
}
我正在使用以下链接发出POST请求:

https://content.googleapis.com/gmail/v1/users/106xxxxxxxxxxx/messages/send
在我的标题中,我有:

Authorization: Bearer yaxx._wxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/json
我的身体:

{
 "raw": "test"
}

我曾经收到过一些使用这种方法间歇性发送的电子邮件,但我似乎无法确定地重新创建一个成功的请求。我对谷歌的文档有点困惑。我是否需要明确授予访问权限,如下面的示例所示?

您提到的
访问令牌需要出现在您发送邮件的
POST
请求中。-procotol指示您需要传递头
授权:无记名邮件。JavaScript中的示例如下所示:

// Base64-encode the mail and make it URL-safe 
// (replace all "+" with "-" and all "/" with "_")
var encodedMail = btoa(
      "Content-Type: text/plain; charset=\"UTF-8\"\n" +
      "MIME-Version: 1.0\n" +
      "Content-Transfer-Encoding: 7bit\n" +
      "Subject: Subject of the mail\n" +
      "From: sender@gmail.com\n" +
      "To: reciever@gmail.com\n\n" +

      "This is where the mail text will go"
    ).replace(/\+/g, '-').replace(/\//g, '_');
POST https://www.googleapis.com/gmail/v1/users/me/messages/send?access_token=<ACCESS_TOKEN>

{ // The encoded mail from the example above.
 "raw": "Q29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJVVEYtOCIKTUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdApTdWJqZWN0OiBTdWJqZWN0IG9mIHRoZSBtYWlsCkZyb206IHNlbmRlckBnbWFpbC5jb20KVG86IHJlY2lldmVyQGdtYWlsLmNvbQoKVGhpcyBpcyB3aGVyZSB0aGUgbWFpbCB0ZXh0IHdpbGwgZ28="
}
这将产生一个字符串,用作请求正文中的
raw

Postman中的请求将如下所示:

// Base64-encode the mail and make it URL-safe 
// (replace all "+" with "-" and all "/" with "_")
var encodedMail = btoa(
      "Content-Type: text/plain; charset=\"UTF-8\"\n" +
      "MIME-Version: 1.0\n" +
      "Content-Transfer-Encoding: 7bit\n" +
      "Subject: Subject of the mail\n" +
      "From: sender@gmail.com\n" +
      "To: reciever@gmail.com\n\n" +

      "This is where the mail text will go"
    ).replace(/\+/g, '-').replace(/\//g, '_');
POST https://www.googleapis.com/gmail/v1/users/me/messages/send?access_token=<ACCESS_TOKEN>

{ // The encoded mail from the example above.
 "raw": "Q29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJVVEYtOCIKTUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdApTdWJqZWN0OiBTdWJqZWN0IG9mIHRoZSBtYWlsCkZyb206IHNlbmRlckBnbWFpbC5jb20KVG86IHJlY2lldmVyQGdtYWlsLmNvbQoKVGhpcyBpcyB3aGVyZSB0aGUgbWFpbCB0ZXh0IHdpbGwgZ28="
}
POSThttps://www.googleapis.com/gmail/v1/users/me/messages/send?access_token=
{//上面示例中的编码邮件。
“原始”:“Q29UDGVUDC1UEXBLOB0ZXH0L3BSYWLOOYBJAGFYC2V0PSJVVEYTOCIKTULNRS1WZXJZAW9UOAXLJAKQ29UDGVUDC1UcmFUC2ZLCI1FBMvZGLUZZZZZGN2JPDAPTDWJQZWN0OIBTDWJQZWN0IG9MIHROZSBTYWLSCKZYB206IHNLBMRLCKBWFBC5JB20KVG86IHY2LLDmYQGDYBYBYBG0GBZ28=”
}
您还需要为
内容类型
-标题提供
application/json
的值。请注意,您不必使用用户标识。提供
me
将使Google自动使用与提供的访问令牌关联的用户


还要确保您对Passport请求了足够的权限
scope
<代码>https://mail.google.com/
可以用。

谢谢,但我收到了相同的错误响应。这是我的邮递员HTTP请求的副本
POST/gmail/v1/users/me/messages/send?access_token=ya29.xxxxxxxxxxxxxxx HTTP/1.1主机:www.googleapis.com内容类型:应用程序/json缓存控制:无缓存邮差令牌:c152b250-b38f-7280-6466-xxxxxxxxxxxxx{“原始”:“Q29UDGVUDC1UEXBLOB0ZXH0L3BSYULOYBJAGFYC2V0PSJVEYTOCIKTURNRS1WZJZAW9UOXLJAKQ29UDGVUDC1UCMFUC2ZLCI1FBMWZGZLZLZLZLZNG2JPDAPTDWWJQZWN0IG9MIHROZSBTYWLSCKZYB206IHNLBMRLCKBNBFBC5JB20KVG86IHJLY2LLDmVYQGDTYWLSVYBZLZLZLZLZLZLZLKZLKVYBYBZYBZYBZZYBZZZLZLZZZZLKZZZZZZVYBG0GBG28=””””=“IH
@MikeJoyce更新了答案:)@Throlle:你的答案对我很有用,但我想知道你从哪里得到这些不同的字段。我甚至在GMail API中都找不到documentation@WaelShowairgmail api文档中规定了所需的范围和原始字段必须是url安全的base64编码字符串应该放置的是oauth2约定。不过,我在各种SO问题上发现了这一点。@Thole:所以这更成为我问题的核心-范围可以放置在同一个HTTP请求中吗?从字面上看,可以从postman处执行此操作,而无需明确授予应用程序权限。