5

我已按照 nodemailer 网站上的说明进行操作,但用于 google 服务帐户的 OAuth2 根本不适合我。

将“主机”设置为 mail.google.com 时出现 ECONN 超时,或者在使用 smtp.gmail.com 作为主机时出现“401,不接受用户/密码,无法创建访问令牌”错误。

对于 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 和 nodemailer ^4.6.0

4

3 回答 3

1

我让它工作了(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!');
于 2021-06-09T16:37:04.243 回答
0

旧线程,但我现在才开始工作(经过大量尝试),所以对任何感兴趣的人有一些建议:

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

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

于 2020-09-01T08:37:46.633 回答
0

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

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

如果你想使用 node mailer 发送电子邮件,它应该包括这个范围:

https://mail.google.com/

这是一个敏感范围,所以谷歌需要先验证它,否则你会收到一些委托错误消息。

遵循验证过程。

并在同意页面中添加范围

或者

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

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

于 2019-04-29T19:42:32.303 回答