2012-06-07 4 views
4

Я хочу иметь возможность указывать несколько адресов хоста сервера smtp и реализовывать логику, в результате чего при сбое электронной почты с использованием одного smtp-сервера он пытается отправить, используя следующий адрес SMTP-сервера. Возможно ли использовать log4net. Можем ли мы переопределить некоторые функции log4net и реализовать свою собственную логику для отправки электронных писем?Несколько адресов smtphost с использованием smtpAppender в log4net

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender"> 
    <to value="[email protected]" /> 
    <from value="[email protected]" /> 
    <subject>Error Notification</subject> 
    **<smtpHost value="10.0.0.12, 10.0.0.13" />** 
    <authentication value="None" /> 
    <port value="25" /> 
    <bufferSize value="1" /> 
    <EnableSsl value="false"/> 
    <lossy value="true" /> 
    <evaluator type="log4net.Core.LevelEvaluator"> 
    <threshold value="ERROR"/> 
    </evaluator> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%newline%date [%thread] %level %logger - %message%newline%newline%exception" /> 
    </layout> 
</appender> 

ответ

6

Это возможно, только если вы реализуете custom SmtpAppender.

Я скопировал CustomSmtpAppender код от Log4net sourcecode Examples. hopefullly это поможет вам.

не забудьте передать CustomSmtpAppender в ваше приложение конфигурации

using System; 
using System.IO; 
using System.Web.Mail; 

using log4net.Layout; 
using log4net.Core; 
using log4net.Appender; 

namespace SampleAppendersApp.Appender 
{ 
    /// <summary> 
    /// Simple mail appender that sends individual messages 
    /// </summary> 
    /// <remarks> 
    /// This SimpleSmtpAppender sends each LoggingEvent received as a 
    /// separate mail message. 
    /// The mail subject line can be specified using a pattern layout. 
    /// </remarks> 
    public class SimpleSmtpAppender : AppenderSkeleton 
    { 
     public SimpleSmtpAppender() 
     { 
     } 

     public string To 
     { 
      get { return m_to; } 
      set { m_to = value; } 
     } 

     public string From 
     { 
      get { return m_from; } 
      set { m_from = value; } 
     } 

     public PatternLayout Subject 
     { 
      get { return m_subjectLayout; } 
      set { m_subjectLayout = value; } 
     } 

     public string SmtpHost 
     { 
      get { return m_smtpHost; } 
      set { m_smtpHost = value; } 
     } 

     #region Override implementation of AppenderSkeleton 

     override protected void Append(LoggingEvent loggingEvent) 
     { 
      try 
      {  
       StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture); 

       string t = Layout.Header; 
       if (t != null) 
       { 
        writer.Write(t); 
       } 

       // Render the event and append the text to the buffer 
       RenderLoggingEvent(writer, loggingEvent); 

       t = Layout.Footer; 
       if (t != null) 
       { 
        writer.Write(t); 
       } 

       MailMessage mailMessage = new MailMessage(); 
       mailMessage.Body = writer.ToString(); 
       mailMessage.From = m_from; 
       mailMessage.To = m_to; 

       if (m_subjectLayout == null) 
       { 
        mailMessage.Subject = "Missing Subject Layout"; 
       } 
       else 
       { 
        StringWriter subjectWriter = new StringWriter(System.Globalization.CultureInfo.InvariantCulture); 
        m_subjectLayout.Format(subjectWriter, loggingEvent); 
        mailMessage.Subject = subjectWriter.ToString(); 
       } 

       if (m_smtpHost != null && m_smtpHost.Length > 0) 
       { 
        SmtpMail.SmtpServer = m_smtpHost; 
       } 

       SmtpMail.Send(mailMessage); 
      } 
      catch(Exception e) 
      { 
       ErrorHandler.Error("Error occurred while sending e-mail notification.", e); 
      }  
     } 

     override protected bool RequiresLayout 
     { 
      get { return true; } 
     } 

     #endregion // Override implementation of AppenderSkeleton 

     private string m_to; 
     private string m_from; 
     private PatternLayout m_subjectLayout; 
     private string m_smtpHost; 
    } 
} 
+0

отлично! просто то, что я искал. Теперь я могу реализовать свой собственный обработчик smtp так, как я хочу. Спасибо –

34

Существует простой способ

<to value="[email protected],[email protected],[email protected],[email protected]" /> 
+0

Вопрос был: «Я хочу иметь возможность указывать несколько адресов хостов smtp-сервера», а не несколько адресов 'to' – Geoff

+6

Хорошо. Но мой ответ - это мой ответ, полезный для некоторых пользователей :) –

+4

Это может быть не ответ на вопрос О, но это тот ответ, который я искал, когда я приземлился здесь. 18 upvotes vs 4 говорит, что большинство людей здесь были в одной лодке – buddybubble

Смежные вопросы