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

时间:2018-02-27 23:21:51

标签: oauth-2.0 nodemailer two-legged

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

设置" host"时,我会获得ECONN超时mail.google.com " 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不接受用户名和密码。   但正如我所提到的,我尝试过不同的配置和设置,并得到了尽可能多的错误...

SO ...有没有人使用nodemailer成功使用2LO的服务帐户?

我使用节点9.5.0和nodemailer ^ 4.6.0

3 个答案:

答案 0 :(得分:0)

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

  1. 电子邮件<-只能查看电子邮件地址
  2. 个人资料
  3. openid

如果要使用节点邮件发送器发送电子邮件,则应包括以下范围:

  

https://mail.google.com/

,这是一个敏感范围,因此Google需要首先进行验证,否则您将收到一些委派错误消息。

遵循this验证过程。

并在consent page

中添加范围

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

guide会有所帮助。它是日语,只需将其翻译成英语即可。

答案 1 :(得分:0)

旧线程,但经过一些尝试,我现在可以正常工作了,因此对感兴趣的人有一些建议:

  1. 在云控制台中启用Gmail API
  2. 使用您的“普通”电子邮件地址作为用户(而不是服务帐户电子邮件)
  3. 转到此处https://admin.google.com/ac/owl/domainwidedelegation,然后将您的服务客户端添加到列表中。在这里,您将必须输入client_id作为Client Name部分,并输入https://mail.google.com/作为API作用域。这最后一部分很难找到,但最终使它对我有用。

此外,我发现本指南非常有用:在这里,您必须在按“授权”之前输入client_id作为“客户端名称”部分,并输入https://mail.google.com/作为API范围。

答案 2 :(得分:0)

我成功了(2021 年!),步骤如下:

  1. 登录控制台。- https://console.cloud.google.com/
  2. 在项目下创建一个服务帐户。
  3. 单击新的服务帐户,转到权限并添加成员。发送请求时,您将使用该成员的电子邮件地址。
  4. 为服务帐号创建密钥。 - 钥匙 -> 添加钥匙。 https://console.cloud.google.com/iam-admin/serviceaccounts
  5. 下载您的密钥文件。你会得到类似 service-account-name-accountid.json 的东西。它将包含运行以下代码所需的所有信息。
  6. 将权限委托给您的服务帐户 https://developers.google.com/identity/protocols/oauth2/service-account#delegatingauthority。添加https://mail.google.com/作为范围。
  7. 编写如下代码:

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!');