2016-06-30 4 views
5

Ich möchte MailKit verwenden, um eine E-Mail über unseren Exchange-Server mit den Anmeldeinformationen des Prozesses zu senden.Ist es möglich, Standard-Netzwerkanmeldeinformationen mit Mailkit und Exchange zu verwenden?

eine NetworkCredential mit Domain/Benutzername/Passwort Aufbau arbeitet:

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

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

    client.Send(msg);   
} 

Wenn ich CredentialCache.DefaultNetworkCredentials verwenden, während als gleichen Benutzer läuft, es nicht mit einem MailKit.Security.AuthenticationException:

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

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

    client.Send(msg);   
} 

Die ProtocolLogger gibt Folgendes aus (mit Mailserver und base64 kodierten Strings geändert):

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} 

Es ist erwähnenswert, dass System.Net.Mail.SmtpClientDefaultNetworkCredentials verwendet, wenn die UseDefaultCredentials Eigenschaft auf true setzen, und das funktioniert für mich. Ich möchte MailKit wegen der zusätzlichen Funktionen wie ProtocolLogging verwenden.

+0

Haben Sie Outlook-Konto auf dem PC eingerichtet. Damit Default Credentials funktioniert, muss ein Outlook-Konto auf dem PC eingerichtet werden. Sie müssen Outlook also zuerst ausführen, welche Setups ein Outlook-Konto für den Benutzer auf dem lokalen PC sind, der den Benutzernamen und das E-Mail-Konto enthält. Der Benutzername wird dann mit dem Benutzerkonto auf dem PC verknüpft, auf dem sich die Benutzeranmeldeinformationen einschließlich des Kennworts befinden. Die Windows-Anmeldeinformationen werden dann als Standard-Netzwerkanmeldeinformationen verwendet. Der Mailserver und der PC verwenden beide Gruppenrichtlinien, um das Kennwort mit einem Netzwerkkennwortserver zu überprüfen. – jdweng

+0

Danke für die Info. Ich teste auf meinem Dev Workstation, die Outlook-Setup für mich hat. Ich führe den Prozess auch als mich. Interessanterweise funktioniert es, wenn ich den eingebauten 'System.Net.Mail.SmtpClient' benutze, also muss es einen Unterschied geben zwischen dem, was MailKit und dem Standard' SmtpClient' über die Leitung senden. Ich bin nicht bewusst eine Möglichkeit zu sehen, was 'System.Net.Mail.SmtpClient' sendet/empfängt, wie ich mit MailKil kann. Das wäre ideal, damit ich sie vergleichen könnte. – JamesD

+0

Sie können einen Sniffer wie Fiddler verwenden, um die Datenpakete zu sehen. Normalerweise blockieren Corp Networks E-Mail-Portnummern wie 587. Die Art, wie Exchange funktioniert, ist der Proxy-Server, der die E-Mail an die Vermittlungsstelle weiterleitet. Die Verwendung von Mailkit verwendet wahrscheinlich 587 und ist ein Pop-Server. Pop-Server verwenden keine DefaultCredentials und enthalten stattdessen Benutzername und Passwort und sind normalerweise blockiert. – jdweng

Antwort

3

Sie können nicht CredentialCache.DefaultNetworkCredentials mit MailKit ue denn wenn MailKit die Berechtigung fragt die Benutzernamen und Passwort-Strings zur Verfügung zu stellen, die sie an den Server senden muss, die DefaultNetworkCredentials MailKit sagt, dass die Benutzernamen und Passwort-Strings sind leer und so versucht MailKit zu authentifizieren mit leeren Saiten.

System.Net.Mail scheint in der Lage zu sein, eine interne API zu verwenden, um die echten Zeichenfolgen abzurufen, auf die MailKit keinen Zugriff hat.

+0

Das ist eine Schande, aber ich kann verstehen, warum.Es ist eine großartige Funktion des integrierten Clients, da keine Benutzeranmeldeinformationen gespeichert werden müssen. Gibt es noch andere Optionen mit Mailkit? – JamesD

Verwandte Themen