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
,它已经封装了这一点,请参阅