2013-04-04 70 views
6

我想以HTML格式向我发送电子邮件。Log4net html格式化SmtpAppender

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

    <to value="[email protected]"/> 
    <from value="[email protected]"/> 
    <subject value="zzzAdmin Logged Event" /> 
    <smtpHost value="email.zzz.com"/> 
    <bufferSize value="1"/> 
    <lossy value="false"/> 
    <authentication value="Basic" /> 

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

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

回答

2

内置的SmtpAppender不支持这个,所以你需要推出自己的appender。

10

由于log4net的不是在邮件正文中支持HTML格式的,到目前为止,我写我自己的appender:

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的配置使用此附加目的地,只需更换的命名空间和类名

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

的SendEmail方法体源是从最新版本采取:您的标准SmtpAppender定义,并添加如下的isBodyHtml选项标准的log4net的SmtpAppender。我只是删除旧的框架版本支持的东西,并将此字符串:

mailMessage.IsBodyHtml = IsBodyHtml; 

你可以得到最新版本的standard log4net's SmtpAppender here的。

UPDATE:
下面是一个示例的配置(与these例子启发):

<log4net> 
    <!-- SmtpExAppender is set to be our ExtendedSmtpAppender --> 
    <appender name="SmtpExAppender" type="log4net.Appender.ExtendedSmtpAppender"> 
    <to value="[email protected]" /> 
    <from value="[email protected]" /> 
    <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> 
+0

也许SmtpAppender源链接应指向[这里](http://svn.apache.org/ viewvc /记录/ log4net的/中继/ SRC/log4net的/追加程序/ SmtpAppender.cs?视图=日志)? – Geoff 2014-10-20 14:42:03

+0

@Geoff,谢谢!我已经更新了它。 – 2014-10-20 15:05:15

+0

你可以给我需要的整个配置吗? – user2783091 2015-10-16 07:23:48