📅  最后修改于: 2023-12-03 15:03:16.166000             🧑  作者: Mango
Nodemailer 是一个流行的 Node.js 应用程序,用于通过电子邮件发送消息。在某些情况下,您可能希望使用 Nodemailer 来通过 Gmail 发送电子邮件。Google 提供 Oauth 协议,允许您在不暴露用户密码的情况下,通过 Google API 访问帐户。此外,您可能希望使用 Passport.js 身份验证库来使用 Google Oauth 策略。本文将介绍如何使用 Nodemailer、Google Passport Oauth 策略和 Node.js 运行此操作。
要使用 Google Oauth,您需要创建新的 Google Cloud Console 应用程序并获取 API 凭据(客户端 ID 和客户端密钥)。在您的 Google Cloud Console 控制台中,按照以下步骤进行操作:
在此过程中,您将获得客户端 ID 和客户端密钥,这将在接下来的步骤中使用。请记住,在将代码部署到生产环境之前,您应该保护这些凭据,以确保它们不会被滥用。
打开终端并进入项目目录,然后执行以下步骤:
npm i nodemailer google-auth-library passport-github passport-google-oauth20
config.js
文件并在其中存储 API 凭据:module.exports = {
google: {
clientID: CLIENT_ID,
clientSecret: CLIENT_SECRET,
callbackURL: CALLBACK_URL
}
};
替换 CLIENT_ID
、CLIENT_SECRET
和 CALLBACK_URL
变量,以反映您在步骤 1 中获得的值。您将这些值传递给 Passport 稍后在应用程序中使用。
app.js
文件中,添加以下代码:const express = require('express');
const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const app = express();
app.use(passport.initialize());
app.use(passport.session());
passport.use(new GoogleStrategy({
clientID: config.google.clientID,
clientSecret: config.google.clientSecret,
callbackURL: config.google.callbackURL
}, function (accessToken, refreshToken, profile, cb) {
User.findOrCreate({ googleId: profile.id }, function (err, user) {
return cb(err, user);
});
}));
该代码将确保 Google 策略被加载,并将 Passport 集成到应用程序中。在这里,您需要导入 passport
和 passport-google-oauth20
库,并定义一个新的 Google 策略。请注意,每个 Google 策略需要在 Google Cloud Console 中设置回调 URL,以便 Passport 将用户重定向到正确的位置。
在此阶段,您还应具有一个用于 user 对象的数据库存储方案(即 MongoDB)。在示例中,使用 Mongoose。
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const UserSchema = new Schema({
googleId: String
});
const User = mongoose.model('User', UserSchema);
app.js
文件的末尾添加以下路由:app.get('/auth/google', passport.authenticate('google', { scope: ['profile'] }));
app.get('/auth/google/callback',
passport.authenticate('google', { failureRedirect: '/login' }),
function(req, res) {
// Just redirecting for now.
res.redirect('/');
});
该路由确保将用户重定向到 Google 身份验证中心,并且如果成功,将返回到 /auth/google/callback
URL。
index.js
文件中,实现使用 Nodemailer 和 Passport 策略启动 Gmail 电子邮件的代码。const nodemailer = require('nodemailer');
const authService = require('./services/auth');
const passport = require('passport');
const { google } = require('googleapis');
const OAuth2 = google.auth.OAuth2;
const oauth2Client = new OAuth2(
process.env.GOOGLE_CLIENT_ID, // 客户端 ID
process.env.GOOGLE_CLIENT_SECRET, // 客户端密钥
'https://developers.google.com/oauthplayground' // 授权重定向 URL
);
oauth2Client.setCredentials({
refresh_token: process.env.GOOGLE_REFRESH_TOKEN
});
const tokens = authService.getAccessToken(oauth2Client);
const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
type: 'OAuth2',
user: process.env.MAIL_USER,
accessToken: tokens.access_token,
clientId: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
refreshToken: process.env.GOOGLE_REFRESH_TOKEN,
pass: process.env.MAIL_PASSWORD,
expires: tokens.expiry_date
}
});
const mailOptions = {
from: process.env.MAIL_USER,
to: process.env.MAIL_RECEIVER,
subject: 'Testing Nodemailer with Gmail OAuth',
text: 'Hi there, this email was sent using Nodemailer and Google OAuth2 authentication!'
};
transporter.sendMail(mailOptions, (error, response) => {
error ? console.log(error) : console.log(response);
transporter.close();
});
本文讲解了使用 Nodemailer、Google Passport Oauth 策略和 Node.js 进行电子邮件发送所需的步骤。使用 Nodemailer 和 Google API,可以在不向服务器发送密码的情况下从 Gmail 发送电子邮件。在使用 Google Passport Oauth 策略时,可以轻松地通过 Google Oauth 访问帐户。此外,本文还介绍了如何将 Passport 策略与 MongoDB 集成。