2013-04-04 39 views
6

Tôi đang cố gắng gửi cho tôi email ở định dạng HTML.Log4net html được định dạng 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" /> 

Tôi đăng nhập lỗi dưới dạng văn bản được định dạng html, nhưng ứng dụng khách email hiển thị HTML dưới dạng văn bản thuần túy.

Làm cách nào tôi có thể yêu cầu SMTPAppender thêm loại HTML vào thông báo email để khách hàng sẽ hiển thị thông báo dưới dạng HTML.

Trả lời

2

Việc xây dựng trong SmtpAppender không hỗ trợ này, do đó bạn sẽ cần phải cuộn appender của riêng bạn.

10

Kể từ log4net là không hỗ trợ định dạng HTML trong nội dung thư cho đến nay, tôi đã viết appender của riêng tôi:

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); 
      } 
     } 
    } 
} 

Để sử dụng appender này trong cấu hình log4net bạn, chỉ cần thay thế không gian tên và lớp tên định nghĩa SmtpAppender tiêu chuẩn của bạn và thêm tùy chọn isBodyHtml như sau:

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

các SendEmail nguồn phương pháp cơ thể được lấy từ phiên bản mới nhất của SmtpAppender của log4net tiêu chuẩn. Tôi chỉ loại bỏ các phiên bản cũ Khung hỗ trợ các công cụ và thêm vào chuỗi này:

mailMessage.IsBodyHtml = IsBodyHtml; 

Bạn có thể nhận được phiên bản mới nhất của standard log4net's SmtpAppender here.

UPDATE:
Dưới đây là một cấu hình mẫu (lấy cảm hứng với these ví dụ):

<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

Có lẽ vào liên kết nguồn SmtpAppender phải trỏ đến [ở đây] (http://svn.apache.org/ viewvc/logging/log4net/trunk/src/log4net/Appender/SmtpAppender.cs? view = log)? – Geoff

+0

@Geoff, Cảm ơn! Tôi đã cập nhật nó. –

+0

bạn có thể cung cấp toàn bộ cấu hình mà tôi cần không? – user2783091

Các vấn đề liên quan