【发布时间】:2017-12-20 16:43:24
【问题描述】:
我正在创建一个 Twitter 机器人,并且我正在实现一个在出现错误时向我发送电子邮件的方法。由于我已经在使用 google API 访问 Google Drive(这里没有问题),我决定使用服务帐户发送电子邮件(Google 控制台说可以这样使用)
到目前为止,我想出的发送电子邮件的方法是:
var config = require('./config/mail');
var google = require('./config/google');
var nodemailer = require('nodemailer');
var send = function (args) {
let transporter = nodemailer.createTransport({
'service': 'gmail',
'auth': {
'type': 'OAuth2',
'user': google.client_email,
'serviceClient': google.client_id,
'privateKey': google.private_key
}
});
transporter.on('token', token => console.log(token));
let message = {
'from': `"${config.serverFromName}" <${config.serverFromMail}>`,
'to': args.to,
'subject': args.subject,
'text': args.text,
'html': `<p>${args.text}</p>`
};
transporter.sendMail(message, (err, info) => {
if (err) {
console.log('Mail couldn\'t be sent because: ' + err);
} else {
console.log('Mail sent');
}
});
};
config/google 文件包含 Google 在您创建服务帐户时为您生成的数据。 config.serverFromName 和 config.serverFromMail 是发件人的姓名和电子邮件(与服务帐户 ID 不同)。 args 包含收件人电子邮件和内容
当我测试发送方法时,我在控制台中收到以下消息:
Mail couldn't be sent because: Error: Invalid login: 535-5.7.8 Username and Password not accepted. Learn more at
535 5.7.8 https://support.google.com/mail/?p=BadCredentials z123sm543690vkd.10 - gsmtp
我知道令牌正在正确创建,因为我创建的侦听器正在打印它:
{ user: 'name@project.iam.gserviceaccount.com',
accessToken: 'ya29.ElmIBLxzfU_kkuZeyISeuRBeljmAe7HNTlwuG4K12ysUNo46s-eJ8NkMYHQqD_JrqTlH3yheNc2Aopu9B5vw-ivEqvPR4sTDpWBOg3xUU_4XiJEBLno8FHsg',
expires: 1500151434603 }
上网搜索发现可能是OAuth范围的问题。但是,所有关于它的信息都是指使用客户端 ID,而不是服务帐户。我也没有在 Google 开发者控制台中找到该选项。
对我做错了什么有任何想法吗?
【问题讨论】:
-
希望您已经轮换了该访问令牌...
-
@Amber 我认为如果没有人知道用户电子邮件,令牌将一文不值。我错了吗?
-
电子邮件比令牌更容易被猜测,因此发布令牌会降低有效安全性。我仍然建议旋转它。
-
对此有何更新?有同样的问题
-
我是用nodemailer.com/smtp/oauth2/#oauth-2lo 之后的服务帐户完成的 - 范围很痛苦,我的是
'https://mail.google.com/', 'https://www.googleapis.com/auth/gmail.compose', 'https://www.googleapis.com/auth/gmail.modify', 'https://www.googleapis.com/auth/gmail.send '
标签: node.js email google-oauth google-apps nodemailer