2016-06-30 18 views
5

Chciałbym użyć MailKit, aby wysłać wiadomość e-mail za pośrednictwem naszego serwera Exchange, korzystając z poświadczeń procesu.Czy można używać domyślnych poświadczeń sieciowych w programie Mailkit i Exchange?

budowania NetworkCredential z domeny/nazwa użytkownika/hasło pracuje:

using (var client = new SmtpClient(ProtocolLogger)) 
{ 
    client.Connect(server, port); 

    // Works 
    var creds = new NetworkCredential(username, password, domain); 
    client.Authenticate(creds); 

    client.Send(msg);   
} 

Jeśli używam CredentialCache.DefaultNetworkCredentials podczas biegania jako samego użytkownika, to nie z MailKit.Security.AuthenticationException:

using (var client = new SmtpClient(ProtocolLogger)) 
{ 
    client.Connect(server, port); 

    // Authentication failure 
    client.Authenticate(CredentialCache.DefaultNetworkCredentials); 

    client.Send(msg);   
} 

Wydaje ProtocolLogger następujące (z serwerem pocztowym i base64 zakodowane ciągi zmienione):

Connected to smtp://mymailserver:25/?starttls=when-available 
S: 220 mymailserver Microsoft ESMTP MAIL Service ready at Thu, 30 Jun 2016 12:45:04 +0930 
C: EHLO [172.1.1.2] 
S: 250-mymailserver Hello [172.1.1.2] 
S: 250-SIZE 51200000 
S: 250-PIPELINING 
S: 250-DSN 
S: 250-ENHANCEDSTATUSCODES 
S: 250-STARTTLS 
S: 250-X-ANONYMOUSTLS 
S: 250-AUTH NTLM LOGIN 
S: 250-X-EXPS GSSAPI NTLM 
S: 250-8BITMIME 
S: 250-BINARYMIME 
S: 250-CHUNKING 
S: 250-XEXCH50 
S: 250 XRDST 
C: STARTTLS 
S: 220 2.0.0 SMTP server ready 
C: EHLO [172.1.1.2] 
S: 250-mymailserver Hello [172.1.1.2] 
S: 250-SIZE 51200000 
S: 250-PIPELINING 
S: 250-DSN 
S: 250-ENHANCEDSTATUSCODES 
S: 250-AUTH NTLM LOGIN 
S: 250-X-EXPS GSSAPI NTLM 
S: 250-8BITMIME 
S: 250-BINARYMIME 
S: 250-CHUNKING 
S: 250-XEXCH50 
S: 250 XRDST 
C: AUTH NTLM {EncodedStringRemoved} 
S: 334 {EncodedStringRemoved} 
C: {EncodedStringRemoved} 
S: 535 5.7.3 Authentication unsuccessful 
C: AUTH LOGIN 
S: 334 {EncodedStringRemoved} 
C: 
S: 334 {EncodedStringRemoved} 
C: 
S: 334 {EncodedStringRemoved} 
C: QUIT 
S: 334 {EncodedStringRemoved} 

Warto zauważyć, że System.Net.Mail.SmtpClient wykorzystuje DefaultNetworkCredentials gdy ustawienie właściwości true UseDefaultCredentials, a to działa na mnie. Chcę używać MailKit z powodu dodatkowych funkcji, takich jak ProtocolLogging.

+0

Czy masz konto outlook skonfigurowane na komputerze. Aby domyślne poświadczenia działały, konto programu Outlook musi być skonfigurowane na komputerze. Musisz najpierw uruchomić program Outlook, który konfiguruje konto Outlooka dla użytkownika na lokalnym komputerze, który zawiera nazwę użytkownika i konto e-mail. Nazwa użytkownika jest następnie połączona z kontem użytkownika na komputerze, który ma poświadczenia użytkownika, w tym hasło. Poświadczenia systemu Windows są następnie używane jako domyślne dane logowania do sieci. Serwer pocztowy i komputer użyją zasad grupy do zweryfikowania hasła za pomocą sieciowego serwera haseł. – jdweng

+0

Dzięki za informacje. Testuję na mojej stacji roboczej dla programistów, która ma dla mnie konfigurację programu Outlook. Prowadzę również proces jako ja. Co ciekawe, kiedy używam wbudowanego 'System.Net.Mail.SmtpClient', to działa, więc musi istnieć różnica między tym, co MailKit i domyślny" SmtpClient "wysyłają przez przewód. Nie jestem świadomy sposobu, aby zobaczyć, co 'System.Net.Mail.SmtpClient' wysyła/odbiera, jak mogę z MailKil. To byłoby idealne, więc mogłem je rozróżnić. – JamesD

+0

Możesz użyć sniffer jak skrzypek, aby zobaczyć pakiety danych. Zwykle Corp Networks blokuje numery portów poczty e-mail, takie jak 587. Sposób działania wymiany polega na użyciu serwera proxy, który przekazuje wiadomość e-mail do centrali. Używanie programu Mailkit prawdopodobnie używa 587 i jest serwerem POP. Serwery POP nie używają DefaultCredentials i zamiast tego zawierają nazwę użytkownika i hasło i są zwykle blokowane. – jdweng

Odpowiedz

3

Nie można Ue CredentialCache.DefaultNetworkCredentials z MailKit bo gdy MailKit pyta poświadczenia, aby zapewnić nazwę użytkownika i hasło ciągi że musi wysłać do serwera, DefaultNetworkCredentials mówi MailKit że nazwa użytkownika i hasło łańcuchy są puste i tak MailKit próbuje uwierzytelnić z pustymi strunami.

System.Net.Mail wydaje się być w stanie użyć wewnętrznego API, aby uzyskać prawdziwe ciągi, do których MailKit nie ma dostępu.

+0

To wstyd, ale mogę zrozumieć dlaczego.Jest to wspaniała cecha wbudowanego klienta, ponieważ nie wymaga przechowywania poświadczeń użytkownika. Czy są jakieś inne opcje w mailkit? – JamesD