7

我正在尝试通过使用集成 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-innerSocketException是:“一个现有的连接被远程主机强行关闭”。

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​​ .

4

2 回答 2

9

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

如果UseDefaultCredentials为 false(默认值),如果该属性具有值 set ,则将使用Credentials属性,否则将匿名发送邮件。

请参阅 Microsoft 文档https://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.usedefaultcredentials (v=vs.110).aspx(在备注部分)。

于 2017-08-23T14:33:04.943 回答
6

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

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

这里有一些其他的尝试:

于 2012-06-06T15:56:35.933 回答