将 Gmail 与 OAuth 和 Nodemailer 一起使用的最终方法是什么?
What is the definitive way to use Gmail with OAuth and Nodemailer?
期望的行为
使用 Gmail
、OAuth2
和 Nodemailer
从服务器端 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) Google
和 OAuth2
设置
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
以便稍后生成 refresh
和 access
令牌
11)
定义同意屏幕设置
12)
点击 I'll do this later
和 Done
13)
点击 Edit
图标,查看您的 Client ID
和 Client Secret
14)
要生成 access
和 refresh
令牌,请转到 https://developers.google.com/oauthplayground
15)
点击右上角的cog
图标,勾选Use your own OAuth credentials
,输入Client ID
和Client 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 Link 和 Authorised domains 之类的内容,您可能不会如果您正在开发后端应用程序,则有。
我认为整个过程真的很慢而且很复杂,因为大多数人执行所有这些步骤只是为了使用 nodemailer 从他们的应用程序发送电子邮件...
期望的行为
使用 Gmail
、OAuth2
和 Nodemailer
从服务器端 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) Google
和 OAuth2
设置
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
以便稍后生成 refresh
和 access
令牌
11)
定义同意屏幕设置
12)
点击 I'll do this later
和 Done
13)
点击 Edit
图标,查看您的 Client ID
和 Client Secret
14)
要生成 access
和 refresh
令牌,请转到 https://developers.google.com/oauthplayground
15)
点击右上角的cog
图标,勾选Use your own OAuth credentials
,输入Client ID
和Client 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 Link 和 Authorised domains 之类的内容,您可能不会如果您正在开发后端应用程序,则有。
我认为整个过程真的很慢而且很复杂,因为大多数人执行所有这些步骤只是为了使用 nodemailer 从他们的应用程序发送电子邮件...