将 Gmail 与 OAuth 和 Nodemailer 一起使用的最终方法是什么?

What is the definitive way to use Gmail with OAuth and Nodemailer?

期望的行为

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

我试过的

相关文档

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

相关问题


How do I authorise an app (web or installed) without user intervention?

上述来源的说明存在漏洞,一些信息已过时,因此下面的答案是我的最终实施,似乎有效。

我发布此解决方案是为了确认它是最佳做法,如果是的话,也是为了节省其他人的时间。

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

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)如果您没有项目,系统会提示您创建一个

03) 点击 Create Project

04) 点击 Create


05)输入一个Project Name然后点击Create

06) Select Gmail API

07) 点击 Enable

08) 点击 Create Credentials

09)输入所需的设置

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


11) 定义同意屏幕设置

12) 点击 I'll do this laterDone

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

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

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

16) 在左栏中,select Gmail API v1 然后单击 Authorise APIs

17) 如果您登录了多个帐户,当出现提示时 select 相关帐户

18)点击Allow

19)点击Exchange authorisation code for tokens


我不确定为什么 access 令牌倒计时,但希望屏幕底部的消息表示令牌不会过期。

OAuth 同意屏幕

您对差距和过时信息的看法绝对是正确的,并且您在记录将 Gmail 与 OAuth 和 nodemailer 一起使用所需的步骤方面做得非常出色! 不过,我认为值得一提的是,在凭据页面中还有一个步骤:OAuth Consent Screen 选项卡。

它包含一个类似于 Google Play 应用程序提交的表单,需要 Google 验证,如果您选择不验证您的应用程序,您将有 100 次他们调用的调用限制敏感范围 在被要求提交之前。

配额呢?

即使您没有 select 使用敏感范围(默认范围是电子邮件、个人资料、openid)的任何额外权限,我仍然不清楚这 100 次调用配额是否会被消耗。我希望不会,因为 OAuth 同意屏幕要求提供诸如 Application Homepage LinkAuthorised domains 之类的内容,您可能不会如果您正在开发后端应用程序,则有。

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