【问题标题】:ASP.Net C# - Catching errors when sending an emailASP.Net C# - 发送电子邮件时捕获错误
【发布时间】:2014-09-28 00:12:39
【问题描述】:

所以我有一个发送电子邮件的功能,我在经过一些验证后在按钮单击事件中运行该电子邮件。但是,如何在发送电子邮件时发现任何错误?我熟悉 try-catch-finally 方法,那么底部的代码就足够了吗?

protected void sendEmail(string activationCode, string username, string emailAddress)
{
    SmtpClient SmtpServer = new SmtpClient("smtp.live.com");
    var mail = new MailMessage();
    mail.From = new MailAddress("EMAIL");
    mail.To.Add(emailAddress);
    mail.Subject = "Please activate your account.";
    mail.IsBodyHtml = true;
    string htmlBody;
    htmlBody = "Dear " + username + "<br /><br />";
    htmlBody += "Thank you for registering an account.  Please activate your account by visiting the URL below:<br /><br />";
    htmlBody += "http://localhost:57167/signin.aspx?activate=" + activationCode + "<br /><br />";
    htmlBody += "Thank you.";
    mail.Body = htmlBody;
    SmtpServer.Port = 587;
    SmtpServer.UseDefaultCredentials = false;
    SmtpServer.Credentials = new System.Net.NetworkCredential("EMAIL", "PASSWORD");
    SmtpServer.EnableSsl = true;
    SmtpServer.Send(mail);
}

这样可以吗?

protected void sendEmail(string activationCode, string username, string emailAddress)
{
    try
    {
    SmtpClient SmtpServer = new SmtpClient("smtp.live.com");
    var mail = new MailMessage();
    mail.From = new MailAddress("EMAIL");
    mail.To.Add(emailAddress);
    mail.Subject = "Please activate your account.";
    mail.IsBodyHtml = true;
    string htmlBody;
    htmlBody = "Dear " + username + "<br /><br />";
    htmlBody += "Thank you for registering an account.  Please activate your account by visiting the URL below:<br /><br />";
    htmlBody += "http://localhost:57167/signin.aspx?activate=" + activationCode + "<br /><br />";
    htmlBody += "Thank you.";
    mail.Body = htmlBody;
    SmtpServer.Port = 587;
    SmtpServer.UseDefaultCredentials = false;
    SmtpServer.Credentials = new System.Net.NetworkCredential("EMAIL", "PASSWORD");
    SmtpServer.EnableSsl = true;
    SmtpServer.Send(mail);
    }
    catch
    {
        lblError.Text = "error message";
    }
}
    }

【问题讨论】:

  • 你不应该try那么多代码,只把可能发生异常的代码放在try-catch块内。
  • 我捕获了 SmtpException 和 Exception - 这似乎可以处理大多数出错的事情。

标签: c# asp.net email error-handling try-catch


【解决方案1】:

是的,这或多或少就足够了(取决于您要做什么)。

最好的方法是保留当前方法(第一个列表),然后再使用另一个方法:

public void dispatchEmail(string activationCode, string username, string emailAddress)
{
  try
  {
      this.sendEmail(activationCode, username, emailAddress);
  }
  catch (Exception e) // Note: This is considered bad practice, might want to check for specific exceptions
  {
   lblError.Text = "error message: " + e.ToString();
  }
}

【讨论】:

    【解决方案2】:

    您应该使用 SmtpException Class 通过访问其 statuscode 属性来处理异常。

    也将您的 Try 块仅放在您认为可能发生异常的地方。

            try
            {
                SmtpServer.Send(mail);
            }
            catch (SmtpFailedRecipientsException ex)
            {
    
            }
    

    【讨论】:

      【解决方案3】:

      我会改变一些事情。见以下代码:

      using(SmtpClient SmtpServer = new SmtpClient("smtp.live.com"))
      {
          var mail = new MailMessage();
          mail.From = new MailAddress("EMAIL");
          mail.To.Add(emailAddress);
          mail.Subject = "Please activate your account.";
          mail.IsBodyHtml = true;
          string htmlBody;
          htmlBody = "Dear " + username + "<br /><br />";
          htmlBody += "Thank you for registering an account.  Please activate your account by visiting the URL below:<br /><br />";
          htmlBody += "http://localhost:57167/signin.aspx?activate=" + activationCode + "<br /><br />";
          htmlBody += "Thank you.";
          mail.Body = htmlBody;
          SmtpServer.Port = 587;
          SmtpServer.UseDefaultCredentials = false;
          SmtpServer.Credentials = new System.Net.NetworkCredential("EMAIL", "PASSWORD");
          SmtpServer.EnableSsl = true;
          try
          {
              SmtpServer.Send(mail);
          }
          catch(Exception ex)
          {
              lblError.Text = ex.Message;
          }
      }
      
      1. 使用语句正确处理 SmtpClient,无论是否失败。
      2. 将分配移到 try-catch 之外。
      3. 尽管我反对捕获一般异常(您应该知道会出现什么样的异常);使用ex.Message 显示相关的异常信息。

      【讨论】:

      • 使用“使用”语句。该类应实现 IDisposable 接口。 SmtpClient 类没有实现 IDisposable 接口,因此没有可用的 Dispose 方法。
      【解决方案4】:

      zaitsman 的回答是我通常会做的。最重要的是,如果要求您进行非阻塞调用以发送电子邮件(以便应用程序的其余部分不会等待电子邮件发送并可以继续进行其余工作),您应该使用TPL 并向电子邮件发件人发出非阻塞呼叫。像这样 -

       Task emailTask = Task.Factory.StartNew(() => dispatchEmail();
      

      【讨论】:

        猜你喜欢
        • 2016-04-09
        • 1970-01-01
        • 2012-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-13
        • 2016-03-30
        • 1970-01-01
        相关资源
        最近更新 更多