Author: tn Date: Tue Oct 15 21:13:11 2013 New Revision: 1532531 URL: http://svn.apache.org/r1532531 Log: [EMAIL-104] Add support for default mime charset when added text content to SimpleEmail or HtmlEmail.
Modified: commons/proper/email/trunk/src/changes/changes.xml commons/proper/email/trunk/src/main/java/org/apache/commons/mail/Email.java commons/proper/email/trunk/src/main/java/org/apache/commons/mail/EmailConstants.java commons/proper/email/trunk/src/main/java/org/apache/commons/mail/HtmlEmail.java commons/proper/email/trunk/src/test/java/org/apache/commons/mail/HtmlEmailTest.java commons/proper/email/trunk/src/test/java/org/apache/commons/mail/SimpleEmailTest.java Modified: commons/proper/email/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/email/trunk/src/changes/changes.xml?rev=1532531&r1=1532530&r2=1532531&view=diff ============================================================================== --- commons/proper/email/trunk/src/changes/changes.xml (original) +++ commons/proper/email/trunk/src/changes/changes.xml Tue Oct 15 21:13:11 2013 @@ -23,6 +23,10 @@ <body> <release version="1.3.2" date="TBD"> + <action dev="tn" type="fix" issue="EMAIL-104" date="2013-10-15" due-to="Hiroshi Ikeda"> + Support default mime charset property "mail.mime.charset" when adding text content + to instances of either SimpleEmail or HtmlEmail. + </action> <action dev="tn" type="add" issue="EMAIL-132" date="2013-10-10" due-to="Allen Xudong Cheng"> Added support for sending partial emails in case of invalid addresses. </action> Modified: commons/proper/email/trunk/src/main/java/org/apache/commons/mail/Email.java URL: http://svn.apache.org/viewvc/commons/proper/email/trunk/src/main/java/org/apache/commons/mail/Email.java?rev=1532531&r1=1532530&r2=1532531&view=diff ============================================================================== --- commons/proper/email/trunk/src/main/java/org/apache/commons/mail/Email.java (original) +++ commons/proper/email/trunk/src/main/java/org/apache/commons/mail/Email.java Tue Oct 15 21:13:11 2013 @@ -1284,7 +1284,17 @@ public abstract class Email if (this.content != null) { - this.message.setContent(this.content, this.contentType); + if (EmailConstants.TEXT_PLAIN.equalsIgnoreCase(this.contentType) + && this.content instanceof String) + { + // EMAIL-104: call explicitly setText to use default mime charset + // (property "mail.mime.charset") in case none has been set + this.message.setText(this.content.toString(), this.charset); + } + else + { + this.message.setContent(this.content, this.contentType); + } } else if (this.emailBody != null) { @@ -1299,7 +1309,7 @@ public abstract class Email } else { - this.message.setContent("", Email.TEXT_PLAIN); + this.message.setText(""); } if (this.fromAddress != null) Modified: commons/proper/email/trunk/src/main/java/org/apache/commons/mail/EmailConstants.java URL: http://svn.apache.org/viewvc/commons/proper/email/trunk/src/main/java/org/apache/commons/mail/EmailConstants.java?rev=1532531&r1=1532530&r2=1532531&view=diff ============================================================================== --- commons/proper/email/trunk/src/main/java/org/apache/commons/mail/EmailConstants.java (original) +++ commons/proper/email/trunk/src/main/java/org/apache/commons/mail/EmailConstants.java Tue Oct 15 21:13:11 2013 @@ -107,6 +107,9 @@ public final class EmailConstants /** defines the text/html content type */ public static final String TEXT_HTML = "text/html"; + /** defines the html subtype */ + public static final String TEXT_SUBTYPE_HTML = "html"; + /** defines the text/plain content type */ public static final String TEXT_PLAIN = "text/plain"; @@ -221,6 +224,12 @@ public final class EmailConstants */ public static final String MAIL_SMTPS_SEND_PARTIAL = "mail.smtps.sendpartial"; + /** + * Defines the default mime charset to use when none has been specified for the message. + * @since 1.3.2 + */ + public static final String MAIL_MIME_CHARSET = "mail.mime.charset"; + /** Hide constructor. */ private EmailConstants() { Modified: commons/proper/email/trunk/src/main/java/org/apache/commons/mail/HtmlEmail.java URL: http://svn.apache.org/viewvc/commons/proper/email/trunk/src/main/java/org/apache/commons/mail/HtmlEmail.java?rev=1532531&r1=1532530&r2=1532531&view=diff ============================================================================== --- commons/proper/email/trunk/src/main/java/org/apache/commons/mail/HtmlEmail.java (original) +++ commons/proper/email/trunk/src/main/java/org/apache/commons/mail/HtmlEmail.java Tue Oct 15 21:13:11 2013 @@ -534,8 +534,8 @@ public class HtmlEmail extends MultiPart MimeMultipart rootContainer = this.getContainer(); MimeMultipart bodyEmbedsContainer = rootContainer; MimeMultipart bodyContainer = rootContainer; - BodyPart msgHtml = null; - BodyPart msgText = null; + MimeBodyPart msgHtml = null; + MimeBodyPart msgText = null; rootContainer.setSubType("mixed"); @@ -576,17 +576,9 @@ public class HtmlEmail extends MultiPart msgHtml = new MimeBodyPart(); bodyContainer.addBodyPart(msgHtml, 0); - // apply default charset if one has been set - if (EmailUtils.isNotEmpty(this.charset)) - { - msgHtml.setContent( - this.html, - EmailConstants.TEXT_HTML + "; charset=" + this.charset); - } - else - { - msgHtml.setContent(this.html, EmailConstants.TEXT_HTML); - } + // EMAIL-104: call explicitly setText to use default mime charset + // (property "mail.mime.charset") in case none has been set + msgHtml.setText(this.html, this.charset, EmailConstants.TEXT_SUBTYPE_HTML); for (InlineImage image : this.inlineEmbeds.values()) { @@ -599,17 +591,9 @@ public class HtmlEmail extends MultiPart msgText = new MimeBodyPart(); bodyContainer.addBodyPart(msgText, 0); - // apply default charset if one has been set - if (EmailUtils.isNotEmpty(this.charset)) - { - msgText.setContent( - this.text, - EmailConstants.TEXT_PLAIN + "; charset=" + this.charset); - } - else - { - msgText.setContent(this.text, EmailConstants.TEXT_PLAIN); - } + // EMAIL-104: call explicitly setText to use default mime charset + // (property "mail.mime.charset") in case none has been set + msgText.setText(this.text, this.charset); } } Modified: commons/proper/email/trunk/src/test/java/org/apache/commons/mail/HtmlEmailTest.java URL: http://svn.apache.org/viewvc/commons/proper/email/trunk/src/test/java/org/apache/commons/mail/HtmlEmailTest.java?rev=1532531&r1=1532530&r2=1532531&view=diff ============================================================================== --- commons/proper/email/trunk/src/test/java/org/apache/commons/mail/HtmlEmailTest.java (original) +++ commons/proper/email/trunk/src/test/java/org/apache/commons/mail/HtmlEmailTest.java Tue Oct 15 21:13:11 2013 @@ -21,7 +21,9 @@ import static org.junit.Assert.*; import java.io.File; import java.io.IOException; import java.net.URL; +import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.activation.DataSource; import javax.activation.FileDataSource; @@ -30,7 +32,6 @@ import javax.mail.internet.MimeMessage; import org.apache.commons.mail.mocks.MockHtmlEmailConcrete; import org.apache.commons.mail.settings.EmailConfiguration; import org.apache.commons.mail.util.MimeMessageParser; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -497,6 +498,51 @@ public class HtmlEmailTest extends Abstr } + @Test + public void testSendWithDefaultCharset() throws Exception + { + // ==================================================================== + // Test Success + // ==================================================================== + + System.setProperty(EmailConstants.MAIL_MIME_CHARSET, "iso-8859-15"); + + this.getMailServer(); + + this.email = new MockHtmlEmailConcrete(); + this.email.setHostName(this.strTestMailServer); + this.email.setSmtpPort(this.getMailServerPort()); + this.email.setFrom(this.strTestMailFrom); + this.email.addTo(this.strTestMailTo); + + if (this.strTestUser != null && this.strTestPasswd != null) + { + this.email.setAuthentication( + this.strTestUser, + this.strTestPasswd); + } + + String strSubject = "Test HTML Send Subject (w default charset)"; + this.email.setSubject(strSubject); + this.email.setMsg("Test txt msg ä"); // add non-ascii character, otherwise us-ascii will be used + + this.email.send(); + this.fakeMailServer.stop(); + // validate charset + validateSend( + this.fakeMailServer, + strSubject, + "charset=iso-8859-15", + this.email.getFromAddress(), + this.email.getToAddresses(), + this.email.getCcAddresses(), + this.email.getBccAddresses(), + true); + + System.clearProperty(EmailConstants.MAIL_MIME_CHARSET); + + } + /** * Create a HTML email containing an URL pointing to a ZIP file * to be downloaded. According to EMAIL-93 the resulting URL Modified: commons/proper/email/trunk/src/test/java/org/apache/commons/mail/SimpleEmailTest.java URL: http://svn.apache.org/viewvc/commons/proper/email/trunk/src/test/java/org/apache/commons/mail/SimpleEmailTest.java?rev=1532531&r1=1532530&r2=1532531&view=diff ============================================================================== --- commons/proper/email/trunk/src/test/java/org/apache/commons/mail/SimpleEmailTest.java (original) +++ commons/proper/email/trunk/src/test/java/org/apache/commons/mail/SimpleEmailTest.java Tue Oct 15 21:13:11 2013 @@ -119,4 +119,49 @@ public class SimpleEmailTest extends Abs this.email.getBccAddresses(), true); } + + @Test + public void testDefaultMimeCharset() throws EmailException, IOException + { + System.setProperty(EmailConstants.MAIL_MIME_CHARSET, "utf-8"); + + // ==================================================================== + // Test Success + // ==================================================================== + this.getMailServer(); + + this.email = new MockSimpleEmail(); + this.email.setHostName(this.strTestMailServer); + this.email.setSmtpPort(this.getMailServerPort()); + this.email.setFrom(this.strTestMailFrom); + this.email.addTo(this.strTestMailTo); + + if (this.strTestUser != null && this.strTestPasswd != null) + { + this.email.setAuthentication( + this.strTestUser, + this.strTestPasswd); + } + + String strSubject = "Test Msg Subject"; + String strMessage = "Test Msg Body ã° ã± ã² ã³ ã´"; + + this.email.setSubject(strSubject); + this.email.setMsg(strMessage); + + this.email.send(); + + this.fakeMailServer.stop(); + validateSend( + this.fakeMailServer, + strSubject, + this.email.getMsg(), + this.email.getFromAddress(), + this.email.getToAddresses(), + this.email.getCcAddresses(), + this.email.getBccAddresses(), + true); + + System.clearProperty(EmailConstants.MAIL_MIME_CHARSET); + } }