为什么忽略 SmtpClient.UseDefaultCredentials
本文关键字:UseDefaultCredentials SmtpClient 为什么 | 更新日期: 2023-09-27 18:36:21
我正在尝试通过使用集成Windows身份验证的域SMTP服务器发送电子邮件。显式指定凭据时,一切正常:
using (var client = new SmtpClient("<Server>"))
{
client.Credentials = new NetworkCredential("<User name>", "<Password>");
client.EnableSsl = true;
client.Send(...);
}
SMTP服务器日志显示EHLO,STARTTLS,STARTTLS和EHLO,然后是AUTH,MAIL等。
另一方面,当使用默认凭据时:
using (var client = new SmtpClient("<Server>"))
{
client.UseDefaultCredentials = true;
client.EnableSsl = true;
client.Send(...);
}
- 抛
出
SmtpException
,并显示消息"发送邮件失败"。内部
IOException
消息是:"无法从传输连接读取数据:远程主机强行关闭了现有连接。
内部-内部
SocketException
是:"远程主机强行关闭了现有连接"。
SMTP服务器日志显示EHLO,STARTTLS,STARTTLS和EHLO,然后什么都没有。
如果将选项从源代码移动到 App.config configuration/system.net/mailSettings/smtp/network
,并且无论是否指定端口号,结果都是完全相同的(第一个示例成功,第二个示例失败)。
鉴于:
根据文档,
SmtpClient.UseDefaultCredentials
"[g]ets 或设置一个布尔值,用于控制是否随请求一起发送 DefaultCredentials","对于客户端应用程序,[
CredentialCache.DefaultCredentials
] 通常是运行该应用程序的用户的 Windows 凭据(用户名、密码和域)",并且测试的代码是从同一帐户运行的 Windows 窗体客户端应用程序,其凭据在上面的第一个示例中指定,
为什么第二个样本失败,而第一个样本有效?
在一个论坛上,有人建议该问题可能是由不支持NTLM的SMTP服务器引起的。通过对服务器进行 EHLOing,似乎支持 NTLM,其中一个响应行正在250-AUTH GSSAPI NTLM
。
如果 UseDefaultCredentials 设置为 true,则并不意味着使用 Credentials 属性中的值。这意味着使用"当前登录用户"的凭据,对于 IIS Web 应用,该凭据通常是应用程序池标识,对于 Windows 服务,它是服务的标识,对于桌面应用程序,它是登录到 Windows 的用户的标识。
如果 UseDefaultCredentials 为 false(默认值),则在设置了值时将使用 Credentials 属性,否则邮件将匿名发送。
请参阅Microsoft文档 https://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.usedefaultcredentials(v=vs.110).aspx(在"备注"部分)。
我认为您实际上还必须指定凭据。UseDefaultCredentials只是一个标志,告诉SMTPClient使用提供给Credentials属性的Credentials。
client.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
以下是一些其他方法可以尝试:
- 这是使用 .NET 4 吗?此 Connect 错误报告建议该版本存在问题(尽管它很旧且未解决)。您可以尝试 .NET v3.5 或 v4.5
- 可能是跨区域问题吗?
- 尝试使用 app.config 文件指定设置,看看这会更改任何内容。