it-swarm.com.de

Ausnahme mit Standard-SMTP-Anmeldeinformationen für Office365 - Der Client wurde während des Versendens von MAIL FROM nicht zum Senden anonymer E-Mails authentifiziert

Ich verwende NLog, um Protokolle als E-Mail mit einem benutzerdefinierten E-Mail-Ziel zu senden. Ich sende von meinem office365-Konto aus, das in meiner web.config (meines Hauptprojekts) als Standard eingerichtet ist, wie folgt:

  <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 überschreibe die Write-Methode mit meinem Protokollziel (in meinem NLog-Implementierungspaket) wie 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 aus zu senden, wird der folgende System.Net.Mail.SmtpException ausgegeben:

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

Ich habe die Anmeldeinformationen vierfach geprüft und sie sind korrekt. Weiß jemand, was sonst zu dieser Ausnahme führen könnte?

UPDATE: Es stellt sich heraus, dass die CredentialCache.DefaultCredentials-Eigenschaft mit leeren Zeichenfolgen gefüllt ist. Wenn ich die Einstellungen jedoch manuell mit dem folgenden Code extrahiere, kann ich die Einstellungen aus der web.config erhalten. 

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 es? Warum sind die Standardanmeldeinformationen leer?

11
Ivan

Obwohl die im Antwortupdate erwähnte Problemumgehung funktioniert hat, war ich nicht glücklich über das manuelle Abrufen dieser Werte. Die Lösung für mich war, die Leitung zu entfernen

smtpClient.UseDefaultCredentials = true;

vom ursprünglichen Code, den ich gepostet habe. Es stellt sich heraus, dass smtpClient mit den Standardanmeldeinformationen initialisiert wurde, die ich in der web.config eingerichtet habe, und die oben entfernte Zeile diese mit leeren Zeichenfolgen aus CredentialCache.DefaultCredentials überschrieb. Ich weiß immer noch nicht, warum CredentialCache.DefaultCredentials leer ist oder wann dies mit der web.config gefüllt werden soll, aber dies war die Ursache meines Problems.

Wenn jemand weitere Einsicht in diese hat, bitte eine bessere Antwort posten!

7
Ivan

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

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)

Bei früheren Setups mussten wir weder Port angeben, noch SSL aktivieren oder sogar die Domäne in die Berechtigungsparameter setzen. Ich hoffe, das hilft Leuten, die mit VB -Skripts arbeiten, die E-Mails über SMTP mit Office 365 automatisieren.

10
Pawr

Bei dieser Integration bei einem Hosting-Anbieter eines Drittanbieters müssen Sie auch den Domänennamen angeben.

SmtpClient client = new SmtpClient(SMTPSettings.Url, SMTPSettings.Port);
client.Credentials = new System.Net.NetworkCredential(SMTPSettings.UserName, SMTPSettings.Password, SMTPSettings.Domain);
1
ozkary

Ich hatte das gleiche Problem. Was für mich funktionierte, war die Verwendung von System.Security.SecureString, um das Passwort anstelle von string zu setzen. Beispiel:

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

        string PasswordGmail = "XXXXXX";

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

        client.Credentials = new System.Net.NetworkCredential("[email protected]", psw); 
0
Luis Adrian