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

使用Node.js net库连接SMTP服务器:HELO后无响应问题求助

使用Node.js net库连接SMTP时HELO后无后续响应的问题解决

你的代码存在两个核心问题,导致HELO命令后无后续响应:

  1. SMTP协议要求顺序交互
    SMTP是基于请求-响应的顺序协议,必须等待服务器返回前一个命令的响应后,才能发送下一个命令。你当前在连接成功后一次性发送所有命令,服务器还未完成HELO命令的处理,后续命令的时机不符合协议要求,导致服务器无法正确解析。

  2. 命令行结束符不符合标准
    SMTP协议规定所有命令必须以\r\n(回车+换行)作为行结束符,你只用了\r,部分严格的SMTP服务器会认为命令不完整,持续等待完整的结束符,不会返回响应。

修正后的代码

const net = require('net');

// 根据目标SMTP服务器配置参数
const options = {
  host: 'smtp.gmail.com',
  port: 587
};

const socket = net.createConnection(options);
// 用队列管理待发送的SMTP命令
const commandQueue = [
  'HELO here.com',
  'MAIL FROM: <me@here.com>',
  'RCPT TO: <not.a.valid.emailaddress.1234qa@gmail.com>'
];

socket.on('connect', () => {
  console.log('Connected');
  sendNextCommand();
});

socket.on('data', (data) => {
  const response = data.toString();
  console.log('Received: ' + response);
  
  // SMTP 2xx开头的响应表示命令执行成功,继续发送下一个命令
  if (response.trim().startsWith('250')) {
    sendNextCommand();
  }
});

socket.on('close', () => console.log('Connection closed'));
socket.on('error', (err) => console.log('Error:', err));
socket.on('timeout', () => console.log('timeout!'));

function sendNextCommand() {
  if (commandQueue.length === 0) {
    // 所有命令发送完成,发送QUIT关闭连接
    socket.end('QUIT\r\n');
    return;
  }
  const cmd = commandQueue.shift();
  socket.write(`${cmd}\r\n`);
  console.log('Sent:', cmd);
}

额外注意事项

  • 部分SMTP服务器(如Gmail)要求TLS加密连接,你需要在HELO响应后发送STARTTLS命令,并切换到TLS加密流(可使用Node.js的tls模块),否则后续命令会被拒绝。
  • 部分服务器会校验MAIL FROM中的地址是否为合法发件人,若地址无效会返回错误响应,需处理这类场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:31:12