如何检查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
相关产品推荐
相关产品推荐

