C# STARTTLS之后,如果smtp客户端发送EHLO命令,则不会返回任何内容

C# STARTTLS之后,如果smtp客户端发送EHLO命令,则不会返回任何内容,c#,smtp,C#,Smtp,我正在c#中编写自己的SMTP客户端(将在compact framework中使用)。正在尝试使用smtp.gmail.com服务器 成功STARTTLS命令后,如果smtp客户端从服务器发送EHLO命令,则响应为empty` message = "EHLO 10.192.4.223\r\n"; Write(message); response = Response(); if (response.Substring(0, 3) != "250")

我正在
c#
中编写自己的
SMTP
客户端(将在compact framework中使用)。正在尝试使用smtp.gmail.com服务器

成功
STARTTLS
命令后,如果
smtp
客户端从服务器发送
EHLO命令,则响应为
empty`

message = "EHLO 10.192.4.223\r\n";
      Write(message);
      response = Response();
      if (response.Substring(0, 3) != "250")
      {
        throw new SmtpException(response);
      }
      message = "STARTTLS\r\n";
      Write(message);
      response = Response();
      if (response.Substring(0, 3) != "220")
      {
        throw new SmtpException(response);
      }

      message = "EHLO 10.192.4.223\r\n";
      Write(message);
      response = Response();
      if (response.Substring(0, 3) != "250") //empty response
      {
        throw new SmtpException(response);
      }

因为在
STARTTLS
之后,您不再应该发送纯文本命令。相反,您应该在相同的现有TCP套接字/连接上切换到TLS安全通信

看看上面说的:

在收到对STARTTLS命令的220响应后,客户端
应在发送任何其他SMTP之前启动TLS协商
命令

5.2 STARTTLS命令的结果

TLS握手完成后,SMTP协议重置为 初始状态(服务器发出220后SMTP中的状态
服务就绪问候语)。服务器必须放弃任何知识
从客户端获取,例如EHLO命令的参数,
这不是从TLS谈判本身获得的。客户
必须放弃从服务器获得的任何知识,例如列表 未从TLS获取的SMTP服务扩展的个数
谈判本身。客户端应发送一个EHLO命令作为 TLS协商成功后的第一个命令


谢谢你的答复。。如何切换到TLS安全通信?这可以通过发送命令来完成吗?您可以像发送命令一样发送惊吓,也可以像已经做的那样接收纯文本响应。接下来,您应该开始以二进制形式发送TLS握手。通常,您需要第三方库或API(WinAPI中的SChannel)。或者,您可以只使用C#
SmtpClient
,它已经封装了这一点,请参阅