
Author: ceki Date: Mon Dec 29 15:07:56 2008 New Revision: 2110 Added: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/ContentTypeUtil.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/util/ContentTypeUtilTest.java Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/net/SMTPAppenderBase.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/util/PackageTest.java logback/trunk/logback-site/src/site/pages/manual/appenders.html Log: - add charset encoding support for SMTPAppenderBase. This fixes LBCORE-69. Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/net/SMTPAppenderBase.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/net/SMTPAppenderBase.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/net/SMTPAppenderBase.java Mon Dec 29 15:07:56 2008 @@ -30,8 +30,12 @@ import ch.qos.logback.core.Layout; import ch.qos.logback.core.boolex.EvaluationException; import ch.qos.logback.core.boolex.EventEvaluator; +import ch.qos.logback.core.util.ContentTypeUtil; import ch.qos.logback.core.util.OptionHelper; +// Contributors: +// Andrey Rybin charset encoding support http://jira.qos.ch/browse/LBCORE-69 + /** * An abstract class that provides support for sending events to an email * address. @@ -41,7 +45,6 @@ * * @author Ceki Gülcü * @author Sébastien Pennec - * */ public abstract class SMTPAppenderBase<E> extends AppenderBase<E> { @@ -59,7 +62,9 @@ String username; String password; - protected Message msg; + private String charsetEncoding = "UTF-8"; + + protected MimeMessage mimeMsg; protected EventEvaluator<E> eventEvaluator; @@ -109,16 +114,16 @@ // props.put("mail.debug", "true"); Session session = Session.getInstance(props, loginAuthenticator); - msg = new MimeMessage(session); + mimeMsg = new MimeMessage(session); try { if (from != null) { - msg.setFrom(getAddress(from)); + mimeMsg.setFrom(getAddress(from)); } else { - msg.setFrom(); + mimeMsg.setFrom(); } - msg.setRecipients(Message.RecipientType.TO, parseAddress(to)); + mimeMsg.setRecipients(Message.RecipientType.TO, parseAddress(to)); subjectLayout = makeSubjectLayout(subjectStr); @@ -166,7 +171,7 @@ return false; } - if (this.msg == null) { + if (this.mimeMsg == null) { addError("Message object not configured."); return false; } @@ -254,17 +259,25 @@ } if (subjectLayout != null) { - msg.setSubject(subjectLayout.doLayout(lastEventObject)); + mimeMsg.setSubject(subjectLayout.doLayout(lastEventObject), + charsetEncoding); } - part.setContent(sbuf.toString(), layout.getContentType()); + String contentType = layout.getContentType(); + + if (ContentTypeUtil.isTextual(contentType)) { + part.setText(sbuf.toString(), charsetEncoding, ContentTypeUtil + .getSubType(contentType)); + } else { + part.setContent(sbuf.toString(), layout.getContentType()); + } Multipart mp = new MimeMultipart(); mp.addBodyPart(part); - msg.setContent(mp); + mimeMsg.setContent(mp); - msg.setSentDate(new Date()); - Transport.send(msg); + mimeMsg.setSentDate(new Date()); + Transport.send(mimeMsg); } catch (Exception e) { addError("Error occured while sending e-mail notification.", e); } @@ -344,12 +357,12 @@ // for testing purpose only public Message getMessage() { - return msg; + return mimeMsg; } // for testing purpose only - public void setMessage(Message msg) { - this.msg = msg; + public void setMessage(MimeMessage msg) { + this.mimeMsg = msg; } public boolean isSTARTTLS() { @@ -402,4 +415,22 @@ this.password = password; } + /** + * @see #setCharsetEncoding(String) + * @return the charset encoding value + */ + String getCharsetEncoding() { + return charsetEncoding; + } + + /** + * Set the character set encoding of the outgoing email messages. The default + * encoding is "UTF-8" which usually works well for most purposes. + * + * @param charsetEncoding + */ + void setCharsetEncoding(String charsetEncoding) { + this.charsetEncoding = charsetEncoding; + } + } Added: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/ContentTypeUtil.java ============================================================================== --- (empty file) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/ContentTypeUtil.java Mon Dec 29 15:07:56 2008 @@ -0,0 +1,43 @@ +/** + * Logback: the generic, reliable, fast and flexible logging framework. + * + * Copyright (C) 2000-2008, QOS.ch + * + * This library is free software, you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation. + */ +package ch.qos.logback.core.util; + +/** + * Various utility methods for processing strings representing context types. + * + * @author Ceki Gulcu + * + */ +public class ContentTypeUtil { + + public static boolean isTextual(String contextType) { + if (contextType == null) { + return false; + } + return contextType.startsWith("text"); + } + + public static String getSubType(String contextType) { + if (contextType == null) { + return null; + } + int index = contextType.indexOf('/'); + if (index == -1) { + return null; + } else { + int subTypeStartIndex = index + 1; + if (subTypeStartIndex < contextType.length()) { + return contextType.substring(subTypeStartIndex); + } else { + return null; + } + } + } +} Added: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/util/ContentTypeUtilTest.java ============================================================================== --- (empty file) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/util/ContentTypeUtilTest.java Mon Dec 29 15:07:56 2008 @@ -0,0 +1,40 @@ +/** + * Logback: the generic, reliable, fast and flexible logging framework. + * + * Copyright (C) 2000-2008, QOS.ch + * + * This library is free software, you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation. + */ +package ch.qos.logback.core.util; + +import static org.junit.Assert.*; + +import org.junit.Test; + + +public class ContentTypeUtilTest { + + + @Test + public void smoke() { + String contextType = "text/html"; + assertTrue(ContentTypeUtil.isTextual(contextType)); + assertEquals("html", ContentTypeUtil.getSubType(contextType)); + } + + @Test + public void nullContext() { + String contextType = null; + assertFalse(ContentTypeUtil.isTextual(contextType)); + assertNull(ContentTypeUtil.getSubType(contextType)); + } + + @Test + public void emptySubtype() { + String contextType = "text/"; + assertTrue(ContentTypeUtil.isTextual(contextType)); + assertNull(ContentTypeUtil.getSubType(contextType)); + } +} Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/util/PackageTest.java ============================================================================== --- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/util/PackageTest.java (original) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/util/PackageTest.java Mon Dec 29 15:07:56 2008 @@ -20,6 +20,7 @@ FileUtilTest.class, OptionHelperTest.class, StatusPrinterTest.class, - TimeUtilTest.class}) + TimeUtilTest.class, + ContentTypeUtilTest.class}) public class PackageTest { } Modified: logback/trunk/logback-site/src/site/pages/manual/appenders.html ============================================================================== --- logback/trunk/logback-site/src/site/pages/manual/appenders.html (original) +++ logback/trunk/logback-site/src/site/pages/manual/appenders.html Mon Dec 29 15:07:56 2008 @@ -1994,6 +1994,7 @@ <th>Type</th> <th>Description</th> </tr> + <tr> <td><b><span class="option">SMTPHost</span></b></td> <td><code>String</code></td> @@ -2124,6 +2125,18 @@ </td> </tr> + <tr class="alt"> + <td><b><span class="option">CharsetEncoding</span></b></td> + <td><code>String</code></td> + <td>The outgoing email message will be encoded in the + designated <a + href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html">charset</a>. The + default charset encoding is "UTF-8" which works well for most + purposes. + </td> + </tr> + + </table> <p>The SMTPAppender keeps only the last <span