为什么忽略 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

为什么忽略 SmtpClient.UseDefaultCredentials

如果 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 文件指定设置,看看这会更改任何内容。
相关文章:
  • 没有找到相关文章