【问题标题】:What type of authentication is System.Net.Mail.SmtpClient using when sending emails?System.Net.Mail.SmtpClient 在发送电子邮件时使用什么类型的身份验证?
【发布时间】:2015-03-21 22:52:15
【问题描述】:

希望这个问题有意义。我有一些 C# 代码可以在给定用户名、密码和域的情况下发送电子邮件。我怎么知道它使用的是什么类型的身份验证?

当我查看 SmtpClient.Credentials 属性的 MSDN 页面时,它说如果您使用基本身份验证,则凭据将作为纯文本发送。以下代码是否使用基本身份验证? MSDN 页面:https://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.credentials(v=vs.110).aspx

SmtpClient smtpClient = new SmtpClient();
NetworkCredential cred = new NetworkCredential("username", "password"); 
MailMessage message = new MailMessage(); 
MailAddress fromEmail = new MailAddress("from@yourdomain.com"); 

smtpClient.Host = "mail.mydomain.com";
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = cred;

message.From = fromEmail;
message.Subject = "my subject";

message.IsBodyHtml = true;
message.Body = "hello world!";
message.To.Add("toEmail@anything.com"); 

smtpClient.Send(message);

【问题讨论】:

  • 据我所知,SmtpClient 要求密码需要以纯文本形式传递。但建议是将您的 Smtp 设置存储在 web.config 或 app.config 文件中。 stackoverflow.com/questions/12359445/…。我会说这是基本身份验证。

标签: c# .net email


【解决方案1】:

通常SmtpClient 将始终选择“最佳”可用的身份验证方法(SMTP 服务器将告诉EHLO 命令的答案)。因此,如果不知道服务器实际支持什么,我们就无法真正回答。

SmtpClient可以选择以下方法:协商、NTLM、摘要和登录

这里有一些关于如何强制 SmtpClient 使用特定身份验证方法的有趣读物(顺便说一句,有点骇人听闻):http://blogs.msdn.com/b/knom/archive/2008/04/16/hacking-system-net-mail-smtpclient.aspx

【讨论】:

  • 很有帮助,但我看不到客户端发送到服务器的 EHLO 命令如何返回“最佳”可用的身份验证方法。根据我的谷歌搜索结果,EHLO 命令只是请求服务器发回有效的扩展 ESMTP 命令列表,而不一定是身份验证方法列表。但是,EHLO 确实在其列表中返回“AUTH”,让客户端知道他们可以使用此命令进行身份验证,前提是客户端提供用户名、密码和身份验证机制。差不多了,只需要填写最后一个细节。
  • 好吧,我没这么说。服务器对 EHLO 的响应包含可用身份验证方法的列表(请参阅 RFC 4954 P3:tools.ietf.org/html/rfc4954#page-3)。我写道,SmtpClient 将从该列表中选出“最好的”。
  • 很抱歉造成误解。感谢您的信息。
【解决方案2】:

此方法将使用基本身份验证,并将通过不安全的通道发送代码。这是因为:

SmtpClient 类仅支持 RFC 3207 中定义的基于传输层安全的安全 SMTP 的 SMTP 服务扩展。在此模式下,SMTP 会话在未加密的通道上开始,然后是 STARTTLS客户端向服务器发出命令以切换到使用 SSL 的安全通信。有关详细信息,请参阅 Internet 工程任务组 (IETF) 发布的 RFC 3207。

您可以在这种情况下使用 SSL:

EnableSsl 属性指定是否使用 SSL 访问指定的 SMTP 邮件服务器。

另外请注意

您可以使用ClientCertificates 指定应使用哪些客户端证书来建立 SSL 连接。 ServerCertificateValidationCallback 允许您拒绝 SMTP 服务器提供的证书。 SecurityProtocol 属性允许您指定要使用的 SSL 协议的版本。

【讨论】:

  • 我同意如果不启用 SSL,通信将是明文,但一般来说,如果未在消息中发送密码(即问题是什么)如果选择了另一种方法(如 Negociate、NTLM 或 Digest)
猜你喜欢
  • 2013-11-30
  • 1970-01-01
  • 2011-06-18
  • 2015-11-23
  • 2018-08-07
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多