将Gmail与OAuth和Nodemailer结合使用的确定方式是什么?

时间:2018-08-20 15:04:24

标签: node.js oauth-2.0 nodemailer

期望的行为

使用GmailOAuth2Nodemailer从服务器端node.js文件发送电子邮件。

我尝试过的事情

相关文档

https://nodemailer.com/smtp/oauth2
https://nodemailer.com/usage/using-gmail
https://developers.google.com/gmail/api/auth/web-server

相关问题

send emails from MY gmail account with OAuth2 and nodemailer
How do I authorise an app (web or installed) without user intervention?
https://stackoverflow.com/a/47936349
https://stackoverflow.com/a/22572776

以上资源的说明中存在空白,并且一些信息已过时,因此下面的答案是我的最终实施方案,似乎可行。

我正在发布此解决方案以确认这是最佳做法,如果可以的话,可以节省其他时间。

2 个答案:

答案 0 :(得分:4)

以下内容对我有用,分为两个部分:

01) app.js

02) GoogleOAuth2设置


app.js

var nodemailer = require("nodemailer");

var transporter = nodemailer.createTransport({
    host: 'smtp.gmail.com',
    port: 465,
    secure: true,
    auth: {
        type: 'OAuth2',
        user: local_settings.my_gmail_username,
        clientId: local_settings.my_oauth_client_id,
        clientSecret: local_settings.my_oauth_client_secret,
        refreshToken: local_settings.my_oauth_refresh_token,
        accessToken: local_settings.my_oauth_access_token
    }
});


var mail = {
    from: "John Smith <me@mydomain.com>",
    to: "user@userdomain.com",
    subject: "Registration successful",
    text: "You successfully registered an account at www.mydomain.com",
    html: "<p>You successfully registered an account at www.mydomain.com</p>"
}

transporter.sendMail(mail, function(err, info) {
    if (err) {
        console.log(err);
    } else {
        // see https://nodemailer.com/usage
        console.log("info.messageId: " + info.messageId);
        console.log("info.envelope: " + info.envelope);
        console.log("info.accepted: " + info.accepted);
        console.log("info.rejected: " + info.rejected);
        console.log("info.pending: " + info.pending);
        console.log("info.response: " + info.response);
    }
    transporter.close();
});

Google和OAuth设置

上面的代码需要进行以下设置:

01)转到https://console.developers.google.com

02)如果您没有项目,系统将提示您创建一个项目

enter image description here

03)单击Create Project

04)单击Create

enter image description here
05)输入Project Name并单击Create

enter image description here

06)选择Gmail API

enter image description here

07)单击Enable

enter image description here

08)单击Create Credentials

enter image description here

09)输入所需的设置

enter image description here

10)为OAuth客户端命名,并确保将https://developers.google.com/oauthplayground添加为redirect URI,以便稍后生成refreshaccess令牌

enter image description here
11)定义同意屏幕设置

enter image description here

12)单击I'll do this laterDone

enter image description here

13)单击Edit图标,以查看您的Client IDClient Secret

enter image description here

14)要生成accessrefresh令牌,请转到https://developers.google.com/oauthplayground

15)单击右上角的cog图标,选中Use your own OAuth credentials并输入Client IDClient Secret

enter image description here

16)在左列中,选择Gmail API v1并单击Authorise APIs

enter image description here

17)如果您登录了多个帐户,则在系统提示时选择相关帐户

enter image description here

18)单击Allow

enter image description here

19)单击Exchange authorisation code for tokens

enter image description here
我不确定access令牌的计数为何,但是希望屏幕底部的消息表示令牌不会过期。

答案 1 :(得分:2)

OAuth同意屏幕

您绝对正确地了解了差距和过时的信息,并且在记录将Gmail与OAuth和nodemailer结合使用所需的步骤方面,您做得非常出色! 不过,我认为值得一提的是,在“凭据”页面中还有另外一步: OAuth同意屏幕标签。

它包含类似于Google Play应用程序提交的表单,该表单需要Google进行验证,如果您选择不通过验证的应用程序,则之前最多只能调用100个调用它们的敏感范围被要求提交。

配额如何?

我仍然不清楚这100个通话配额是否会被使用,即使您没有选择使用敏感范围的其他权限(默认权限是电子邮件,个人资料,openid)也是如此。我希望不会,因为OAuth同意屏幕会询问诸如应用程序主页链接授权域之类的内容,如果您使用的是后端应用程序,则可能不需要这些内容。

我认为整个过程确实很慢,而且毫无用处,因为大多数人都执行所有这些步骤,只是使用nodemailer从他们的应用程序发送电子邮件...