You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 08:45:04