【问题标题】:Log4net html formatted SmtpAppenderLog4net html 格式化的 SmtpAppender
【发布时间】:2013-03-27 04:57:04
【问题描述】:

我正在尝试以 HTML 格式向我发送电子邮件。

    <appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">

  <to value="zzz@zzz.com"/>
  <from value="do_not_reply@zz.com"/>
  <subject value="zzzAdmin Logged Event" />
  <smtpHost value="email.zzz.com"/>
  <bufferSize value="1"/>
  <lossy value="false"/>
  <authentication value="Basic" />

我将错误记录为 html 格式的文本,但电子邮件客户端将 HTML 呈现为纯文本。

如何告诉 SMTPAppender 向电子邮件添加 HTML 类型,以便客户端将消息呈现为 HTML。

【问题讨论】:

    标签: .net logging smtp log4net


    【解决方案1】:

    内置的 SmtpAppender 不支持此功能,因此您需要滚动自己的附加程序。

    【讨论】:

      【解决方案2】:

      由于目前 log4net 不支持消息正文中的 HTML 格式,我编写了自己的附加程序:

      using System;
      using System.Net.Mail;
      using log4net.Appender;
      
      namespace log4net.Appender
      {
          public class ExtendedSmtpAppender : SmtpAppender
          {
              public bool IsBodyHtml { get; set; }
      
              protected override void SendEmail(string messageBody)
              {
                  // .NET 2.0 has a new API for SMTP email System.Net.Mail
                  // This API supports credentials and multiple hosts correctly.
                  // The old API is deprecated.
      
                  // Create and configure the smtp client
                  SmtpClient smtpClient = new SmtpClient();
                  if (!String.IsNullOrEmpty(SmtpHost))
                  {
                      smtpClient.Host = SmtpHost;
                  }
                  smtpClient.Port = Port;
                  smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
                  smtpClient.EnableSsl = EnableSsl;
      
                  if (Authentication == SmtpAuthentication.Basic)
                  {
                      // Perform basic authentication
                      smtpClient.Credentials = new System.Net.NetworkCredential(Username, Password);
                  }
                  else if (Authentication == SmtpAuthentication.Ntlm)
                  {
                      // Perform integrated authentication (NTLM)
                      smtpClient.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
                  }
      
                  using (MailMessage mailMessage = new MailMessage())
                  {
                      mailMessage.IsBodyHtml = IsBodyHtml;
                      mailMessage.Body = messageBody;
                      //mailMessage.BodyEncoding = BodyEncoding;
                      mailMessage.From = new MailAddress(From);
                      mailMessage.To.Add(To);
                      if (!String.IsNullOrEmpty(Cc))
                      {
                          mailMessage.CC.Add(Cc);
                      }
                      if (!String.IsNullOrEmpty(Bcc))
                      {
                          mailMessage.Bcc.Add(Bcc);
                      }
                      if (!String.IsNullOrEmpty(ReplyTo))
                      {
                          // .NET 4.0 warning CS0618: 'System.Net.Mail.MailMessage.ReplyTo' is obsolete:
                          // 'ReplyTo is obsoleted for this type.  Please use ReplyToList instead which can accept multiple addresses. http://go.microsoft.com/fwlink/?linkid=14202'
      #if !FRAMEWORK_4_0_OR_ABOVE
                          mailMessage.ReplyTo = new MailAddress(ReplyTo);
      #else
                          mailMessage.ReplyToList.Add(new MailAddress(m_replyTo));
      #endif
                      }
                      mailMessage.Subject = Subject;
                      //mailMessage.SubjectEncoding = m_subjectEncoding;
                      mailMessage.Priority = Priority;
      
                      // TODO: Consider using SendAsync to send the message without blocking. This would be a change in
                      // behaviour compared to .NET 1.x. We would need a SendCompletedCallback to log errors.
                      smtpClient.Send(mailMessage);
                  }
              }
          }
      }
      

      要在您的 log4net 配置中使用此附加程序,只需替换标准 SmtpAppender 定义的命名空间和类名并添加 isBodyHtml 选项,如下所示:

      <appender name="SmtpAppender" type="log4net.Appender.ExtendedSmtpAppender">
          ...
          <isBodyHtml value="true" />
          ...
      </appender>
      

      SendEmail 方法体源取自最新版本的标准 log4net 的 SmtpAppender。我只删除了旧的框架版本支持的东西并添加了这个字符串:

      mailMessage.IsBodyHtml = IsBodyHtml;
      

      您可以获得最新版本的standard log4net's SmtpAppender here

      更新:
      下面是一个示例配置(灵感来自 these 示例):

      <log4net>
        <!-- SmtpExAppender is set to be our ExtendedSmtpAppender -->
        <appender name="SmtpExAppender" type="log4net.Appender.ExtendedSmtpAppender">
          <to value="to@domain.com" />
          <from value="from@domain.com" />
          <subject value="test logging message" />
          <isBodyHtml value="true" />
          <smtpHost value="SMTPServer.domain.com" />
          <bufferSize value="512" />
          <lossy value="true" />
          <evaluator type="log4net.Core.LevelEvaluator">
            <threshold value="WARN"/>
          </evaluator>
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline%newline" />
          </layout>
        </appender>
      
        <!-- Set root logger level to DEBUG and its only appender to SmtpExAppender -->
        <root>
          <level value="DEBUG" />
          <appender-ref ref="SmtpExAppender" />
        </root>
      </log4net>
      

      【讨论】:

      • 也许 SmtpAppender 源链接应该指向here
      • 你能提供我需要的整个配置吗?
      • @user2783091,请参阅我的回答中的 UPDATE。基本上,您只需为标准log4net.Appender.SmtpAppender 进行任何适当的配置。然后,您只需将 type 属性从 type="log4net.Appender.SmtpAppender" 更改为 log4net.Appender.ExtendedSmtpAppender 并添加 &lt;isBodyHtml value="true" /&gt; 节点,如我在答案中所示。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多