¿Cómo validar las credenciales smtp antes de enviar el correo?

Necesito validar el nombre de usuario y la contraseña establecidos en una instancia de SmtpClient antes de enviar el correo. Usando este código:

 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); 

¿Cómo puedo validar si el usuario identificado por las credenciales puede conectarse y enviar un correo?

No hay forma.

SmtpClient básicamente no puede validar el usernamepassword sin contactar al servidor al que se conecta.

Lo que podría hacer es hacerlo fuera de SmtpClient, abriendo una conexión TCP al servidor … pero la autenticación PUEDE ser complicada dependiendo de cómo esté configurado el servidor.

¿Puedo preguntar POR QUÉ necesita saber eso antes de enviarlo? El comportamiento normal en mi humilde opinión sería envolver el envío en el manejo de errores adecuado para detectar excepciones aquí.

Mi código de producción para la validación de nombre de usuario y contraseña antes de enviar el correo:

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

Más detalles en la respuesta a una pregunta similar .

Código en github

Validar antes, el envío de correo no es posible con la clase de cliente SMTP en .net 2.0.

Intentar validar a mano, al abrir un puerto es tan bueno como escribir su propio cliente SMTP, es complejo.

.Net’s SmtpClient no le permite iniciar sesión sin enviar un mensaje.

Puede verificar las credenciales enviando un mensaje de prueba a alguna dirección existente que ignore el correo electrónico entrante y verifique si obtiene una excepción.

Tenga en cuenta que estos correos electrónicos de prueba aparecerán en la carpeta enviada de su cuenta, si corresponde (por ejemplo, Gmail).

Prueba esto:

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

Funciona para mí en mi método de validación. Pero si solo necesita verificar las credenciales al enviar un correo electrónico, simplemente rodee su envío con try … catch.

Estoy de acuerdo con las respuestas anteriores, que SmtpClient no puede validar sin enviar.

Pero tal vez su problema se puede resolver de todos modos: si el nombre de usuario o la contraseña son incorrectos, client.Send(mail); lanzará una excepción. Puede construir un while-loop y un try-catch-block alrededor del envío, detectar la excepción y pedirle al usuario el nombre de usuario y contraseña correctos, luego intente de nuevo. Si el usuario hace clic en cancelar en el cuadro de diálogo o si se envía correctamente sin excepción, sale del ciclo while.