我想问一下如何使用动态电子邮件和数据库传递的nodemailer。
export const mailTransporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: email_user,
pass: email_pass,
},
});email_user和email_pass来自文件env,我想从数据库中获取email_user和email_pass,所以我想创建一个函数来获取值电子邮件并从数据库中传递,然后保存到变量中并在mailTransport中使用。伙计们对此有什么建议或意见吗?
发布于 2022-05-30 09:57:56
在导出nodemailer.createTransport之前将它封装到函数中,然后从函数中在构造nodemailer.createTransport之前从DB获得凭证。
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
})发布于 2022-05-30 10:16:16
取决于您所拥有的数据库类型。如果使用mysql,可以使用mysql2包进行查询。它看起来像这样。
我建议在主项目之外创建一个简单的包,但这并不是完全必要的。
npm init
npm install dotenv mysql2require('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的数据库。它还允许一个查询中有多个语句。这可能是不可取的,所以如果你愿意的话,把它关掉。最后,我需要一个环境文件,但是我指定了一个特定的位置,而不是从项目文件夹中自动获得一个位置(因为这是它自己的包,将被导入到主项目中)。
接下来,我们将数据库包导入到我们的主要项目中。只需按照此页面安装本地包Installing a local module using npm?
在您的主项目目录中,应该是这样的。
npm install ../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/。
https://stackoverflow.com/questions/72432311
复制相似问题