Dot-Net

Log4net html 格式化的 SmtpAppender

  • February 12, 2020

我正在嘗試以 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。

內置的 SmtpAppender 不支持此功能,因此您需要滾動自己的附加程序。

由於 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;

您可以在此處獲取標準 log4net 的SmtpAppender最新版本。

更新:

下面是一個範例配置(受這些範例的啟發):

<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>

引用自:https://stackoverflow.com/questions/15822709