如何让 nodemailer 与服务帐户的 2LO 一起使用?

Lan*_*sey 5 two-legged oauth-2.0 nodemailer

我已按照 nodemailer 站点上的说明进行操作,但是 Google 服务帐户的 OAuth2 对我来说根本不起作用。

使用 smtp.gmail.com 作为主机时,我在将“主机”设置为 mail.google.com“401,用户/密码不接受,无法创建访问令牌”错误的某种组合时获得 ECONN 超时。

对于 3LO 似乎有无穷无尽的答案,但我没有为 2LO 的工作尝试过。现在,说了这么多。

var nodemailer = require("nodemailer");
var { google } = require("googleapis");

var accessToken;
var expires;
var key = require(“path/to/secrets.json");
var privateKey = key.private_key;

var jwtClient = new google.auth.JWT(key.client_email, null, key.private_key, ["https://mail.google.com/"], null);

jwtClient.authorize(function(err, tokens) {
    if (err) {
        return;
     } else {
    token = tokens
    accessToken = tokens.access_token //this **IS** a valid token
    expires = tokens.expiry_date
     }

 var transporter = nodemailer.createTransport({
        host: "smtp.gmail.com",
        port: 465,
        secure: true,
        auth: {
            type: "OAuth2",
            user: key.client_email, //I've also used my email here
            serviceClient: key.client_id,
            privateKey: privateKey,
            accessToken: accessToken,
            expires: expires,
        },
    });

var mailOptions = {
    from: “me@here.com”
    to: “me@there.com",
    subject: "Ready",
    text: “Really Ready"
    }

transporter.sendMail(mailOptions, function(error, info) {
    if (error) {
        return;
    }
    console.log("Message %s sent: %s", info.messageId, info.response);
});
});
Run Code Online (Sandbox Code Playgroud)

产生了错误:

535-5.7.8 不接受用户名和密码。但正如我所提到的,我尝试了不同的配置和设置,并得到了同样多不同的错误......

所以......有没有人成功地使用 nodemailer 为 2LO 使用服务帐户?

我正在使用节点 9.5.0 和节点邮件程序 ^4.6.0

小智 0

为什么?因为 OAuth 2.0 客户端 ID 凭据的默认范围如下:

  1. email <- 只能查看电子邮件地址
  2. 轮廓
  3. 开放ID

如果您想使用节点邮件程序发送电子邮件,它应该包含以下范围:

https://mail.google.com/

这是一个敏感范围,因此谷歌需要首先验证它,否则您将收到一些委托错误消息。

请遵循验证过程。

并在同意页面中添加范围

或者

确保您是 gsuite 的管理员,然后授予您的服务帐户发送电子邮件的权限,或者管理员可以授予您的服务帐户发送电子邮件的权限。

指南会有所帮助。是日文的,直接翻译成英文就可以了。