Nodemailer:发送超过 8 封 4 封空邮件
Nodemailer: 4 mail over 8 are sent with empty body
我正在构建一个用于课程管理的管理网络应用程序。我有一个 mongodb,其中包含我所有的校友、他们的电子邮件和他们的注册 ID。我想将 id 发送到他们的邮箱。我有一个 html 模板,然后使用 fs.readfile 和 .replace() 函数将占位符替换为我想发送的真实信息。
async function sendMail(mail,idreg){
var html_template;
const dataReg = "12/02/2019";
const oraReg = "16:00";
console.log(mail,idreg)
fs.readFile("./html_template/beefree-9o6bg29htfb.html",(err,data)=>{
html_template = data.toString().replace("XYZXYZXYZ",idreg).replace("XX/YY/ZZZZ",dataReg).replace("XX:YY",oraReg);
});
// Generate test SMTP service account from ethereal.email
// Only needed if you don't have a real mail account for testing
let account = await nodemailer.createTestAccount();
// create reusable transporter object using the default SMTP transport
let transporter = nodemailer.createTransport({
host: "smtp.gmail.com",
port: 465,
secure: true, // true for 465, false for other ports
auth: {
user: "mymail@gmail.com ", // generated ethereal user
pass: "mypw" // generated ethereal password
}
});
// setup email data with unicode symbols
let mailOptions = {
from: '"Cogestione Moscati" <mymail@gmail.com>', // sender address
to: mail, // list of receivers
subject: "Il tuo codice di registrazione per la Cogestione", // Subject line
html: html_template // html body
};
// send mail with defined transport object
let info = await transporter.sendMail(mailOptions)
console.log("Message sent: %s", info.messageId);
}
问题是我发送了 8 次相同的邮件。 4次我正确接收,4次我没有收到。
您对 fs.readFile
的调用下方的代码未作为该函数回调的一部分提供。基本上,文件读取开始,其余代码开始执行,导致在发送电子邮件之前争先创建 html_template
。
两种解决方案:
- 扩展回调以包括其余代码。这将是首选方法,因为它是非阻塞的,因此允许您的应用程序继续为其他请求提供服务。
- 使用
fs.readFileSync
,同步等价物。
此外,由于您使用的是 async/await,您也可以 let data = await fs.readFile("path/to/file");
我正在构建一个用于课程管理的管理网络应用程序。我有一个 mongodb,其中包含我所有的校友、他们的电子邮件和他们的注册 ID。我想将 id 发送到他们的邮箱。我有一个 html 模板,然后使用 fs.readfile 和 .replace() 函数将占位符替换为我想发送的真实信息。
async function sendMail(mail,idreg){
var html_template;
const dataReg = "12/02/2019";
const oraReg = "16:00";
console.log(mail,idreg)
fs.readFile("./html_template/beefree-9o6bg29htfb.html",(err,data)=>{
html_template = data.toString().replace("XYZXYZXYZ",idreg).replace("XX/YY/ZZZZ",dataReg).replace("XX:YY",oraReg);
});
// Generate test SMTP service account from ethereal.email
// Only needed if you don't have a real mail account for testing
let account = await nodemailer.createTestAccount();
// create reusable transporter object using the default SMTP transport
let transporter = nodemailer.createTransport({
host: "smtp.gmail.com",
port: 465,
secure: true, // true for 465, false for other ports
auth: {
user: "mymail@gmail.com ", // generated ethereal user
pass: "mypw" // generated ethereal password
}
});
// setup email data with unicode symbols
let mailOptions = {
from: '"Cogestione Moscati" <mymail@gmail.com>', // sender address
to: mail, // list of receivers
subject: "Il tuo codice di registrazione per la Cogestione", // Subject line
html: html_template // html body
};
// send mail with defined transport object
let info = await transporter.sendMail(mailOptions)
console.log("Message sent: %s", info.messageId);
}
问题是我发送了 8 次相同的邮件。 4次我正确接收,4次我没有收到。
您对 fs.readFile
的调用下方的代码未作为该函数回调的一部分提供。基本上,文件读取开始,其余代码开始执行,导致在发送电子邮件之前争先创建 html_template
。
两种解决方案:
- 扩展回调以包括其余代码。这将是首选方法,因为它是非阻塞的,因此允许您的应用程序继续为其他请求提供服务。
- 使用
fs.readFileSync
,同步等价物。
此外,由于您使用的是 async/await,您也可以 let data = await fs.readFile("path/to/file");