如何使用Nodemailer



我想问一下如何使用nodemailer与动态电子邮件和从数据库传递

export const mailTransporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: email_user,
pass: email_pass,
},
});

email_user和email_pass来自文件env,我想从数据库中获取email_user和email_pass,所以我想创建一个函数来获取值email和从数据库中传递,然后保存到变量中并在mailTransport中使用。伙计们,有什么建议或意见吗?

在导出nodemailer.createTransport之前将其包装到函数中,然后从函数中获取DB的凭据,然后再构造nodemailer.createTransport

module.exports = createTransportWithCredential
function createTransportWithCredential(){
return new Promise((resolve,reject)=>{
//get credential from DB, you may need to use promise-then to handle async situation
//example:
getCredentialFromDB().then(credentials=>{       
let transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: credential.user,
pass: credential.password,
},
});
resolve(transporter)
})
})
}

从另一个js文件你可以做:

const mailer = require("./nodemailer")
mailer.createTransportWithCredential().then(transporter=>{
//use the transporter
})

取决于数据库的类型。如果你正在使用mysql,你可以使用mysql2包进行查询。它是这样的。

我建议在主项目之外创建一个简单的包,但这不是完全必要的。

npm init
npm install dotenv mysql2
require('dotenv').config({ path: "/home/ubuntu/.env" });
const mysql = require("mysql2/promise");
const connection = mysql.createPool({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: "main",
flags: "-FOUND_ROWS",
charset: "utf8mb4_0900_ai_ci",
multipleStatements: true,
connectionLimit: 10,
queueLimit: 0
});
module.exports = connection;

根据自己的喜好编辑选项。它创建了一个包含10个连接的池,并连接到名为main的数据库。它还允许在单个查询中使用多个语句。这可能不是你想要的,所以如果你愿意,把它关掉。最后,我需要一个环境文件,但是我指定了一个特定的位置,而不是从项目文件夹中自动获取一个(因为这是它自己的包,将被导入到主项目中)。

接下来,我们将数据库包导入到主项目中。使用npm安装本地模块?

在你的主项目目录下应该是这样的。

npm install ../database

如果您的数据库包位于主项目文件夹旁边。只是替换…/database .

现在在我们的主项目中,它看起来像这样。(我假设你给你的新包贴上了database的标签,但如果没有,只要用你使用的任何名称替换。

require('dotenv').config({ path: "/home/ubuntu/.env" });
const connection = require("database");
const userID = "81cae194-52bd-42d3-9554-66385030c35b";
connection.query(`
SELECT 
EmailUsername, 
EmailPassword 
FROM 
UserEmail 
WHERE 
UserID = ?
`, [userID])
.then(([results, fields]) => {
let transporter = nodemailer.createTransport({
host: process.env.EMAIL_HOST,
port: process.env.EMAIL_PORT,
secure: true, 
auth: {
user: results[0].EmailUsername,
pass: results[0].EmailPassword
},
});
// Put transporter.sendMail() here
})
.catch(error => console.log(error));

这只是你可以做什么以及如何做的一个示例。你需要用你自己的批判性思维来适应你自己的项目和风格。

没有一种方法可以做到这一点,我做的一些选择是我个人的决定。你应该能把这个和杰瑞的答案结合起来。他详细介绍了如何创建nodemailer模块。我只是向您展示如何使用nodemailer连接数据库数据。

请阅读https://www.npmjs.com/package/mysql2,特别是承诺包装部分。此解决方案还使用dotenv https://www.npmjs.com/package/dotenv和https://nodemailer.com/about/

最新更新