Dot-Net
Log4net html 格式化的 SmtpAppender
我正在嘗試以 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>