Как проверить учетные данные smtp перед отправкой почты?

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

 SmtpClient client = new SmtpClient(host); client.Credentials = new NetworkCredential(username,password); client.UseDefaultCredentials = false; // Here I need to verify the credentials(ie username and password) client.Send(mail); 

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

Выхода нет.

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

Вы можете сделать это за пределами SmtpClient, открыв TCP-соединение с сервером … но аутентификация может быть сложной в зависимости от конфигурации сервера.

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

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

 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

Проверка перед отправкой почты не возможна с classом клиента SMTP в .net 2.0.

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

.Net SmtpClient не позволяет вам входить в систему без отправки сообщения.

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

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

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

 try { smtpClient.Send(new MailMessage("[email protected]", "[email protected]", "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); } 

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

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

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

Давайте будем гением компьютера.