我正在尝试发送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在电子邮件消息中添加一个超文本标记语言类型,以便客户端将消息呈现为超文本标记语言。
发布于 2013-04-06 18:07:44
内置的SmtpAppender不支持这一点,因此您需要使用自己的附加器。
发布于 2014-02-27 01:32:13
由于到目前为止log4net还不支持消息体中的超文本标记语言格式,所以我编写了自己的附加器:
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的最新版本。我只删除了旧的Framework版本支持的东西,并添加了这个字符串:
mailMessage.IsBodyHtml = IsBodyHtml;您可以获得最新版本的standard log4net's SmtpAppender here。
更新:
下面是一个示例配置(灵感来自these示例):
<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
复制相似问题