Node.js Nodemailer搭配Mailcow发邮件报TypeError问题求助
问题定位
你遇到的报错和Mailcow端口配置、TLS参数调整没有任何关系,是代码的调用写法和当前安装的Nodemailer版本API不兼容,导致程序还没走到SMTP连接环节就崩溃了:
- 你写的
mail.createTransport("SMTP", { ... })这种双参数写法,是Nodemailer v0.x上古版本的旧API(第一个参数指定传输类型,第二个传连接配置) - Nodemailer从v1.0版本开始就移除了这种调用方式:
createTransport现在仅接收1个配置对象参数,默认内置支持SMTP传输,不需要单独传入"SMTP"字符串标识传输类型 - 当前运行逻辑下,代码把你传入的第一个字符串"SMTP"当成了配置对象,试图在这个只读的字符串值上绑定
mailer属性,直接抛出你看到的TypeError。因为程序在连接SMTP服务前就已经崩溃,所以你之前反复调整端口、修改secureConnection参数的操作完全没有触发的机会。
附带的配置错误说明
修正API调用方式后,原代码里还有两处配置和新版Nodemailer、Mailcow的端口规则不匹配:
- 原代码用的
secureConnection是旧版参数名,新版控制是否开启直连SSL的参数名是secure,原参数名不会被程序识别 - 你使用的587端口是Mailcow的STARTTLS端口,不是SSL直连端口:直连SSL对应的端口是465,587端口必须将
secure设为false,同时开启requireTLS: true强制加密,否则会出现认证失败或明文传输的问题
修正后的可运行代码
// 先引入nodemailer模块 const nodemailer = require('nodemailer'); const usermail = "test@mydomain.com" const transp = nodemailer.createTransport({ host: "mail.mydomain.com", port: 587, secure: false, // 587端口走STARTTLS,不要开启直连SSL requireTLS: true, // 强制使用TLS加密传输 auth: { user: process.env.email, pass: process.env.passwd } }) transp.sendMail({ to: usermail, subject: "test", text: "test" }, function(err, response){ if(err){ console.log('发送失败:', err); return; } console.log('发送成功:', response); });
如果后续需要使用465端口的直连SSL配置,仅需要将上述配置改为
port: 465, secure: true即可,不需要额外调整其他参数。
内容的提问来源于stack exchange,提问作者Mei-chan
相关产品推荐
相关产品推荐

