使用Nodemailer与Express搭建SMTP服务器时遇ReferenceError错误排查
解决Nodemailer SMTP连接与登录的错误问题
错误原因梳理
- ReferenceError: callback is not defined:
connection.connect()和connection.login()是异步方法,必须传入回调函数或使用Promise语法处理结果,你未提供必要的回调逻辑,导致内部调用报错。 - 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
相关产品推荐
相关产品推荐

