2015-04-15 1 views
10

Ich verwende NLog, um Protokolle als E-Mail mit einem benutzerdefinierten Mailziel zu senden. Ich sende von meiner Office365 als Standard in meinem web.config-Konto einrichten (meiner Hauptprojekt) wie folgt:Ausnahme bei Verwendung von SMTP-Standardanmeldeinformationen für Office365 - Client wurde nicht authentifiziert, um anonyme E-Mails während MAIL-Nachrichten zu senden VON

<system.net> 
    <mailSettings> 
     <smtp deliveryMethod="Network" from="[email protected]"> 
     <network defaultCredentials="false" host="smtp.office365.com" port="587" userName="[email protected]" password="mypassword" enableSsl="true" /> 
     </smtp> 
    </mailSettings> 
    </system.net> 

ich die Write-Methode mit meinem Log-Ziel überschreiben (in meinem NLog Umsetzungspaket) als folgt:

protected override void Write(LogEventInfo logEvent) 
    { 
     try 
     { 
      using (var mail = new MailMessage()) 
      { 
       this.SetupMailMessage(mail, logEvent, this.Layout.Render(logEvent)); 

       using (SmtpClient smtpClient = new SmtpClient()) 
       { 
        smtpClient.UseDefaultCredentials = true; 
        smtpClient.Send(mail); 
       } 
      } 
     } 
     catch (Exception exception) 
     { 
      throw new NLogRuntimeException("An error occurred when sending a log mail message.", exception); 
     } 
    } 

Wenn das System versucht, eine E-Mail von diesem Konto, die folgenden System.Net.Mail.SmtpException geworfen zu senden:

der SMTP-Server erfordert eine sichere Verbindung oder der Client wurde nicht authentifiziert. Die Serverantwort war: 5.7.57 SMTP; Der Client wurde nicht authentifiziert, um anonyme E-Mails während des Sendens zu senden. VON

Ich habe die Anmeldeinformationen vierfach überprüft und sie sind korrekt. Weiß jemand, was sonst diese Ausnahme verursachen könnte?

UPDATE: Es stellt sich heraus, die CredentialCache.DefaultCredentials-Eigenschaft ist voll von leeren Zeichenfolgen. Wenn ich die Einstellungen manuell mit dem folgenden Code extrahiere, kann ich die Einstellungen von der web.config abrufen.

SmtpSection settings = (SmtpSection)ConfigurationManager.GetSection("system.net/mailSettings/smtp"); 
smtpClient.Credentials = new NetworkCredential(settings.Network.UserName, settings.Network.Password); 
smtpClient.Host = settings.Network.Host; 
smtpClient.Port = settings.Network.Port; 
smtpClient.EnableSsl = settings.Network.EnableSsl; 

var creds = CredentialCache.DefaultCredentials; // Is empty 

Ich kann dies als Workaround verwenden. Aber was gibt? Warum sollten die Standardanmeldeinformationen leer sein?

+0

SetupMailMessage legt eine Adresse fest? –

+0

Nein, ich möchte, dass die in der web.config eingerichtete Standardadresse verwendet wird. Obwohl ich auch versuchte, eine Absenderadresse manuell hinzuzufügen (mit 'mailMessage.From = new MailAddress (" [email protected] ");'), um zu sehen, ob das das Problem war, und die gleiche Ausnahme wurde geworfen. – Ivan

+0

Ich habe das gleiche Problem mit ELMAH nach dem Wechsel zu Office 365. Ich legte die DefaultCredentials = False in der XML, aber es scheint, dies hat keine Auswirkungen bei der Verwendung der XML-Konfiguration. – Cody

Antwort

7

Obwohl die Problemumgehung, die ich in der Antwortupdate erwähnte, funktionierte, war ich nicht glücklich darüber, diese Werte manuell abzurufen. Die Lösung war für mich zu der Linie entfernen

smtpClient.UseDefaultCredentials = true; 

aus dem ursprünglichen Code, den ich geschrieben. Es stellt sich heraus, dass smtpClient mit den Standardanmeldeinformationen initialisiert wird, die ich in der web.config eingerichtet habe, und die oben entfernte Zeile überschrieb sie mit leeren Zeichenfolgen von CredentialCache.DefaultCredentials. Ich weiß immer noch nicht, warum CredentialCache.DefaultCredentials leer ist oder wenn dies von der web.config aufgefüllt werden soll, aber das war die Ursache meines Problems.

Wenn jemand einen weiteren Einblick in dieses Thema hat, bitte eine bessere Antwort!

1

Wenn Sie diese Integration bei einem Drittanbieter-Hosting-Provider durchführen, müssen Sie auch den Domänennamen angeben.

9

Dank dieses Beitrags konnte ich unsere Probleme lösen. Wir haben Postfächer von einem hybriden Setup bei Rackspace auf O365 migriert. Das zum Senden verwendete Postfach war zuvor kein Exchange-Konto, wurde jedoch nach der Migration eins.

mySmtpClient = New SmtpClient("smtp.office365.com") 
mySmtpClient.Port = 587 
mySmtpClient.EnableSsl = True 
mySmtpClient.Credentials = New System.Net.NetworkCredential("[email protected]", "password", "domain.com") 
mySmtpClient.Send(Msg) 

vorherige Setup bedurften uns nicht Port zur Verfügung zu stellen oder ssl aktivieren oder sogar die Domain in den Credential-Parameter setzen. Hoffe, das hilft mit Leuten, die mit VB-Skripten arbeiten müssen, die E-Mails via SMTP mit Office 365 automatisieren.

+0

das funktioniert. aber ich habe keine Domäne für create credentials verwendet. Vielen Dank. – shana

0

Ich hatte das gleiche Problem, was es für mich funktionierte, war die Verwendung des System.Security.SecureString, um das Passwort statt zu setzen Zeichenfolge Beispiel:

System.Security.SecureString psw = neue System.Security.SecureString();

 string PasswordGmail = "XXXXXX"; 

     foreach (char item in PasswordGmail.ToCharArray()) 
     { 
      psw.AppendChar(item); 
     } 

     client.Credentials = new System.Net.NetworkCredential("[email protected]", psw); 
Verwandte Themen