Как проверить учетные данные smtp перед отправкой почты? - PullRequest
7 голосов
/ 11 марта 2010

Мне нужно проверить имя пользователя и пароль, установленные в экземпляре SmtpClient перед отправкой почты. Используя этот код:

SmtpClient client = new SmtpClient(host);
client.Credentials = new NetworkCredential(username,password);
client.UseDefaultCredentials = false;

// Here I need to verify the credentials(i.e. username and password)
client.Send(mail);

Как я могу проверить, разрешено ли пользователю, идентифицированному с помощью учетных данных, подключаться и отправлять почту?

Ответы [ 6 ]

3 голосов
/ 11 марта 2010

Нет пути.

SmtpClient принципиально не может проверить пароль пользователя без обращения к серверу, к которому он подключается.

Что вы можете сделать, это сделать это вне SmtpClient, открыв TCP-соединение с сервером ... но аутентификация МОЖЕТ быть сложной в зависимости от конфигурации сервера.

Могу ли я спросить, ПОЧЕМУ нужно знать это перед отправкой? нормальное поведение ИМХО заключалось бы в переносе отправки в соответствующую обработку ошибок, чтобы перехватывать исключения здесь.

2 голосов
/ 20 марта 2016

Мой производственный код для проверки имени пользователя и пароля перед отправкой почты:

public static bool ValidateCredentials(string login, string password, string server, int port, bool enableSsl) {
        SmtpConnectorBase connector;
        if (enableSsl) {
            connector = new SmtpConnectorWithSsl(server, port);
        } else {
            connector = new SmtpConnectorWithoutSsl(server, port);
        }

        if (!connector.CheckResponse(220)) {
            return false;
        }

        connector.SendData($"HELO {Dns.GetHostName()}{SmtpConnectorBase.EOF}");
        if (!connector.CheckResponse(250)) {
            return false;
        }

        connector.SendData($"AUTH LOGIN{SmtpConnectorBase.EOF}");
        if (!connector.CheckResponse(334)) {
            return false;
        }

        connector.SendData(Convert.ToBase64String(Encoding.UTF8.GetBytes($"{login}")) + SmtpConnectorBase.EOF);
        if (!connector.CheckResponse(334)) {
            return false;
        }

        connector.SendData(Convert.ToBase64String(Encoding.UTF8.GetBytes($"{password}")) + SmtpConnectorBase.EOF);
        if (!connector.CheckResponse(235)) {
            return false;
        }

        return true;
    }

Подробнее в ответе на похожий вопрос .

Код на github

1 голос
/ 11 марта 2010

.Net SmtpClient не позволяет войти без отправки сообщения.

Вы можете проверить учетные данные, отправив тестовое сообщение на какой-либо существующий адрес, который игнорирует входящую электронную почту, и проверит, получено ли исключение.

Обратите внимание, что эти тестовые сообщения электронной почты будут отображаться в папке отправки вашей учетной записи, если таковая имеется (например, Gmail)

1 голос
/ 11 марта 2010

Проверка раньше, отправка почты невозможна с клиентским классом SMTP в .net 2.0.

Попытка подтвердить вручную, открытие порта так же хорошо, как написание собственного SMTP-клиента, это сложно.

0 голосов
/ 10 сентября 2013

Попробуйте это:

try
{
   smtpClient.Send(new MailMessage("test@test.com", "test@test.com", "test", "test"));
   return string.Empty;
}
catch (SmtpFailedRecipientException)
{
   return string.Empty;
}
catch (Exception ex)
{
   return string.Format("SMTP server connection test failed: {0}", ex.InnerException != null ? ex.InnerException.Message : ex.Message);
}

Это работает для меня в моем методе проверки. Но если вам нужно только проверить учетные данные при отправке электронной почты, просто окружите отправку попыткой ... catch.

0 голосов
/ 29 апреля 2010

Я согласен с предыдущими ответами, что SmtpClient не может проверить без отправки.

Но, возможно, ваша проблема может быть решена в любом случае: если имя пользователя или пароль неверны, client.Send(mail); выдаст исключение. Вы можете построить цикл while и блок try-catch вокруг отправки, перехватить исключение и запросить у пользователя правильное имя пользователя и пароль, а затем повторить попытку. Если пользователь нажимает кнопку «Отмена» в диалоговом окне или отправка выполняется без исключения, вы выходите из цикла while.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...