首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Nodemailer

如何使用Nodemailer
EN

Stack Overflow用户
提问于 2022-05-30 09:48:14
回答 2查看 70关注 0票数 -2

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

代码语言:javascript
复制
export const mailTransporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    user: email_user,
    pass: email_pass,
  },
});

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

EN

回答 2

Stack Overflow用户

发布于 2022-05-30 09:57:56

在导出nodemailer.createTransport之前将它封装到函数中,然后从函数中在构造nodemailer.createTransport之前从DB获得凭证。

代码语言:javascript
复制
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文件中可以这样做:

代码语言:javascript
复制
const mailer = require("./nodemailer")
mailer.createTransportWithCredential().then(transporter=>{
  //use the transporter
})
票数 0
EN

Stack Overflow用户

发布于 2022-05-30 10:16:16

取决于您所拥有的数据库类型。如果使用mysql,可以使用mysql2包进行查询。它看起来像这样。

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

代码语言:javascript
复制
npm init
npm install dotenv mysql2
代码语言:javascript
复制
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的数据库。它还允许一个查询中有多个语句。这可能是不可取的,所以如果你愿意的话,把它关掉。最后,我需要一个环境文件,但是我指定了一个特定的位置,而不是从项目文件夹中自动获得一个位置(因为这是它自己的包,将被导入到主项目中)。

接下来,我们将数据库包导入到我们的主要项目中。只需按照此页面安装本地包Installing a local module using npm?

在您的主项目目录中,应该是这样的。

代码语言:javascript
复制
npm install ../database

如果您的数据库包位于您的主项目文件夹旁边。只需用指向单独数据库包的路径替换./数据库即可。

现在在我们的主要项目中,它看起来会是这样的。(我假设你给你的新包贴上了标签database,但如果不是,就用你用的任何名字代替。)

代码语言:javascript
复制
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/dotenvhttps://nodemailer.com/about/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72432311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档