【问题标题】:GMail API with nodeJS - send gives 400 Bad Request带有 nodeJS 的 GMail API - 发送给出 400 错误请求
【发布时间】:2016-10-20 11:58:40
【问题描述】:

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

我尝试像这样发送电子邮件(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 本身正在发展(消息与资源等)。因此,一些在线信息——包括谷歌自己的文档——不一致是可以理解的。我正在寻找任何建议,因为错误似乎很笼统。

【问题讨论】:

  • 更新:我也得到了users.labels.list({auth: jwtClient, userId: 'me'}) 的(400,错误请求)。暂时将auth 设置为 null 会出现权限错误,所以我知道我的 JWT 很好。如果我改为为用户(不是我的服务帐户)使用 OAuth2,我得到的标签就好了。我会说我对服务帐户做了一些全局错误,但我可以使用相同的 JWT list() 和 create() Google Drive 文档,没问题。 ???
  • 好的,看起来 (github.com/google/google-api-nodejs-client/issues/399) 可能 GMail 只能与 OAuth2 客户端 ID 一起使用,而不能与服务帐户一起使用。我将设置域范围的委派,为服务帐户创建一个客户端 ID,然后使用该客户端 ID 尝试 GMail。

标签: gmail-api


【解决方案1】:

好的。 “问题”是我自己造成的。解决方案分为三个(或四个)简单的部分。只是不要尝试跳过任何内容。

tl;dr,但您仍然需要阅读!这是working gist

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

这是你需要做的:

  1. 拥有 Google Apps 帐户。见上文。
  2. 按照说明here 进行操作。
  3. 为您在上面第 2 步中配置的服务帐户启用对您的 Google Apps 域的 API 访问。第 2 步中的链接包含这些说明。但重要的是要重复一遍。
  4. 像这样生成您的 JWT:
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
)

您需要的范围取决于您要进行的 API 调用并且已在您的 Google Apps 域中启用。

我希望这可以为您节省半天时间。

【讨论】:

  • 您是否需要 GSuite 才能使其正常工作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 2019-12-22
  • 2021-09-25
  • 1970-01-01
  • 2018-06-07
相关资源
最近更新 更多