gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:35:13 25 4
gpt4 key购买 nike

我已按照 nodemailer 网站上的说明进行操作,但用于 google 服务帐户的 OAuth2 根本不适合我。
将“主机”设置为 mail.google.com 时,我得到 ECONN 超时或 使用 smtp.gmail.com 作为主机时出现“401,不接受用户/密码,无法创建访问 token ”错误的组合。

  • 我用这个作为我的模板:
    http://nodemailer.com/smtp/oauth2/#example-4
  • 我已经设置了一个服务帐号:https://developers.google.com/identity/protocols/OAuth2ServiceAccount
  • 我已经启用了 gmail api。
  • 我创建了验证 token :
    https://www.googleapis.com/oauth2/v1/tokeninfo
  • 我也尝试过使用 xoauth2 npm 包生成 token ,但失败了...
  • 我也在 this question 中尝试了答案,但仍然没有运气...

  • 对于 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 Username and Password not accepted.


    但正如我所提到的,我尝试了不同的配置和设置,并得到了同样多的不同错误......
    所以...有没有人成功地使用 nodemailer 为 2LO 使用服务帐户?
    我正在使用节点 9.5.0 和 nodemailer ^4.6.0

    最佳答案

    我让它工作了(2021 年!),这些是步骤:

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


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

    关于javascript - 如何让 nodemailer 与 2LO 一起使用服务帐户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49019574/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com