【问题标题】:Send email with Global.asax file使用 Global.asax 文件发送电子邮件
【发布时间】:2013-12-05 02:08:22
【问题描述】:

如果出现未处理的错误,我想向管理员发送一封电子邮件,其中包含发生错误的信息。以下是我的 web.config 和 Global.asax.cs 文件中的内容,重定向有效,但电子邮件无效:

<system.web>
    <customErrors mode="On" defaultRedirect="error.aspx" />
</system.web>

void Application_Error(object sender, EventArgs e)
        {
            // Code that runs when an unhandled error occurs
            // Get the exception object.
            Exception error = Server.GetLastError();

            MailMessage mail = new MailMessage();
            mail.To.Add("admin@mysite.com");
            mail.Subject = "Error";
            mail.Body = "Somebody has experienced an error." + "<br><br>";
            mail.Body += error.ToString();

            mail.IsBodyHtml = true;
            SmtpClient smtp = new SmtpClient();
            smtp.Host = "smtp.gmail.com";
            smtp.EnableSsl = true;
            smtp.Credentials = new System.Net.NetworkCredential("username", "password");
            smtp.Port = 587;
            smtp.Send(mail);

            Server.ClearError();
        }

【问题讨论】:

  • “电子邮件无法正常工作”的原因是什么?请更具体。
  • 你在smtp.Send(mail); 上没有异常吗?
  • 邮件没有发送,除了error.aspx页面的默认信息外,没有显示任何错误信息。看起来好像应用程序重定向到错误页面并且对 Global.asax 什么都不做。
  • 您能否在 Server.GetLastError() 之后立即检查您的 var 错误是否为 null,这样可以避免 error.ToString() 上的 null 异常。也尝试删除 defaultRedirect。
  • 我找到了这个,它解决了我的问题,至少现在是这样:stackoverflow.com/questions/343014/…

标签: c# asp.net unhandled-exception


【解决方案1】:

您应该安装Elmah(您可以通过NuGet 完成),而不是自己滚动,让它为您完成工作。最好的代码是你不写的代码。

Elmah 是一个位于 ASP.Net 堆栈顶部的 HttpModule,它可以捕获/处理未捕获的异常:

ELMAH(错误记录模块和处理程序)是一个应用程序范围的错误记录工具 那是完全可插拔的。它可以动态添加到正在运行的 ASP.NET Web 应用程序,甚至一台机器上的所有 ASP.NET Web 应用程序,无需任何 重新编译或重新部署。

将 ELMAH 放入正在运行的 Web 应用程序并进行适当配置后, 您无需更改任何代码即可获得以下功能:

  • 记录几乎所有未处理的异常。
  • 用于远程查看重新编码异常的整个日志的网页。
  • 远程查看任何记录的异常的完整详细信息的网页,包括 彩色堆栈跟踪。
  • 在很多情况下,你可以回顾一下ASP.NET原来的黄屏死机 为给定的异常生成,即使关闭了 customErrors 模式。
  • 每个错误发生时的电子邮件通知。
  • 日志中最近 15 个错误的 RSS 提要。

配置 Elmah 以发送电子邮件(除了记录之外)非常简单

如果您打算自己编写,请安装 Log4Net 并将其配置为使用 1 个或多个 SMTP appenders 以及您想要/需要/希望的任何其他日志附加程序。

【讨论】:

  • 现在,在 2016 年,使用 ELMAH 是很好的模式和实践吗?
【解决方案2】:
protected void Application_Error(Object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();
    EmailTheException( ex );
}

private void EmailTheException( Exception ex )
{
    MailMessage mail = new MailMessage();
    mail.To = "GroupEmail@SomeCompany.com";
    mail.From = "SomeApplication@SomeCompany.com";
    mail.Subject = "An Application Exception has Occurred.";
    mail.Body = ex.ToString();

    var smtpHost = ConfigurationManager.AppSettings["smtphost"];
    var port = Convert.ToUInt32(ConfigurationManager.AppSettings["port"]);
    using (SmtpClient client = new SmtpClient(smtpHost))
    {
        if (string.IsNullOrEmpty(smtpHost)) return;
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        client.UseDefaultCredentials = false;
        try
        {
            client.Send(mail);
        }
        catch (SmtpException smtpEx)
        {
           //write logging code here and capture smtpEx.Message
        }
    }
}

【讨论】:

    【解决方案3】:

    默认情况下,所有未捕获的异常都将记录到 Windows 事件日志中。您可以在Control Panel->Administrative Tools->Event Viewer->Windows Logs->Application

    中访问它

    【讨论】:

    • @Kristopher 并祈祷告诉您,您如何建议调试未发送的电子邮件?我很擅长调试,但我无法对这个问题进行通灵调试...
    猜你喜欢
    • 2012-03-08
    • 2016-04-17
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多