Nodemailer如何正确发送存储在本地文件中的HTML邮件内容
问题原因
问题核心是Node.js异步API的执行顺序导致的:
fs.readFile是异步API,它的回调函数只会在文件读取完成后才会被执行,而你后续定义邮件配置、调用transporter.sendMail都是同步代码,会优先于回调执行- 你给邮件
html字段赋值的时候,htmlMessage还没有被读取到的文件内容覆盖,仍然是空字符串,Nodemailer检测到html内容为空就会只发送纯文本版本的邮件
解决方法
方案1:把邮件发送逻辑放到文件读取的回调内部
保证读取到文件内容后再执行发邮件的逻辑:
const nodemailer = require('nodemailer'); const fs = require('fs'); // 1.) 初始化发件人配置 const transporter = nodemailer.createTransport({ service: ..., auth: { user: ..., pass: ... } }) // 读取文件 fs.readFile("./Message.html", 'utf8', (err, htmlMessage) => { if (err) throw err; // 2.) 配置邮件 const email = { from: ..., text: 'This is a test! (Plain Text)', html: htmlMessage }; // 3.) 发送邮件 transporter.sendMail(email, (error, info) => { if (error) { console.error(error); } else { console.log('Message sent: %s', info.messageId); } }); });
方案2:使用同步读取文件API
用fs.readFileSync同步读取文件,保证代码顺序执行:
const nodemailer = require('nodemailer'); const fs = require('fs'); // 同步读取文件,代码会阻塞到文件读取完成再往下执行 const htmlMessage = fs.readFileSync("./Message.html", 'utf8'); // 1.) 初始化发件人配置 const transporter = nodemailer.createTransport({ service: ..., auth: { user: ..., pass: ... } }) // 2.) 配置邮件 const email = { from: ..., text: 'This is a test! (Plain Text)', html: htmlMessage }; // 3.) 发送邮件 transporter.sendMail(email, (error, info) => { if (error) { console.error(error); } else { console.log('Message sent: %s', info.messageId); } });
内容的提问来源于stack exchange,提问作者bassman21
相关产品推荐
相关产品推荐

