Nodemailer需手动配置SMTP参数才能发邮件,常见错误源于账号未开启SMTP服务、误用登录密码而非授权码、host/port不匹配或TLS设置不当;最小脚本应先单文件验证,确保service/auth/from/to等关键项正确。

VSCode 本身不提供邮件发送能力,Node.js 也默认不带 SMTP 客户端;要发邮件,你得装第三方库(比如 nodemailer),并手动配置 SMTP 账号、端口、认证方式——不是点几下插件就能跑起来的事。
为什么直接 npm install nodemailer 后还是发不出邮件
常见错误现象:nodemailer 安装成功,代码里 createTransport 也写了,但调用 sendMail 时卡住、超时,或报 ERR_TLS_CERT_ALTNAME_INVALID、Invalid login 等错误。
- 根本原因:没配对 SMTP 服务参数——比如用 QQ 邮箱却填了 Gmail 的 host 和 port
- 163/qq/foxmail 等国内邮箱必须开启“SMTP 服务”,并使用“授权码”而非登录密码(在邮箱设置里找“POP3/SMTP 服务”)
- 免费 SMTP 服务(如 Mailgun、SendGrid)需要注册后获取 API Key,且新账号常被限流或需验证域名
-
nodemailer默认启用 TLS,但某些企业邮箱或本地测试环境(如smtp://localhost:1025)需显式设secure: false或改用requireTLS: false
如何写一个最小可运行的 nodemailer 发信脚本
别一上来就塞进 Express 中间件,先确保单文件能跑通:
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
const nodemailer = require('nodemailer');
const transporter = nodemailer.createTransporter({
service: 'QQ', // 或 '163', 'gmail';也可写 host/port
auth: {
user: 'your@qq.com',
pass: 'your-smtp-auth-code' // 不是邮箱登录密码!
}
});
transporter.sendMail({
from: '"Test" <your@qq.com>',
to: 'target@example.com',
subject: 'Hello from VSCode + Node.js',
text: 'Plain text body',
html: '<p>HTML body</p>'
}).then(info => console.log('Message sent:', info.messageId))
.catch(err => console.error('Send error:', err));
- 保存为
send-test.js,在 VSCode 终端执行node send-test.js - 若报错
Error: Invalid user credentials,立刻去邮箱后台确认 SMTP 是否开启、授权码是否复制正确(注意空格和大小写) - 如果用自定义 host(如企业邮箱),必须指定
host和port,且service字段要删掉,否则会被覆盖
VSCode 调试时 nodemailer 报错连不上网络怎么办
现象:终端里 node send-test.js 能发,但 F5 调试时提示 connect ECONNREFUSED 或无响应。
- 检查
launch.json的env字段是否清空了系统代理变量(比如公司内网需走 HTTP_PROXY) - 某些杀毒软件或防火墙会拦截调试进程的出站连接,临时禁用试试
- VSCode 内置终端有时不会继承 shell 的 DNS 设置,可在
launch.json中加"env": { "NODE_OPTIONS": "--dns-result-order=ipv4first" } - 别在断点停太久——
nodemailer的连接有默认 timeout(2分钟),断点卡住后重试可能已超时
最常被忽略的一点:授权码不是密码,且不同邮箱服务商的端口和加密方式差异极大。QQ 邮箱用 465 端口 + secure: true,163 邮箱用 465 或 994,Gmail 则必须开两步验证并生成 App Password。别抄别人代码里的配置,每个账号都得自己查一遍官网文档。

















