如何validationSMTP服务器

我正在开发一个项目,我必须validation给定的SMTP服务器,即在文本框中,用户将提供详细信息,然后他将单击测试按钮。 我想检查用户输入的服务器是否是Smtp服务器?

任何的想法??

尝试连接到SMTP端口,并确保从中获取以“220”开头并包含字母“SMTP”的行。 典型的示例响应是:

220 prod.monadic.cynic.net ESMTP Postfix (2.5.5) 

然后礼貌并发送“ QUIT \ r \ n”挂断。

如果您愿意,可以进行一些进一步的测试,例如测试用户是否可能传递消息。 为此,您将使用您的主机名(或任何字符串)发送HELO命令,使用用户的电子邮件地址发送MAIL FROM命令,并使用RCPT TO: 。 此时的大多数服务器将告诉您是否不允许中继。 (我假设您是从以后发送邮件的计算机上执行此操作。)只要您在此之后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
    邮件来自:
     250 2.1.0好的
     RCPT TO:
     554 5.7.1 :拒绝中继访问
    放弃
     221 2.0.0再见
     $

您可能希望通过适当的exception处理来改进此快速代码,并且还可以设置超时 – 如果无法连接则需要大约15秒才能失败,但这可能是TCP / IP握手的限制。

并且像Curt建议发送QUIT命令会很好。

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