Nodemailer 和 Oauth2 无法在生产环境中运行
Nodemailer and Oauth2 not working in production
const nodemailer = require("nodemailer");
const { google } = require("googleapis");
const oAuth2Client = new google.auth.OAuth2(
process.env.GOOGLE_CLIENT_ID,
process.env.GOOGLE_CLIENT_SECRET,
"https://developers.google.com/oauthplayground"
);
oAuth2Client.setCredentials({refresh_token: process.env.GOOGLE_REFRESH_TOKEN});
module.exports.sendMail = async (mailOptions) => {
try {
const accessToken = await oAuth2Client.getAccessToken();
const transport = nodemailer.createTransport({
service: "gmail",
auth: {
type: "OAuth2",
user: process.env.GMAIL_ADDRESS,
clientId: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
refreshToken: process.env.GOOGLE_REFRESH_TOKEN,
accessToken: accessToken
}
});
await transport.sendMail(mailOptions);
sendMail()
.then(() => console.log("Email sent!"))
.catch((error) => console.log("Email NOT sent! " + error.message));
} catch (error) {
return error;
}
};
您好!这是使用 google 进行身份验证的代码,然后在调用 sendEmail 函数的任何地方发送电子邮件。一切在本地都能顺利进行,但在生产中却不行。我不知道我做错了什么。谢谢你的帮助。
最好将 SendGrid 作为一项服务使用,因为您需要它用于生产(100 emails/day 免费),以确保电子邮件交付,他们有一个合理的免费计划。而且安装非常简单。
调试最好使用 mailtrap(免费)。
const nodemailer = require("nodemailer");
const { google } = require("googleapis");
const oAuth2Client = new google.auth.OAuth2(
process.env.GOOGLE_CLIENT_ID,
process.env.GOOGLE_CLIENT_SECRET,
"https://developers.google.com/oauthplayground"
);
oAuth2Client.setCredentials({refresh_token: process.env.GOOGLE_REFRESH_TOKEN});
module.exports.sendMail = async (mailOptions) => {
try {
const accessToken = await oAuth2Client.getAccessToken();
const transport = nodemailer.createTransport({
service: "gmail",
auth: {
type: "OAuth2",
user: process.env.GMAIL_ADDRESS,
clientId: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
refreshToken: process.env.GOOGLE_REFRESH_TOKEN,
accessToken: accessToken
}
});
await transport.sendMail(mailOptions);
sendMail()
.then(() => console.log("Email sent!"))
.catch((error) => console.log("Email NOT sent! " + error.message));
} catch (error) {
return error;
}
};
您好!这是使用 google 进行身份验证的代码,然后在调用 sendEmail 函数的任何地方发送电子邮件。一切在本地都能顺利进行,但在生产中却不行。我不知道我做错了什么。谢谢你的帮助。
最好将 SendGrid 作为一项服务使用,因为您需要它用于生产(100 emails/day 免费),以确保电子邮件交付,他们有一个合理的免费计划。而且安装非常简单。
调试最好使用 mailtrap(免费)。