2010-03-04 7 views
6

Ich möchte eine E-Mail-Nachricht mit der Klasse SmtpClient senden.Problembehandlung "Der Server hat eine Protokollverletzung begangen" beim Senden von E-Mails mit SmtpClient

Hier ist der Code, den ich verwenden:

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

Aber es wirft immer eine Ausnahme:

Der Server eine Protokollverletzung Die Serverantwort war verpflichtet: UGFzc3dvcmQ6

ich kann Finde den Grund dafür nicht. Bitte, wenn jemand mit so etwas konfrontiert wurde, sag mir, was ich tun soll.

Antwort

5

Dies ist für mich sieht aus wie SmtpClient Authentifizierung irgendwie aus dem Tritt zu bekommen.

Einige Authentifizierungsmechanismen sind "Client: Anfrageauthentifizierung mit Benutzername und Passwort, Server: Erfolg/Fehler" andere sind "Client: Anfrageauthentifizierung mit Benutzername, Server: Anfragepasswort, Client: Antwort mit Passwort, Server: Erfolg/Fehler ".

Es sieht so aus, als ob SmtpClient ersteres erwartet, während Ihr Server letzteres erwartet.

Wie dave wenta suggested, ein Protokoll einer Sitzung würde Ihnen sagen, welche Authentifizierungsmechanismus SmtpClient versucht zu verwenden, aber es wird auch sagen, welche Authentifizierungsmechanismen der Server unterstützt.

Was normalerweise passiert, ist, dass der Server eine Reihe von Authentifizierungsoptionen bietet und der Client wählt, welchen er verwenden wird. Das Verhalten von dort sollte durch das gewählte Protokoll bestimmt werden. Ich würde hoffen, dass die SmtpClient-Klasse das für Sie erledigt hat, aber ich fürchte, ich habe diese spezielle Klasse nie benutzt.

Denken Sie auch daran - Wenn Sie hier ein Protokoll veröffentlichen, ändern Sie vor der Protokollierung der Sitzung ein Wegwerfkennwort, da ein base64-kodiertes Nur-Text-Kennwort leicht wieder in ein für Menschen lesbares Klartextkennwort geändert werden kann.

+0

Danke für die Antwort Ich glaube, es ist wie Sie sagten, dass der Server Base64-Authentifizierung erwartet –

+0

Sorry, hier ist es –

1

thousand of hit on google for UGFzc3dvcmQ6

es den Server scheinen erwarten verschlüsselt (mit base64) Benutzername/Passwort

+0

Beachten Sie, dass base64 eine nur eine Codierung ist. Obwohl ein base64-Passwort nicht offensichtlich ist, ist es auch nicht verschlüsselt. Feed "TXlQYSRzdzByZA ==" in http://www.opinionatedgeek.com/dotnet/tools/base64decode/ und gibt das "Passwort" aus. –

4

UGFzc3dvcmQ6 ist „Passwort:“ das Passwort Basis 64 codiert (ohne Anführungszeichen), was bedeutet, wahrscheinlich falsch ist oder nicht codierten senden . Versuchen Sie Base 64, das Passwort zu codieren:

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

Sorry Jungs der Fehler verschwunden, aber eine neue Ausnahme wird ausgelöst, die Fehler beim Senden von Mail weiß nicht, was zu tun ist –

+0

Was ist die innere Ausnahme? – bkaid

2

Aktivieren Sie die Protokollierung für System.Net.Mail. Zeigen Sie dann die Protokolldatei an. Dies zeigt Ihnen genau, was während der SMTP-Schicht passiert.

Hier ist ein Link mit weiteren Informationen:

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

+0

5 Jahre später war das eine große Hilfe - ich fand Verbindung Wilderei. – Dreamcasting

6

hatte ich das gleiche Problem, für meinen Fall ist es für die Einstellung user @ domain statt Benutzer war, ich meine

Alter Code

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

Neuer Code

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

Das löste mein Problem! 10x !!! –

0

Dies kann passiert auch, wenn Sie einfach das Passwort nicht angeben. In meinem Fall habe ich Zugangsdaten aus einem web.config smtp Block verwendet und auf meinem Deployment Server (mit octopus deploy) vergessen, das Passwort-Attribut zu füllen.

0

Hatte das gleiche Problem. Gelöst es in den folgenden Schritten: 1) herausfinden, was der Server für SMTP-Authentifizierung bietet durch an den SMTP-Server verbinden über Telnet oder Kitt oder einen anderen Terminal:

telnet xxx.yyy.zzz.aaa 587 

(xxx.yyy.zzz.aaa = IP-Adresse des SMTP-Servers, 587 = Portnummer)

< Server antwortet mit "220-Protokoll + Version + time"

ehlo testing 

< Server zeigt Liste von Fähigkeiten zB

250-AUTH NTLM CRAM-MD5 LOGIN 

Der SMTP-Client versucht zuerst das sicherste Protokoll zu verwenden. In meinem Fall:

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

Es sieht aus, als ob das SMTP-Client versucht, NTLM, während der Server LOGIN auszuführen versucht.

Mit einem Hack (vgl https://blogs.msdn.microsoft.com/knom/2008/04/16/hacking-system-net-mail-smtpclient/) können alle Protokolle mit Ausnahme des einen gedreht werden der Server (LOGIN in diesem Fall) übernimmt:

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