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

如何检查SMTP服务器是否在线并验证220响应码?

问题解答

关于220响应码的确认

220是SMTP服务器正常就绪的标准初始响应码,这是SMTP协议定义的规范:当客户端成功建立TCP连接后,服务器会首先返回以220开头的响应,表明服务器已准备好接收后续指令,是服务正常运行的核心标识。

代码修改方案

Go标准库的smtp.Dial函数内部已经自动完成了220响应码的校验——建立连接后会读取服务器的初始问候信息,若响应码不是220会直接返回错误。所以你现有代码中,smtp.Dial(host)成功返回client时,就已经确认了服务器返回了220响应。

如果需要显式获取并校验响应内容,可以绕过smtp.Dial,手动控制连接和响应读取流程,示例代码如下:

import (
    "net"
    "textproto"
    "time"
)

func (p *sys_ping) smtp(host string) string {
    // 手动建立TCP连接
    conn, err := net.Dial("tcp", host)
    if err != nil {
        time.Sleep(time.Duration(p.delay) * time.Second)
        return ""
    }
    defer conn.Close()

    // 创建textproto连接解析SMTP响应格式
    textConn := textproto.NewConn(conn)
    defer textConn.Close()

    // 读取初始响应并校验220码
    _, _, err = textConn.ReadResponse(220)
    if err != nil {
        time.Sleep(time.Duration(p.delay) * time.Second)
        return ""
    }

    // 发送QUIT指令关闭连接
    _, _, err = textConn.Cmd("QUIT")
    if err != nil {
        return ""
    }

    return host
}

改动说明

  • 手动建立TCP连接,完全控制响应读取流程,避免smtp.Dial的自动校验逻辑
  • 用textproto.Conn处理SMTP协议的响应格式,ReadResponse(220)会直接校验响应码,不匹配则返回错误
  • 显式发送QUIT指令并释放连接资源,确保操作规范

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 19:03:09