2015-04-15 38 views
10

Używam języka NLog do wysyłania dzienników jako wiadomości e-mail z niestandardowym celem poczty. Przesyłam moje Office 365 od skonfigurowane konto jako domyślne w moim web.config (z moim głównym projektu) w sposób następujący:Wyjątek przy użyciu domyślnych danych uwierzytelniających SMTP w Office 365 - Klient nie został uwierzytelniony, aby wysyłać anonimowe wiadomości podczas wysyłania wiadomości z adresu

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

zastąpić metodę Write z moim docelowym dziennika (w moim pakietu wdrożeniowego nlog) jako następująco:

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

Gdy system próbuje wysłać mail z tego konta, następujące System.Net.Mail.SmtpException jest wyrzucany:

serwer SMTP wymaga bezpiecznego połączenia lub klient nie został uwierzytelniony. Odpowiedź serwera: 5.7.57 SMTP; Klient nie został uwierzytelniony, aby wysyłać anonimowe wiadomości podczas wysyłania wiadomości e-mail z adresu

Mam czterokrotne sprawdzenie poświadczeń i są one poprawne. Czy ktoś wie, co jeszcze może być przyczyną tego wyjątku?

AKTUALIZACJA: Okazuje się, że właściwość CredentialCache.DefaultCredentials jest pełna pustych ciągów. Jednak po ręcznym wyodrębnieniu ustawień za pomocą poniższego kodu mogę uzyskać ustawienia z pliku web.config.

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 

Mogę użyć tego jako obejścia. Ale co daje? Dlaczego domyślne dane logowania są puste?

+0

SetupMailMessage ustawia adres? –

+0

Nie, chcę, aby używał domyślnego adresu From skonfigurowanego w pliku web.config. Chociaż próbowałem również ręcznie dodać adres From (z 'mailMessage.From = new MailAddress (" [email protected] ");') aby sprawdzić, czy to był problem, i ten sam wyjątek został zgłoszony. – Ivan

+0

Mam ten sam problem przy użyciu ELMAH po przejściu do Office 365. Ustawię defaultCredentials = false w XML, ale wydaje się, że nie ma to wpływu na konfigurację XML. – Cody

Odpowiedz

7

Mimo że obejście problemu, o którym wspomniałem w aktualizacji odpowiedzi, działa, nie byłem zadowolony z ręcznego pobierania tych wartości. Rozwiązanie dla mnie było usunąć wiersz

smtpClient.UseDefaultCredentials = true; 

z oryginalnego kodu napisałem. Okazuje się, że smtpClient jest inicjowane z domyślnymi poświadczeniami skonfigurowanymi w pliku web.config, a powyższa linia została zastąpiona pustymi ciągami z CredentialCache.DefaultCredentials. Nadal nie wiem, dlaczego CredentialCache.DefaultCredentials jest pusty lub kiedy ma to być wypełnione z web.config, ale to było źródło mojego problemu.

Jeśli ktoś ma więcej informacji na ten temat, proszę zamieścić lepszą odpowiedź!

1

Podczas wykonywania integracji z zewnętrznym dostawcą usług hostingowych należy również podać nazwę domeny.

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

Dzięki temu wpisowi udało się rozwiązać nasze problemy. Przeprowadziliśmy migrację skrzynek pocztowych do O365 z konfiguracji hybrydowej w Rackspace. Skrzynka pocztowa używana do wysyłania nie była wcześniej kontem Exchange, ale stała się jedną po migracji.

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) 

Poprzednia konfiguracja nie wymagała od nas podania portu lub włączenia protokołu SSL, a nawet wprowadzenia domeny do parametrów poświadczeń. Mam nadzieję, że to pomoże ludziom, którzy muszą pracować ze skryptami VB zautomatyzowanie wiadomości e-mail przez SMTP z Office 365.

+0

to działa. ale nie użyłem domeny do utworzenia referencji. dzięki. – shana

0

Miałem ten sam problem, to, co zadziałało dla mnie było użycie System.Security.SecureString do wprowadzenia hasła zamiast ciąg znaków, przykład:

System.SecurityString 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);