我正在使用最新的(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本身正在发展(消息对资源等)。因此,一些在线信息 - 包括谷歌自己的文档 - 可以理解是不一致的。我正在寻找任何建议,因为错误似乎非常通用。
答案 0 :(得分:5)
确定。 "问题"是我自己造的。解决方案有三个(或四个)简单部件。只是不要试图跳过任何一个。
tl;博士,但你仍然需要阅读!这是working gist。
尽管您可以在其他地方阅读,但 可以将Gmail API与服务帐户一起使用 - 前提是您拥有Google Apps帐户。 (我这样做。)这意味着您不必乱用OAuth重定向来让您的服务器发送电子邮件。这是通过模仿来实现的。 [注:如果您没有Google Apps域,则可能应该再次问自己为什么要在Gmail中使用服务帐户;毕竟,每封电子邮件都是由发件人和收件人共同拥有的,即使其中一个或两个都是机器人。]
以下是您需要做的事情:
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调用。
我希望这能为你节省半天时间。