由于意外的数据包格式登录到SMTP服务,握手失败



我正试图通过安全连接连接到SendGrid SMTP服务。然而,当我尝试验证TLS握手时,我得到一个System.IO.IOException,它说";由于意外的数据包格式,握手失败"我已经确认端口是587,它应该通过TLS 1.2连接。

请注意,我没有发送电子邮件,也不想使用SmtpClient

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
var server = "smtp.sendgrid.com";
var port = 587;
using (var client = new TcpClient()) {
client.Connect(server, port);
using (var stream = client.GetStream())
using (var sslStream = new SslStream(stream)) {
sslStream.AuthenticateAsClient(server);
using (var writer = new StreamWriter(sslStream))
using (var reader = new StreamReader(sslStream)) {
writer.WriteLine("EHLO " + server);
writer.Flush();
Console.WriteLine(reader.ReadLine());
}
}
}

问题是您正试图将TCP连接升级为SSL连接。

SMTP端口587是纯文本端口。可以将端口587上的SMTP连接升级为SSL,但您需要首先发送EHLO命令,并检查服务器是否支持STARTTLS扩展。如果是,则必须发送STARTTLS命令,只有在服务器成功响应后,才能使用SslStream.AuthenticateAsClient()升级到SSL连接。

我还应该指出,您当前的EHLO命令是错误的——您不应该发送"EHLO " + server,您应该发送"EHLO " + localhost,并且来自服务器的EHLO响应可能是多行的,所以您也需要处理这一问题。

最新更新