为什么忽略SmtpClient.UseDefaultCredentials?

时间:2012-06-06 15:10:59

标签: c# smtp credentials smtpclient

我正在尝试通过使用集成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,并且无论何时指定端口号,结果都完全相同(第一个样本成功,第二个样本失败)。

鉴于:

  • according to the documentationSmtpClient.UseDefaultCredentials“[g]设置或设置一个布尔值,用于控制DefaultCredentials是否与请求一起发送”,

  • “对于客户端应用程序,[CredentialCache.DefaultCredentials]通常是运行应用程序的用户的Windows凭据(用户名,密码和域),”

    < / LI>
  • 测试代码是从同一帐户运行的Windows窗体客户端应用程序,其帐户的凭据已在上面的第一个示例中指定,

为什么第二个样本失败,而第一个样本有效?


在论坛it was suggested上,问题可能是SMTP服务器不支持NTLM引起的。通过EHLO服务器,似乎支持NTLM ,其中一个响应行为250-AUTH GSSAPI NTLM

2 个答案:

答案 0 :(得分:4)

我认为你实际上也必须指定凭证。 UseDefaultCredentials只是一个标志,告诉SMTPClient使用提供给凭据属性的凭据。

client.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;

以下是其他一些尝试:

答案 1 :(得分:2)

如果 UseDefaultCredentials 设置为true,则并不意味着使用 Credentials 属性中的值。相反,它意味着使用“当前登录用户”的凭据,在IIS Web应用程序的情况下通常是应用程序池标识,并且在Windows服务的情况下是身份该服务,对于桌面应用程序,它是登录Windows的用户的身份。

请参阅Microsoft文档(https://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.usedefaultcredentials(v=vs.110).aspx),其中指出如果 UseDefaultCredentials 为false(默认值),并且您未在凭据中提供任何内容属性,“然后邮件将匿名发送到服务器”。