Как проверить SMTP-сервер - PullRequest
5 голосов
/ 05 июня 2009

Я работаю над проектом, в котором мне нужно проверить указанный SMTP-сервер, т. Е. В текстовом поле пользователь предоставит подробные данные, а затем он нажмет кнопку тестирования. Я хочу проверить, является ли введенный пользователем сервер SMTP-сервером или нет?

Любая идея ??

Ответы [ 2 ]

7 голосов
/ 05 июня 2009

Возможно, вы захотите улучшить этот быстрый код с правильной обработкой исключений и, возможно, также с установкой тайм-аутов - для сбоя потребуется около 15 секунд, если он не может подключиться, но это может быть ограничением установления связи TCP / IP. 1001 *

И отправка команды 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;
}
5 голосов
/ 05 июня 2009

Попытайтесь подключиться к порту 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», показывающий, что мой сервер существует, но не будет ретранслировать почту людям со случайных 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
    $
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...