我已按照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
答案 0 :(得分:0)
为什么?因为您的OAuth 2.0客户端ID凭据的默认范围是:
如果要使用节点邮件发送器发送电子邮件,则应包括以下范围:
,这是一个敏感范围,因此Google需要首先进行验证,否则您将收到一些委派错误消息。
遵循this验证过程。
中添加范围或
确保您是gsuite的管理员,然后授予您的服务帐户访问发送电子邮件的权限,或者管理员可以授予您的服务帐户访问发送电子邮件的权限。
此guide会有所帮助。它是日语,只需将其翻译成英语即可。
答案 1 :(得分:0)
旧线程,但经过一些尝试,我现在可以正常工作了,因此对感兴趣的人有一些建议:
此外,我发现本指南非常有用:在这里,您必须在按“授权”之前输入client_id作为“客户端名称”部分,并输入https://mail.google.com/作为API范围。
答案 2 :(得分:0)
我成功了(2021 年!),步骤如下:
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!');