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

使用Nodemailer与Express搭建SMTP服务器时遇ReferenceError错误排查

解决Nodemailer SMTP连接与登录的错误问题

错误原因梳理

  1. ReferenceError: callback is not defined:connection.connect()和connection.login()是异步方法,必须传入回调函数或使用Promise语法处理结果,你未提供必要的回调逻辑,导致内部调用报错。
  2. TypeError: this._socket.write is not a function:
    • SMTP客户端与服务器占用了同一个端口465,端口冲突导致连接异常
    • 端口与加密配置不匹配:465是SSL加密专用端口,需设置secure: true;若使用非加密/STARTTLS模式,应改用587端口并配合secure: false + requireTLS: true

修复后的完整代码

var express = require('express');
var app = express();

// 修正拼写错误:STMP__Connection → SMTP__Connection
const SMTP__Connection = require("nodemailer/lib/smtp-connection");
let connection = new SMTP__Connection({
    host: 'localhost',
    port: 587, // 改用587端口避免冲突,适配STARTTLS模式
    secure: false,
    requireTLS: true // 启用STARTTLS加密
})

const SMTP_server = require("smtp-server").SMTPServer;
const SMTPserver = new SMTP_server({
    allowInsecureAuth: true, // 测试环境允许明文认证(生产环境需加密)
    onAuth(auth, session, callback) {
        if (auth.username !== "abc" || auth.password !== "123") {
            console.log("登录失败");
            return callback(new Error("Incorrect username/password"));
        }
        console.log("登录成功!");
        callback(null, { user: 999 });
    },

    onConnect(session, callback) {
        console.log("客户端已连接!")
        return callback();
    },

    onMailFrom(address, session, callback) {
        // 修正拼写:adress → address
        if (address.address !== "abc@123.com") {
            return callback(new Error("Invalid address!"));
        }
        return callback();
    },

    onRcptTo(address, session, callback) {
        // 修正拼写:adress → address
        if (address.address !== "abc@123.com") {
            return callback(new Error("Only abc@123.com can receive mail."));
        }
        return callback();
    },

    onData(stream, session, callback) {
        stream.pipe(process.stdout);
        stream.on("end", () => {
            console.log("邮件内容已输出");
            callback();
        });
    }
});
// 服务器监听587端口,与客户端配置一致
SMTPserver.listen(587);
SMTPserver.on("error", err => {
    console.log("服务器错误: %s", err.message)
})

app.get("/listen", function(req, res) {
    // 为connect方法添加回调处理连接结果
    connection.connect((err) => {
        if (err) {
            console.error("连接失败:", err);
            return res.status(500).send("连接SMTP服务器失败");
        }
        console.log("已连接到SMTP服务器");
        
        // 登录操作传入回调处理登录结果
        connection.login({
            user: "abc",
            pass: "123"
        }, (loginErr) => {
            if (loginErr) {
                console.error("登录失败:", loginErr);
                return res.status(401).send("登录SMTP服务器失败");
            }
            console.log("登录成功");
            res.send("SMTP服务器登录成功");
            
            // 登录完成后主动关闭连接
            connection.close();
        });
    });
});

app.listen(80, () => {
    console.log("Express服务器已启动在端口80");
});

核心修复说明

  • 端口与加密配置对齐:服务器和客户端统一使用587端口,搭配secure: false和requireTLS: true,符合STARTTLS标准配置,解决端口冲突和加密不匹配问题。
  • 异步方法回调补全:为connect和login方法添加回调函数,处理成功/错误场景,同时给Express请求返回对应响应。
  • 拼写错误修正:修正变量名、参数名的拼写错误,避免潜在逻辑问题。
  • 测试环境适配:添加allowInsecureAuth: true允许测试环境下的明文认证(生产环境必须通过SSL/TLS加密传输)。

内容的提问来源于stack exchange,提问作者klade

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:56:29