在使用SmtpClient发送电子邮件之前,如何验证用户名和密码是否匹配?

时间:2014-07-23 19:26:53

标签: c# smtpclient

我有一个非常简单的电子邮件表单,使用部门电子邮件帐户向给定的收件人发送电子邮件。但是,该公司使密码每隔90天到期,并且我创建了一个Web表单,授权用户可以在该表单中更改表单的密码/电子邮件地址。

以下是代码:

 SmtpClient smtp = new SmtpClient();
 smtp.Host = host;
 smtp.UseDefaultCredentials = false;
 smtp.Credentials = new System.Net.NetworkCredential(username, password);

 try
 {
      smtp.Send(iEditMail);
 }
 catch(SmtpException exception)
 {
     return Request.CreateResponse(HttpStatusCode.InternalServerError, exception.Message + " Make sure the username and password is correct.");
 }

由于用户有责任输入密码,因此他们可能会意外输入错误的电子邮件帐户密码,否则密码可能会过期。我需要能够捕获这个,以便可以通知尝试发送电子邮件的用户。 (顺便说一句,这仅供部门使用)。如何在发送电子邮件之前确认凭据是否正确。现在它没有任何错误告诉电子邮件没有被发送 - 我们只是没有收到它。

3 个答案:

答案 0 :(得分:1)

首先:

如果可以,最好创建一个服务帐户并使用这些凭据。这样就不需要定期更改凭证。 (@ mason的建议)

但是,如果不可能:

根据MSDN,如果身份验证失败,SmtpClient.Send function将抛出SmtpException。这很糟糕,因为同样的异常也可能意味着其他各种各样的事情。但听起来您想要验证用户名和密码而不发送电子邮件。 SMTP protocol肯定允许这样做,但SMTPClient类仅提供发送电子邮件的方法。我不知道任何提供你想要的内置.NET类 所以我认为你需要

  1. 使用TCP编写自己的SMTP代码。
  2. 查找提供更多功能的第三方SMTP客户端..
  3. 将虚拟电子邮件发送到虚拟地址,然后查看StatusCode属性以查看是否存在身份验证问题。
  4. 如果你关心SSL,选项号1很难。如果您只使用纯文本,我认为对SMTP进行身份验证并不是那么难。但越来越多的邮件服务器禁止这样做。选项3是一个黑客,但应该很容易。

    编辑:添加了有关StatusCode属性的详细信息。

答案 1 :(得分:-1)

如果一个或多个收件人,SMTPClient的Send(MailMessage)方法会引发SmtpFailedRecipientsException异常 地址不正确或无法访问。

示例代码:

try
{
   smtpClient.Send(new MailMessage("test@test.com", "test@test.com", "test", "test"));
   return string.Empty;
}
catch (SmtpFailedRecipientException)
{
   return string.Empty;
}
catch (Exception ex)
{
   return string.Format("SMTP server connection test failed: {0}", ex.InnerException != null ? ex.InnerException.Message : ex.Message);
}

答案 2 :(得分:-1)

进行身份验证时,请在会话中存储用户名和密码。将会话的值与用户条目进行比较。如果bool == true,则发送电子邮件,否则不要。

相关问题