1

我正在编写自己的SMTP客户端c#(用于紧凑型框架)。尝试使用smtp.gmail.com服务器

如果客户端发送空`,则在成功STARTTLS命令后。smtpEHLO Command response from server is

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);
      }
4

1 回答 1

2

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

查看RFC 2487 - 用于通过 TLS 的安全 SMTP 的 SMTP 服务扩展是怎么说的:

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

5.2 STARTTLS 命令的结果

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

于 2012-10-15T07:24:35.480 回答