2012-06-06 133 views
3

我试图通过使用集成Windows身份验证的域SMTP服务器发送电子邮件。当明确指定凭据,一切工作正常:为什么忽略SmtpClient.UseDefaultCredentials?

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] ETS或设置,其控制是否在的DefaultCredentials与请求发送的布尔值”,即

  • “对于一个客户端应用程序[CredentialCache.DefaultCredentials]通常是运行该应用程序的用户的Windows凭据(用户名,密码和域)“,并且该测试的c颂歌是一个Windows窗体从同一个账户其凭据上面的第一个样品中指定运行客户端应用程序,

为什么第二次样品失败,而第一个作品?


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

回答

3

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

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

下面是一些其他的事情要尝试:

+0

这很有意义,因为如果您不这样做,凭据可能设置为空 – BumbleB2na

+0

它有帮助。部分。现在引发了一个新的异常:“SMTP服务器需要安全连接或客户端未通过身份验证。服务器响应是:5.7.3客户端未通过身份验证。“ –

+0

您是否指定了EnableSsl? –

0

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

请参阅Microsoft文档(https://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.usedefaultcredentials(v=vs.110).aspx),它指出,如果UseDefaultCredentials是假的(默认值),你不会在凭据提供任何财产,“然后邮件被发送到服务器匿名 ”。