我正在尝试使用Nodemailer 3制作一个简单的邮件发件人,这是GMail API的OAuth2身份验证。
这是我的剧本:
var serverConfig = {
gmail: {
client_user : 'my@email.com',
client_id : '349...myClientId',
secret : 'mysecret..123jd123',
refresh_token : 'x/xxxxxxxxxxxxxx-reZuEMeSuJaSERmCVY',
access_token : 'xxxxxxxxxxxxxxxxx',
expires: '3599'
}
}
// 3LO authentication https://nodemailer.com/smtp/oauth2/#example-3
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
type: 'OAuth2',
user: serverConfig.gmail.client_user,
clientId: serverConfig.gmail.client_id,
clientSecret: serverConfig.gmail.secret,
refreshToken: serverConfig.gmail.refresh_token
},
});
module.exports = {
"send": function(_from,_to,_subject,_html,_text){
// setup email data with unicode symbols
var mailOptions = {
from: _from,
to: _to, // list of receivers
subject: _subject, // Subject line
html: _html, // html body
text: _text // plain text body
};
transporter.sendMail(mailOptions, function(error, info){
if (error) {
return console.log(error);
}
console.log('Message ' + info.messageId + ' sent: %s' + info.response);
})
}
}
当我强制使用auth对象中的access_token时,会发送电子邮件没有任何问题。但是,当我没有指定access_token
,只指定de refresh_token
时,我收到此错误:
{ Error: Invalid status code 401
at ClientRequest.req.on.res (/myproject/node_modules/nodemailer/lib/fetch/index.js:193:23)
at emitOne (events.js:96:13)
at ClientRequest.emit (events.js:188:7)
at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:474:21)
at HTTPParser.parserOnHeadersComplete (_http_common.js:99:23)
at TLSSocket.socketOnData (_http_client.js:363:20)
at emitOne (events.js:96:13)
at TLSSocket.emit (events.js:188:7)
at readableAddChunk (_stream_readable.js:176:18)
at TLSSocket.Readable.push (_stream_readable.js:134:10)
type: 'FETCH',
sourceUrl: 'https://accounts.google.com/o/oauth2/token',
code: 'EAUTH',
command: 'AUTH XOAUTH2' }
答案 0 :(得分:0)
也许为时已晚,但只是在这里回答,有人遇到同样的问题。重置refreshToken时我的问题得到纠正。 This article为整个过程提供了很好的指导
答案 1 :(得分:0)
通过转到 https://console.cloud.google.com/apis/credentials,选择正确的 OAuth 2.0 客户端 ID,然后选择顶部的“重置密码”,我能够解决此问题。这撤销了我的旧秘密并生成了一个新秘密,然后我在 OAuth Playground 中使用它来交换刷新令牌。我将新的 Client Secret 和 Refresh Token 放在 nodemailer 的 auth 对象中,然后它又开始工作了。