You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by ca...@apache.org on 2008/10/16 06:53:52 UTC

svn commit: r705140 - in /logging/log4j/trunk/src: changes/changes.xml main/java/org/apache/log4j/net/SMTPAppender.java

Author: carnold
Date: Wed Oct 15 21:53:51 2008
New Revision: 705140

URL: http://svn.apache.org/viewvc?rev=705140&view=rev
Log:
Bug 44644: SMTPAppender does not properly encode subject or content with non-ASCII chars

Modified:
    logging/log4j/trunk/src/changes/changes.xml
    logging/log4j/trunk/src/main/java/org/apache/log4j/net/SMTPAppender.java

Modified: logging/log4j/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/logging/log4j/trunk/src/changes/changes.xml?rev=705140&r1=705139&r2=705140&view=diff
==============================================================================
--- logging/log4j/trunk/src/changes/changes.xml (original)
+++ logging/log4j/trunk/src/changes/changes.xml Wed Oct 15 21:53:51 2008
@@ -67,6 +67,7 @@
        <action action="add" issue="45980">SMTPAppender should have a sendOnClose option</action>
        <action action="fix" issue="45982">Support %X layout specification to output all MDC key-value pairs</action>
        <action action="add" issue="45990">Add replyTo attribute to SMTPAppender</action>
+       <action action="fix" issue="44644">SMTPAppender does not properly encode subject or content containing non-ASCII characters.</action>
     </release>
 
   

Modified: logging/log4j/trunk/src/main/java/org/apache/log4j/net/SMTPAppender.java
URL: http://svn.apache.org/viewvc/logging/log4j/trunk/src/main/java/org/apache/log4j/net/SMTPAppender.java?rev=705140&r1=705139&r2=705140&view=diff
==============================================================================
--- logging/log4j/trunk/src/main/java/org/apache/log4j/net/SMTPAppender.java (original)
+++ logging/log4j/trunk/src/main/java/org/apache/log4j/net/SMTPAppender.java Wed Oct 15 21:53:51 2008
@@ -18,33 +18,38 @@
 package org.apache.log4j.net;
 
 import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.Level;
 import org.apache.log4j.Layout;
-import org.apache.log4j.xml.UnrecognizedElementHandler;
+import org.apache.log4j.Level;
 import org.apache.log4j.helpers.CyclicBuffer;
-import org.apache.log4j.helpers.OptionConverter;
 import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.spi.LoggingEvent;
+import org.apache.log4j.helpers.OptionConverter;
 import org.apache.log4j.spi.ErrorCode;
-import org.apache.log4j.spi.TriggeringEventEvaluator;
+import org.apache.log4j.spi.LoggingEvent;
 import org.apache.log4j.spi.OptionHandler;
+import org.apache.log4j.spi.TriggeringEventEvaluator;
+import org.apache.log4j.xml.UnrecognizedElementHandler;
 import org.w3c.dom.Element;
 
-import java.util.Properties;
-import java.util.Date;
-
-import javax.mail.Session;
 import javax.mail.Authenticator;
-import javax.mail.PasswordAuthentication;
-import javax.mail.Transport;
 import javax.mail.Message;
 import javax.mail.MessagingException;
-import javax.mail.internet.MimeMessage;
 import javax.mail.Multipart;
-import javax.mail.internet.MimeMultipart;
-import javax.mail.internet.MimeBodyPart;
-import javax.mail.internet.InternetAddress;
+import javax.mail.PasswordAuthentication;
+import javax.mail.Session;
+import javax.mail.Transport;
 import javax.mail.internet.AddressException;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.InternetHeaders;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+import javax.mail.internet.MimeUtility;
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.util.Date;
+import java.util.Properties;
 
 /**
    Send an e-mail when a specific logging event occurs, typically on
@@ -135,8 +140,12 @@
      try {
         addressMessage(msg);
         if(subject != null) {
-	       msg.setSubject(subject);
-	    }
+           try {
+                msg.setSubject(MimeUtility.encodeText(subject, "UTF-8", null));
+           } catch(UnsupportedEncodingException ex) {
+                LogLog.error("Unable to encode SMTP subject", ex);
+           }
+        }
      } catch(MessagingException e) {
        LogLog.error("Could not activate SMTPAppender options.", e );
      }
@@ -331,8 +340,6 @@
     // Note: this code already owns the monitor for this
     // appender. This frees us from needing to synchronize on 'cb'.
     try {
-      MimeBodyPart part = new MimeBodyPart();
-
       StringBuffer sbuf = new StringBuffer();
       String t = layout.getHeader();
       if(t != null)
@@ -356,8 +363,39 @@
       if(t != null) {
 	    sbuf.append(t);
       }
-      
-      part.setContent(sbuf.toString(), layout.getContentType());
+
+      String s = sbuf.toString();
+      boolean allAscii = true;
+      for(int i = 0; i < s.length() && allAscii; i++) {
+          allAscii = s.charAt(i) <= 0x7F;
+      }
+      MimeBodyPart part;
+      if (allAscii) {
+          part = new MimeBodyPart();
+          part.setContent(s, layout.getContentType());
+      } else {
+          try {
+            ByteArrayOutputStream os = new ByteArrayOutputStream();
+            Writer writer = new OutputStreamWriter(
+                    MimeUtility.encode(os, "quoted-printable"), "UTF-8");
+            writer.write(s);
+            writer.close();
+            InternetHeaders headers = new InternetHeaders();
+            headers.setHeader("Content-Type", layout.getContentType() + "; charset=UTF-8");
+            headers.setHeader("Content-Transfer-Encoding", "quoted-printable");
+            part = new MimeBodyPart(headers, os.toByteArray());
+          } catch(Exception ex) {
+              for (int i = 0; i < sbuf.length(); i++) {
+                  if (sbuf.charAt(i) >= 0x80) {
+                      sbuf.setCharAt(i, '?');
+                  }
+              }
+              part = new MimeBodyPart();
+              part.setContent(sbuf.toString(), layout.getContentType());
+          }
+      }
+
+
 
       Multipart mp = new MimeMultipart();
       mp.addBodyPart(part);



---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org