如何验证SMTP服务器

时间:2009-06-05 11:31:07

标签: c# .net smtp

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

任何想法?

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:5)

尝试连接到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 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
    $