必须使用授权码而非密码:163邮箱已停用密码直连SMTP,需在网页端「设置→POP3/SMTP/IMAP」开启SMTP并生成16位授权码;host填smtp.163.com,port推荐465且secure:true。

直接用 nodemailer 就行,VSCode 本身不参与发信,它只是写代码和运行的环境;真正干活的是 Node.js 进程 + nodemailer 库 + 邮箱 SMTP 服务。关键不是“在 VSCode 里发”,而是“用 VSCode 写好 Node 脚本,再用终端运行它”。
配置 163 邮箱 SMTP 时必须用授权码,不能用登录密码
163 邮箱已全面停用账号密码直连 SMTP,必须去网页端「设置 → POP3/SMTP/IMAP」中开启 SMTP 并生成授权码。这个授权码是独立于邮箱密码的 16 位字符串,只用于第三方程序(比如你的 Node 脚本)。
-
host必须填smtp.163.com,不能写成smtp-mail.163.com或其他变体 -
port推荐用465,并配secure: true;如果连不上,再试port: 993+secure: true(但 993 是 IMAP 端口,不推荐) - 若用
port: 25,必须设secure: false且加tls: { rejectUnauthorized: false }—— 但 163 已拒绝非加密的 25 端口连接,会报Error: Connection timeout
VSCode 中调试邮件脚本的实操要点
别在 VSCode 的“运行和调试”面板里直接点 ▶️ 启动(默认走 node 但没加载环境变量),容易因路径、权限或未捕获异常导致静默失败。
- 确保项目根目录有
package.json,且已执行过npm install nodemailer - 写完
sendEmail.js后,在 VSCode 内置终端(Ctrl+`)中手动运行:node sendEmail.js - 在代码里加
console.log('sending...')和transporter.verify(),能快速确认 SMTP 连接是否通 - 如果报错
Invalid login: 535 Error,基本就是授权码错了、过期了,或没开 SMTP 服务
发送带中文标题/内容的邮件必须显式指定编码
Node.js 默认用 UTF-8,但某些邮箱客户端(尤其是 Outlook 或旧版 Foxmail)对未声明编码的 HTML 邮件会乱码。别依赖 text 或 html 字段自动推断。
- 在
mailOptions里加上charset: 'UTF-8'字段 -
subject中文要确保是字符串字面量(不是变量拼接后没转义),否则可能被截断或显示为乱码 - HTML 正文中避免用
或等全角空格——部分邮箱渲染器不识别,建议统一用或 CSSpadding - 如果收件方看到 “=?UTF-8?B?…” 这种编码串,说明
nodemailer自动做了 base64 编码,这是正常行为,不用干预
最容易被忽略的一点:163 邮箱对单日发信频率有限制(通常 500 封/天),且新授权码前 24 小时内首次发信容易被风控拦截到垃圾箱。发测试邮件时,先用自己另一个邮箱接收,确认能进收件箱再推广到正式流程。


















