您可能希望通过适当的异常处理来改进此快速代码,并且还可以设置超时 - 如果无法连接则需要大约15秒才能失败,但这可能是TCP/IP握手的限制.
并且QUIT像Curt建议发送命令会很好.
private bool ValidSMTP(string hostName)
{
bool valid = false;
try
{
TcpClient smtpTest = new TcpClient();
smtpTest.Connect(hostName, 25);
if (smtpTest.Connected)
{
NetworkStream ns = smtpTest.GetStream();
StreamReader sr = new StreamReader(ns);
if (sr.ReadLine().Contains("220"))
{
valid = true;
}
smtpTest.Close();
}
}
catch
{
}
return valid;
}
Run Code Online (Sandbox Code Playgroud)
尝试连接到SMTP端口,并确保从中获取以"220"开头并包含字母"SMTP"的行.一个典型的示例响应是:
220 prod.monadic.cynic.net ESMTP Postfix (2.5.5)
Run Code Online (Sandbox Code Playgroud)
然后礼貌并发送" QUIT\ r \n"挂断.
如果您愿意,可以进行一些进一步的测试,例如测试用户是否可能传递消息.为此,您将使用您的主机名(或任何字符串)发送一个HELO命令,一个MAIL FROM使用用户电子邮件地址的命令,以及一个RCPT TO:<example@example.com>.此时的大多数服务器将告诉您是否不允许中继.(我假设你是从以后发送邮件的计算机上做的.)只要你QUIT在那之后,而不是发出DATA命令和消息数据,就不会发送任何内容.
这是一个示例会话,使用"netcat"命令从shell完成,显示我的服务器存在,但不会为来自随机IP地址的人中继邮件.
$ nc prod.monadic.cynic.net. 25
220 prod.monadic.cynic.net ESMTP Postfix (2.5.5)
HELO cynic.net
250 prod.monadic.cynic.net
MAIL FROM:<cjs@cynic.net>
250 2.1.0 Ok
RCPT TO:<example@example.com>
554 5.7.1 <example@example.com>: Relay access denied
QUIT
221 2.0.0 Bye
$