是否可以使用Mailkit和Exchange的默认网络凭据?

Jam*_*esD 8 c# exchange-server mailkit

我想使用MailKit通过我们的Exchange服务器发送电子邮件,使用该进程的凭据.

NetworkCredential使用域/用户名/密码建立一个工作:

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

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

    client.Send(msg);        
}
Run Code Online (Sandbox Code Playgroud)

如果我CredentialCache.DefaultNetworkCredentials在以同一个用户身份运行时使用,则会失败并显示MailKit.Security.AuthenticationException:

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

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

    client.Send(msg);        
}
Run Code Online (Sandbox Code Playgroud)

ProtocolLogger输出以下(含邮件服务器和base64编码字符串改变):

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}
Run Code Online (Sandbox Code Playgroud)

值得注意的是,在将属性设置为true时使用,这对我System.Net.Mail.SmtpClient有用.我想使用MailKit,因为ProtocolLogging等额外的功能.DefaultNetworkCredentialsUseDefaultCredentials

jst*_*ast 5

您不能CredentialCache.DefaultNetworkCredentials与 MailKit 一起使用,因为当 MailKit 要求凭据提供它需要发送到服务器的用户名和密码字符串时, DefaultNetworkCredentials 告诉 MailKit 用户名和密码字符串为空,因此 MailKit 尝试使用空字符串进行身份验证。

System.Net.Mail 似乎能够使用内部 API 来获取 MailKit 无法访问的真实字符串。

  • 所需的“内部”API 称为 SSPI,并且实际上有详细记录。UriHender 在此处写下了使用 SSPI 的 MailKit 的 SASL 机制:https://github.com/jstedfast/MailKit/issues/332#issuecomment-398300208 (2认同)