我已经完全按照nodemailer网站上的说明去做了,但是谷歌服务账户的OAuth2对我来说根本不起作用。
将“host”设置为www.example.com时出现ECONN超时 mail.google.com或将www.example.com用作主机时出现“401,user/pwd not accepted,can not create access token”(401,用户/密码未被接受,无法创建访问令牌)错误得某种组合smtp.gmail.com.
- 我用这个作为我的模板:http://nodemailer.com/smtp/oauth2/#example-4
- 我已经设置了一个服务帐户:https://developers.google.com/identity/protocols/OAuth2ServiceAccount
- 我已经启用了gmail api。
- 我创建了验证以下内容的令牌:https://www.googleapis.com/oauth2/v1/tokeninfo
- 我也尝试了xoauth 2 npm包来生成令牌,但失败了...
- 我也试过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不接受用户名和密码。
但正如我提到的,我已经尝试了不同的配置和设置,并得到了同样多的不同的错误...
那么......有没有人成功地使用nodemailer为2LO使用服务帐户?
我正在使用节点9.5.0和节点邮件程序^4.6.0
3条答案
按热度按时间vngu2lb81#
我让它工作(2021!),这些是步骤:
1.登录到控制台。-https://console.cloud.google.com/
1.在项目下创建服务帐户。
1.单击新服务帐户,转到“权限”并添加成员。发送请求时将使用此成员的电子邮件地址。
1.为服务帐户创建密钥。- keys -〉add key。https://console.cloud.google.com/iam-admin/serviceaccounts
1.下载你的密钥文件。你会得到类似service-account-name-accounttid.json这样的文件。它包含了你运行下面代码所需的所有信息。
1.将授权委托给您的服务帐户https://developers.google.com/identity/protocols/oauth2/service-account#delegatingauthority。添加
https://mail.google.com/
作为作用域。1.编写如下代码:
zf2sa74q2#
为什么?因为OAuth 2.0客户端ID凭据的默认范围之一是:
1.剖面图
1.开放的
如果要使用节点邮件程序发送电子邮件,则应包括以下范围:
https://mail.google.com/
而且这是一个敏感的范围,所以谷歌需要先验证它,否则你会收到一些委托错误消息。
遵循this验证过程。
并在consent page中添加作用域
或者
确保您是gsuite的管理员,然后给予您的服务帐户发送电子邮件的权限,或者管理员可以授予您的服务帐户发送电子邮件的权限。
这个guide会有帮助的。它是日语的,只要把它翻译成英语就行了。
vbkedwbf3#
旧线程,但我已经得到了这个工作刚刚(经过大量的尝试)所以有兴趣的人的一些建议:
1.在云控制台中启用Gmail API
1.使用您的“普通”电子邮件地址作为用户(而不是服务帐户电子邮件)
1.在这里https://admin.google.com/ac/owl/domainwidedelegation并将你的服务客户端添加到列表中。在这里你必须输入你的client_id作为客户端名称部分,https://mail.google.com/作为API作用域。最后这部分很难找到,但最终让它对我有用。
而且,我发现这本指南很有帮助:在这里,您必须在"客户名称“部分键入client_id,在按”授权“之前键入https://mail.google.com/作为API作用域。