仅使用令牌发送包含Gmail API的电子邮件?

时间:2015-10-01 14:46:53

标签: angularjs api google-api gmail gmail-api

我正在尝试使用Google的API发送电子邮件。我有一个由AngularJS提供支持的Web应用程序,用户使用oauth2登录他们的谷歌帐户(通过passport.js)。新的访问令牌将写入我的数据库中的帐户。他们的谷歌用户ID也写入他们的帐户。我希望用户只需使用用户ID和访问令牌即可通过HTTP请求发送电子邮件。我正在使用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"
}

我有一些电子邮件间歇性地使用这种方法,但我似乎无法确定地重新创建成功的请求。我对Google的文档感到有些困惑。我是否需要明确授予访问权限,如this page底部的示例所示?

1 个答案:

答案 0 :(得分:3)

您提到的access token需要出现在POST中 - 请求您发送邮件。 Oauth2 - procotol规定您需要传递标题Authorization: Bearer <ACCESS_TOKEN>或参数access_token=<ACCESS_TOKEN>

raw的值也必须是有效的base64-encoded rfc822邮件。 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, '_');

这将导致您在请求正文中用作raw的字符串。

Postman中的请求将如下所示:

POST https://www.googleapis.com/gmail/v1/users/me/messages/send?access_token=<ACCESS_TOKEN>

{ // The encoded mail from the example above.
 "raw": "Q29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJVVEYtOCIKTUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdApTdWJqZWN0OiBTdWJqZWN0IG9mIHRoZSBtYWlsCkZyb206IHNlbmRlckBnbWFpbC5jb20KVG86IHJlY2lldmVyQGdtYWlsLmNvbQoKVGhpcyBpcyB3aGVyZSB0aGUgbWFpbCB0ZXh0IHdpbGwgZ28="
}

您还需要提供Content-Type - 标头,其值为application/json。请注意,您不必使用userId。提供me将使Google自动使用与提供的访问令牌关联的用户。

另外,请确保您要求使用Passport获得足够的权限scopehttps://mail.google.com/可以使用。