带有nodeJS的GMail API - send给出400 Bad Request

时间:2016-06-18 22:00:17

标签: gmail-api

我正在使用最新的(0.9.8)google-api-nodejs-client库进行nodeJS。 我使用服务帐户进行身份验证,并将JWT限定为https:\\googleapis.com/auth/gmail.send(以及/ auth / drive FWIW)。

我尝试发送电子邮件(base64urlencoded),如下所示:

req = mail.users.messages.send(
  {
    auth:   jwtClient,           // really works with google drive
    userId: actual@gmail.com     // actually a legit gmail address
    resource: {
      raw: message               // base64encode(urlencode(RFC822 msg))
    }
  }, (err, res) => { console.log(err); }
);

并且回调收到了这个非常有用的对象:

{"code": 400,"errors":[{"domain":"global","reason":"failedPrecondition","message":"Bad Request"}]}

我知道google-api-nodejs-client是alpha并且GMail API本身正在发展(消息对资源等)。因此,一些在线信息 - 包括谷歌自己的文档 - 可以理解是不一致的。我正在寻找任何建议,因为错误似乎非常通用。

1 个答案:

答案 0 :(得分:5)

确定。 "问题"是我自己造的。解决方案有三个(或四个)简单部件。只是不要试图跳过任何一个。

tl;博士,但你仍然需要阅读!这是working gist

尽管您可以在其他地方阅读,但 可以将Gmail API与服务帐户一起使用 - 前提是您拥有Google Apps帐户。 (我这样做。)这意味着您不必乱用OAuth重定向来让您的服务器发送电子邮件。这是通过模仿来实现的。 [注:如果您没有Google Apps域,则可能应该再次问自己为什么要在Gmail中使用服务帐户;毕竟,每封电子邮件都是由发件人和收件人共同拥有的,即使其中一个或两个都是机器人。]

以下是您需要做的事情:

  1. 拥有Google Apps帐户。见上文。
  2. 按照here的说明操作。
  3. 为您在步骤2中配置的服务帐户启用对Google Apps域的API访问。步骤2中的链接包含这些说明。但重要的是重要。
  4. 像这样生成你的JWT:
  5. var jwtClient = new google.auth.JWT(
      serviceaccount_key.client_email
      , null
      , serviceaccount_key.private_key
      , [
        'https://www.googleapis.com/auth/gmail.readonly'
        , 'https://www.googleapis.com/auth/gmail.send'
      ]
      , 'user@your_google_apps_domain' // a legit user
    )
    

    您需要的范围取决于您希望在Google Apps域中启用的API调用。

    我希望这能为你节省半天时间。