由于登录到 SMTP 服务的意外数据包格式,握手失败
Handshake failed due to an unexpected packet format logging into a SMTP service
我正在尝试通过安全连接连接到 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 响应可能是多行的, 所以你也需要处理它。
我正在尝试通过安全连接连接到 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()
.
我还应该指出您当前的 EHLO 命令是错误的 - 您不应该发送 "EHLO " + server
,您应该发送 "EHLO " + localhost
并且来自服务器的 EHLO 响应可能是多行的, 所以你也需要处理它。