【发布时间】:2010-10-31 14:58:26
【问题描述】:
我正在进行一个项目,我必须验证给定的 SMTP 服务器,即在文本框中,用户将提供详细信息,然后他将单击测试按钮。我要检查用户输入的服务器是否是Smtp Server?
有什么想法吗??
【问题讨论】:
我正在进行一个项目,我必须验证给定的 SMTP 服务器,即在文本框中,用户将提供详细信息,然后他将单击测试按钮。我要检查用户输入的服务器是否是Smtp Server?
有什么想法吗??
【问题讨论】:
尝试连接到 SMTP 端口,并确保从该端口收到一条以“220”开头并包含字母“SMTP”的行。一个典型的示例响应是:
220 prod.monadic.cynic.net ESMTP Postfix (2.5.5)
那就客气了,发“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 后缀(2.5.5) HELO cynic.net 第250章 发件人:【讨论】:
您可能希望通过适当的异常处理以及设置超时来改进此快速代码 - 如果无法连接,则失败大约需要 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;
}
【讨论】: