由于登录到 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 响应可能是多行的, 所以你也需要处理它。