GSuite 错误:无法为用户创建新的访问令牌 - OAuth2 节点邮件程序



我试图通过nodejs的gmail发送电子邮件,但我一直遇到这个错误。

Error: Can't create new access token for user
at XOAuth2.generateToken(c: appsnodemyappnode_modulesnodemailerlibxoauth2index.js: 184: 33)
at XOAuth2.getToken(c: appsnodemyappnode_modulesnodemailerlibxoauth2index.js: 123: 18)
at SMTPConnection._handleXOauth2Token(c: appsnodemyappnode_modulesnodemailerlibsmtp - connectionindex.js: 1697: 27)
at SMTPConnection.login(c: appsnodemyappnode_modulesnodemailerlibsmtp - connectionindex.js: 540: 22)
at c: appsnodemyappnode_modulesnodemailerlibsmtp - transportindex.js: 374: 32
at SMTPConnection.<anonymous>(c: appsnodemyappnode_modulesnodemailerlibsmtp - connectionindex.js: 215: 17)
at Object.onceWrapper(events.js: 420: 28)
at SMTPConnection.emit(events.js: 314: 20)
at SMTPConnection._actionEHLO(c: appsnodemyappnode_modulesnodemailerlibsmtp - connectionindex.js: 1313: 14)
at SMTPConnection._processResponse(c: appsnodemyappnode_modulesnodemailerlibsmtp - connectionindex.js: 942: 20)
at SMTPConnection._onData(c: appsnodemyappnode_modulesnodemailerlibsmtp - connectionindex.js: 749: 14)
at TLSSocket.SMTPConnection._onSocketData(c: appsnodemyappnode_modulesnodemailerlibsmtp - connectionindex.js: 195: 44)
at TLSSocket.emit(events.js: 314: 20)
at addChunk(_stream_readable.js: 304: 12)
at readableAddChunk(_stream_readable.js: 280: 9)
at TLSSocket.Readable.push(_stream_readable.js: 219: 10) {
code: 'EAUTH',
command: 'AUTH XOAUTH2'
}

我已经建立了我的G Suite帐户,创建了一个服务帐户,并为该项目启用了Gmail API。我还为服务帐户启用了G-Suite域范围的委派,并将客户端ID和适当的范围添加到我的G-Suite帐户中。

我下载了我的凭据文件,并将其重命名为使用.js,这样我就可以将其作为ES模块导入。

import nodemailer from "nodemailer";
import * as key from "../credentials.js";
const SENDER_EMAIL = "support@domain.com";
const RECEIVER_EMAIL = "customer@gmail.com";
async function start() {
const transporter = nodemailer.createTransport({
host: "smtp.gmail.com",
port: 465,
secure: true,
auth: {
type: "OAuth2",
user: SENDER_EMAIL,
serviceClient: key.client_id,
privateKey: key.private_key,
},
});
try {
await transporter.verify();
await transporter.sendMail({
from: SENDER_EMAIL,
to: RECEIVER_EMAIL,
subject: "Hello Humans",
text: "The quick brown fox jumps over the lazy dog.",
});
} catch (err) {
console.error(err);
}
}
export default start;

现在,调用start()时会出现上述消息。我想不通。帮助

我希望你在11个月前解决了你的问题,但对于那些发现这个问题的人来说,我也遇到了同样的问题,并在这里找到了答案。我相信这可能是你的情况,特别是因为你提到硬编码的价值确实有效。

显然,私钥中的n在以这种方式使用时会带来一些问题。在我的情况下,我从Firebase运行时配置中获取私钥值,并在该链接中遵循以下建议,我最终在密钥上获得了replace(/\n/g, 'n')

const nodemailerTransporter = nodemailer.createTransport({
host: env.nodemailer.host,
port: 465,
secure: true, // true for TLS 465, false for other ports
auth: {
type: "OAuth2",
user: env.nodemailer.user,
serviceClient: env.nodemailer.clientid,
privateKey: env.nodemailer.privatekey.replace(/\n/g, 'n'),  // <=== HERE
accessUrl: env.nodemailer.tokenuri, // <== HERE
},
});

这确实有效。我用的是"host": "smtp-relay.gmail.com",但你的smtp.gmail.com也是一样。

还要考虑accessUrl(token_uri取自credentials.json(:

"token_uri": "https://oauth2.googleapis.com/token"

这与nodemailer使用的默认值(https://accounts.google.com/o/oauth2/token(不同。IDK,如果这很重要的话。

最新更新