2010-03-11 12 views
6

Devo convalidare il nome utente e la password impostati in un'istanza SmtpClient prima di inviare la posta. Utilizzando questo codice:Come convalidare le credenziali smtp prima di inviare la posta?

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

Come posso convalidare se l'utente identificato dalle credenziali può connettersi e inviare una mail?

risposta

3

Non c'è modo.

SmtpClient bascially non è in grado di convalidare la password utente senza contattare il servizio a cui si connette.

Quello che si potrebbe fare è farlo fuori da SmtpClient, aprendo una connessione TCP al server ... ma l'autenticazione può essere complicata a seconda di come è configurato il server.

Posso chiedere perché è necessario saperlo prima di inviare? comportamento normale IMHO sarebbe quello di avvolgere l'invio nella gestione degli errori appropriata per rilevare le eccezioni qui.

+0

avevo bisogno di sapere se la convalida può essere fatto. Come accade nella prospettiva di MS, prima di inviare mail, richiede username e password se è sbagliato. Volevo fare lo stesso nella mia applicazione. Apprezzo il tuo aiuto. –

+0

In realtà qui c'è qualcosa di sbagliato. MS Outlook NON ti chiede prima di inviare e-mail.Ti chiede solo in 1 ocurance: non può autenticarsi. Ci prova se imposti il ​​passord. Potrebbe chiederti se l'hai configurato per farlo. Ma è perfettamente felice di provare senza password in caso di dubbio. – TomTom

1

Convalida prima, l'invio della posta non è possibile con la classe client SMTP in .net 2.0.

Tentare di convalidare a mano, aprendo una porta è buono come scrivere il proprio client SMTP, è complesso.

1

.Net SmtpClient non consente di accedere senza inviare un messaggio.

È possibile verificare le credenziali inviando un messaggio di test ad un indirizzo esistente che ignora le e-mail in arrivo e verifica se si ottiene un'eccezione.

Si noti che queste email di test verranno visualizzati nella cartella inviato del tuo account, se del caso (ad esempio, Gmail)

0

Sono d'accordo con le risposte precedenti, che SmtpClient non può convalidare senza l'invio.

Ma forse il problema può essere risolto comunque: se nome utente o password sono errati, client.Send(mail); genererà un'eccezione. Puoi creare un ciclo while e un blocco try-catch attorno all'invio, intercettare l'eccezione e chiedere all'utente il nome utente e la password corretti, quindi riprovare. Se l'utente fa clic su Annulla nella finestra di dialogo o l'invio ha esito positivo senza eccezioni, si esce dal ciclo while.

1

Prova questo:

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

Funziona per me nel mio metodo di convalida. Ma se hai solo bisogno di controllare le credenziali sull'invio di e-mail, allora circonda l'invio con try ... catch.

+0

Test.com è un vero dominio. Non ho controllato se ha un record MX, ma chiunque copia solo lo snippet di codice potrebbe far sì che il proprio server di posta tenti di inviare email reali a test.com. Ti consiglio di modificare il tuo esempio con un nome di dominio che veramente non esiste (e probabilmente non esisterà mai). – Christoph

2

mio codice di produzione per il nome utente e la convalida di password prima di inviare la posta:

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

Maggiori dettagli nella risposta a una similar question.

Code on github

+0

Ora sto usando lib MimeKit. Lavora con qualsiasi tipo di autenticazione. E funziona bene nella mia produzione. http://www.mimekit.net/ –

Problemi correlati