是否可以对 Mailkit 和 Exchange 使用默认网络凭据?
Is it possible to use default network credentials with Mailkit and Exchange?
我想使用 MailKit 通过我们的 Exchange 服务器发送电子邮件,使用进程的凭据。
用 domain/username/password 建立一个 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);
}
如果我使用 CredentialCache.DefaultNetworkCredentials
而 运行 作为 同一用户 ,它 失败 并显示 MailKit.Security.AuthenticationException
:
using (var client = new SmtpClient(ProtocolLogger))
{
client.Connect(server, port);
// Authentication failure
client.Authenticate(CredentialCache.DefaultNetworkCredentials);
client.Send(msg);
}
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}
值得注意的是 System.Net.Mail.SmtpClient
在将 UseDefaultCredentials
属性 设置为 true 时使用 DefaultNetworkCredentials
,这对我有用。我想使用 MailKit,因为它有像 ProtocolLogging 这样的额外功能。
您不能将 CredentialCache.DefaultNetworkCredentials
与 MailKit 一起使用,因为当 MailKit 要求凭据提供它需要发送到服务器的用户名和密码字符串时,DefaultNetworkCredentials 告诉 MailKit 用户名和密码字符串为空并且所以 MailKit 尝试使用空字符串进行身份验证。
System.Net.Mail 似乎可以使用内部 API 来获取 MailKit 无法访问的真实字符串。
我想使用 MailKit 通过我们的 Exchange 服务器发送电子邮件,使用进程的凭据。
用 domain/username/password 建立一个 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);
}
如果我使用 CredentialCache.DefaultNetworkCredentials
而 运行 作为 同一用户 ,它 失败 并显示 MailKit.Security.AuthenticationException
:
using (var client = new SmtpClient(ProtocolLogger))
{
client.Connect(server, port);
// Authentication failure
client.Authenticate(CredentialCache.DefaultNetworkCredentials);
client.Send(msg);
}
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}
值得注意的是 System.Net.Mail.SmtpClient
在将 UseDefaultCredentials
属性 设置为 true 时使用 DefaultNetworkCredentials
,这对我有用。我想使用 MailKit,因为它有像 ProtocolLogging 这样的额外功能。
您不能将 CredentialCache.DefaultNetworkCredentials
与 MailKit 一起使用,因为当 MailKit 要求凭据提供它需要发送到服务器的用户名和密码字符串时,DefaultNetworkCredentials 告诉 MailKit 用户名和密码字符串为空并且所以 MailKit 尝试使用空字符串进行身份验证。
System.Net.Mail 似乎可以使用内部 API 来获取 MailKit 无法访问的真实字符串。