You need to enable JavaScript to run this app. Node.js Nodemailer搭配Mailcow发邮件报TypeError问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 05:45:00