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

0tdrvxhp  于 2022-10-31  发布在  其他
关注(0)|答案(3)|浏览(207)

我已经完全按照nodemailer网站上的说明去做了,但是谷歌服务账户的OAuth2对我来说根本不起作用。
将“host”设置为www.example.com时出现ECONN超时 mail.google.com或将www.example.com用作主机时出现“401,user/pwd not accepted,can not create access token”(401,用户/密码未被接受,无法创建访问令牌)错误得某种组合smtp.gmail.com.

对于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);
});
});

这会产生错误:
535-5.7.8不接受用户名和密码。
但正如我提到的,我已经尝试了不同的配置和设置,并得到了同样多的不同的错误...
那么......有没有人成功地使用nodemailer为2LO使用服务帐户?
我正在使用节点9.5.0和节点邮件程序^4.6.0

vngu2lb8

vngu2lb81#

我让它工作(2021!),这些是步骤:
1.登录到控制台。-https://console.cloud.google.com/
1.在项目下创建服务帐户。
1.单击新服务帐户,转到“权限”并添加成员。发送请求时将使用此成员的电子邮件地址。
1.为服务帐户创建密钥。- keys -〉add key。https://console.cloud.google.com/iam-admin/serviceaccounts
1.下载你的密钥文件。你会得到类似service-account-name-accounttid.json这样的文件。它包含了你运行下面代码所需的所有信息。
1.将授权委托给您的服务帐户https://developers.google.com/identity/protocols/oauth2/service-account#delegatingauthority。添加https://mail.google.com/作为作用域。
1.编写如下代码:

const nodemailer = require('nodemailer');
const json = require('./service-account-name-accountid.json');

const sendEmail = async (email, subject, text) => {
    try {

        const transporter = nodemailer.createTransport({
            host: 'smtp.gmail.com',
            port: 465,
            secure: true,
            auth: {
                type: 'OAuth2',
                user: email, //your permissioned service account member e-mail address
                serviceClient: json.client_id,
                privateKey: json.private_key
            }
        });

        await transporter.verify();

        await transporter.sendMail({
                from: json.service_email,
                to: email, //you can change this to any other e-mail address and it should work!
                subject,
                text
        });
        console.log('success!');
        return {
            status : 200
        }

    } catch (error) {
        console.log(error);
        return {
            status : 500,
            error
        }
    }
}

sendEmail('your_permissioned_service_account_email_address@some_place.com, 'testing 123', 'woohoo!');
zf2sa74q

zf2sa74q2#

为什么?因为OAuth 2.0客户端ID凭据的默认范围之一是:

  1. email〈-只能查看电子邮件地址
    1.剖面图
    1.开放的
    如果要使用节点邮件程序发送电子邮件,则应包括以下范围:
    https://mail.google.com/
    而且这是一个敏感的范围,所以谷歌需要先验证它,否则你会收到一些委托错误消息。
    遵循this验证过程。
    并在consent page中添加作用域
    或者
    确保您是gsuite的管理员,然后给予您的服务帐户发送电子邮件的权限,或者管理员可以授予您的服务帐户发送电子邮件的权限。
    这个guide会有帮助的。它是日语的,只要把它翻译成英语就行了。
vbkedwbf

vbkedwbf3#

旧线程,但我已经得到了这个工作刚刚(经过大量的尝试)所以有兴趣的人的一些建议:
1.在云控制台中启用Gmail API
1.使用您的“普通”电子邮件地址作为用户(而不是服务帐户电子邮件)
1.在这里https://admin.google.com/ac/owl/domainwidedelegation并将你的服务客户端添加到列表中。在这里你必须输入你的client_id作为客户端名称部分,https://mail.google.com/作为API作用域。最后这部分很难找到,但最终让它对我有用。
而且,我发现这本指南很有帮助:在这里,您必须在"客户名称“部分键入client_id,在按”授权“之前键入https://mail.google.com/作为API作用域。

相关问题