我正在尝试通过使用集成 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
消息是:“无法从传输连接读取数据:现有连接被远程主机强制关闭。”,和inner-inner
SocketException
是:“一个现有的连接被远程主机强行关闭”。
SMTP 服务器日志显示 EHLO、STARTTLS、STARTTLS 和 EHLO,然后什么也没有。
configuration/system.net/mailSettings/smtp/network
如果选项从源代码移动到 App.config并且无论是否指定了端口号,结果都是完全相同的(第一个示例成功,第二个示例失败) 。
鉴于:
根据文档,
SmtpClient.UseDefaultCredentials
“[g]ets 或设置一个布尔值,用于控制 DefaultCredentials 是否随请求一起发送”,即“对于客户端应用程序,[
CredentialCache.DefaultCredentials
] 通常是运行应用程序的用户的 Windows 凭据(用户名、密码和域)”,并且测试代码是一个 Windows 窗体客户端应用程序,从上面第一个示例中指定的凭据相同的帐户运行,
为什么第二个样本失败,而第一个样本有效?
在一个论坛上,有人建议该问题可能是由 SMTP 服务器不支持 NTLM 引起的。通过 EHLO 访问服务器,似乎支持 NTLM,响应行之一是250-AUTH GSSAPI NTLM
.