首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Log4net html格式的SmtpAppender

Log4net html格式的SmtpAppender
EN

Stack Overflow用户
提问于 2013-04-05 06:16:14
回答 2查看 3.5K关注 0票数 7

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

代码语言:javascript
复制
    <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在电子邮件消息中添加一个超文本标记语言类型,以便客户端将消息呈现为超文本标记语言。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-06 18:07:44

内置的SmtpAppender不支持这一点,因此您需要使用自己的附加器。

票数 2
EN

Stack Overflow用户

发布于 2014-02-27 01:32:13

由于到目前为止log4net还不支持消息体中的超文本标记语言格式,所以我编写了自己的附加器:

代码语言:javascript
复制
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选项,如下所示:

代码语言:javascript
复制
<appender name="SmtpAppender" type="log4net.Appender.ExtendedSmtpAppender">
    ...
    <isBodyHtml value="true" />
    ...
</appender>

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

代码语言:javascript
复制
mailMessage.IsBodyHtml = IsBodyHtml;

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

更新:

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

代码语言:javascript
复制
<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>
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15822709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档