我正在尝试通过使用集成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 documentation,SmtpClient.UseDefaultCredentials
“[g]设置或设置一个布尔值,用于控制DefaultCredentials是否与请求一起发送”,
“对于客户端应用程序,[CredentialCache.DefaultCredentials
]通常是运行应用程序的用户的Windows凭据(用户名,密码和域),”
测试代码是从同一帐户运行的Windows窗体客户端应用程序,其帐户的凭据已在上面的第一个示例中指定,
为什么第二个样本失败,而第一个样本有效?
在论坛it was suggested上,问题可能是SMTP服务器不支持NTLM引起的。通过EHLO服务器,似乎支持NTLM ,其中一个响应行为250-AUTH GSSAPI NTLM
。
答案 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(默认值),并且您未在凭据中提供任何内容属性,“然后邮件将匿名发送到服务器”。