2010-03-04 25 views
6

Desidero inviare un messaggio di posta con la classe SmtpClient.Risoluzione dei problemi "Il server ha commesso una violazione del protocollo" durante l'invio di posta con SmtpClient

Ecco il codice che uso:

SmtpClient smtpClient = new SmtpClient("Host",25); 
NetworkCredential basicCredential = 
new NetworkCredential("UserName", "Password"); 
MailMessage message = new MailMessage(); 
MailAddress fromAddress = new MailAddress("[email protected]"); 
smtpClient.UseDefaultCredentials = false; 
smtpClient.Credentials = basicCredential; 
message.From = fromAddress; 
message.Subject = "test send"; 
message.IsBodyHtml = true; 
message.Body = "<h1>hello</h1>"; 
message.To.Add("[email protected]"); 
smtpClient.Send(message); 

Ma getta sempre un'eccezione:

Il server ha commesso una violazione del protocollo Risposta del server: UGFzc3dvcmQ6

posso trovarne la ragione. Per favore, se qualcuno ha affrontato qualcosa di simile, dimmi cosa fare.

risposta

5

Questa mi sembra l'autenticazione SmtpClient è in qualche modo sempre al passo.

Alcuni meccanismi di autenticazione sono "Cliente: richiesta di autenticazione con username e password, server: il successo/fail" altri sono "Cliente: richiesta di autenticazione con nome utente, Server: la password richiesta, Cliente: rispondere con la password, Server: il successo/fail ".

Sembra che SmtpClient si aspetti il ​​primo, mentre il server si aspetta quest'ultimo.

Come dave wenta suggested, un registro di una sessione indicava il meccanismo di autenticazione che SmtpClient sta tentando di utilizzare, ma indica anche i meccanismi di autenticazione supportati dal server.

Ciò che normalmente accade è che il server offre una serie di opzioni di autenticazione e il client sceglie quale utilizzare. Il comportamento da lì dovrebbe essere determinato dal protocollo scelto. Spero che la classe SmtpClient si sia occupata di questo per te, ma temo di non aver mai usato quella particolare classe.

Inoltre, se si desidera registrare un registro qui, passare a una password throwaway prima di accedere alla sessione, poiché una password in testo semplice codificata in base 64 può essere trasformata banalmente in password in testo semplice leggibile.

+0

Grazie per la risposta, credo che sia come hai detto che il server è in attesa di informazioni di autenticazione Base64 –

+0

Mi spiace, qui è –

1

thousand of hit on google for UGFzc3dvcmQ6

sembrare il server aspetterebbe crittografata (con base64) username/password

+0

noti che base64 è solo una codifica. Sebbene una password di base64 non sia ovvia, non è crittografata. Inserisci "TXlQYSRzdzByZA ==" in http://www.opinionatedgeek.com/dotnet/tools/base64decode/ e fai fuori la "password". –

4

UGFzc3dvcmQ6 è "Password:" base 64 codificato (senza virgolette), il che significa la password è probabilmente sbagliato o non inviare codificato . Prova codifica in 64 bit della password:

string password = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("Password)); 
+0

Scusate ragazzi l'errore è scomparso ma viene generata una nuova eccezione che è Errore nell'invio della posta non so cosa fare –

+0

Qual è l'eccezione interna? – bkaid

2

Abilita registrazione per System.Net.Mail. Quindi visualizza il file di registro. Questo ti mostrerà esattamente cosa sta succedendo durante il livello SMTP.

Ecco un link con ulteriori informazioni:

http://systemnetmail.com/faq/4.10.aspx

+0

5 anni dopo questo è stato un grande aiuto - ho scoperto che stavo collegando il bracconaggio. – Dreamcasting

6

Ho avuto lo stesso problema, per il mio caso è stato per l'impostazione utente @ dominio invece di utente, voglio dire

vecchio codice

new NetworkCredential("[email protected]", "Password"); 

Nuovo codice

new NetworkCredential("UserName", "Password"); 
+1

Questo ha risolto il mio problema! 10x !!! –

0

Questo può capita anche quando semplicemente non si fornisce la password. Nel mio caso stavo usando le credenziali da un blocco smtp web.config e sul mio server di distribuzione (usando la distribuzione di polpo) avevo dimenticato di popolare l'attributo password.

0

Aveva lo stesso problema. Risolto nelle seguenti fasi: 1) scoprire, quello che offre il server per l'autenticazione SMTP collegandosi al server SMTP utilizzando Telnet o stucco o qualsiasi altro terminale:

telnet xxx.yyy.zzz.aaa 587 

(xxx.yyy.zzz.aaa = indirizzo IP del server SMTP, 587 = numero di porta)

< server risponde con "220 protocollo + versione + tempo"

ehlo testing 

< Server lista schermi di funzionalità ad esempio

Il client SMTP tenta prima di prendere il protocollo più sicuro. Nel mio caso:

1. System.Net.Mail.SmtpNegotiateAuthenticationModule 
2. System.Net.Mail.SmtpNtlmAuthenticationModule 
3. System.Net.Mail.SmtpDigestAuthenticationModule 
4. System.Net.Mail.SmtpLoginAuthenticationModule 

Sembra come se il client SMTP tenta NTLM, mentre il server tenta di eseguire LOGIN.

Con un hack (cfr https://blogs.msdn.microsoft.com/knom/2008/04/16/hacking-system-net-mail-smtpclient/), tutti i protocolli possono essere attivati ​​della eccezione di quello del server presuppone (LOGIN in questo caso):

FieldInfo transport = smtpClient.GetType().GetField("transport", BindingFlags.NonPublic | BindingFlags.Instance); 

FieldInfo authModules = transport.GetValue(smtpClient).GetType().GetField("authenticationModules",BindingFlags.NonPublic | BindingFlags.Instance); 

Array modulesArray = authModules.GetValue(transport.GetValue(smtpClient)) as Array; 
foreach (var module in modulesArray) 
{ 
    Console.WriteLine(module.ToString()); 
} 
// System.Net.Mail.SmtpNegotiateAuthenticationModule 
// System.Net.Mail.SmtpNtlmAuthenticationModule 
// System.Net.Mail.SmtpDigestAuthenticationModule 
// System.Net.Mail.SmtpLoginAuthenticationModule 

// overwrite the protocols that you don't want 
modulesArray.SetValue(modulesArray.GetValue(3), 0); 
modulesArray.SetValue(modulesArray.GetValue(3), 1); 
modulesArray.SetValue(modulesArray.GetValue(3), 2); 
Problemi correlati