You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by tn...@apache.org on 2014/04/30 00:31:39 UTC
svn commit: r1591128 - in /commons/proper/email/trunk/src:
changes/changes.xml
main/java/org/apache/commons/mail/util/MimeMessageParser.java
test/java/org/apache/commons/mail/util/MimeMessageParserTest.java
Author: tn
Date: Tue Apr 29 22:31:39 2014
New Revision: 1591128
URL: http://svn.apache.org/r1591128
Log:
[EMAIL-137] Fix MimeMessageParser to correctly parse MimeMessages created by calling HtmlEmail.getMimeMessage(). Thanks to Alex Kogan.
Modified:
commons/proper/email/trunk/src/changes/changes.xml
commons/proper/email/trunk/src/main/java/org/apache/commons/mail/util/MimeMessageParser.java
commons/proper/email/trunk/src/test/java/org/apache/commons/mail/util/MimeMessageParserTest.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=1591128&r1=1591127&r2=1591128&view=diff
==============================================================================
--- commons/proper/email/trunk/src/changes/changes.xml (original)
+++ commons/proper/email/trunk/src/changes/changes.xml Tue Apr 29 22:31:39 2014
@@ -23,6 +23,10 @@
<body>
<release version="1.3.3" date="xxx">
+ <action dev="tn" type="fix" issue="EMAIL-137" date="2014-04-30" due-to="Alex Kogan">
+ MimeMessageParser did not correctly parse MimeMessage objects created by
+ calling HtmlEmail.buildMimeMessage() and HtmlEmail.getMimeMessage().
+ </action>
<action dev="ggregory" type="fix" issue="EMAIL-136" date="2014-02-01" due-to="Ville Skyttä">
Fix Javadoc 1.8 errors.
</action>
Modified: commons/proper/email/trunk/src/main/java/org/apache/commons/mail/util/MimeMessageParser.java
URL: http://svn.apache.org/viewvc/commons/proper/email/trunk/src/main/java/org/apache/commons/mail/util/MimeMessageParser.java?rev=1591128&r1=1591127&r2=1591128&view=diff
==============================================================================
--- commons/proper/email/trunk/src/main/java/org/apache/commons/mail/util/MimeMessageParser.java (original)
+++ commons/proper/email/trunk/src/main/java/org/apache/commons/mail/util/MimeMessageParser.java Tue Apr 29 22:31:39 2014
@@ -16,27 +16,30 @@
*/
package org.apache.commons.mail.util;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
+import javax.mail.internet.ContentType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimePart;
import javax.mail.internet.MimeUtility;
+import javax.mail.internet.ParseException;
import javax.mail.util.ByteArrayDataSource;
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
/**
* Parses a MimeMessage and stores the individual parts such a plain text,
@@ -170,21 +173,21 @@ public class MimeMessageParser
protected void parse(Multipart parent, MimePart part)
throws MessagingException, IOException
{
- if (part.isMimeType("text/plain") && (plainContent == null)
+ if (isMimeType(part, "text/plain") && (plainContent == null)
&& (!MimePart.ATTACHMENT.equalsIgnoreCase(part.getDisposition())))
{
plainContent = (String) part.getContent();
}
else
{
- if (part.isMimeType("text/html") && (htmlContent == null)
+ if (isMimeType(part, "text/html") && (htmlContent == null)
&& (!MimePart.ATTACHMENT.equalsIgnoreCase(part.getDisposition())))
{
htmlContent = (String) part.getContent();
}
else
{
- if (part.isMimeType("multipart/*"))
+ if (isMimeType(part, "multipart/*"))
{
this.isMultiPart = true;
Multipart mp = (Multipart) part.getContent();
@@ -206,6 +209,32 @@ public class MimeMessageParser
}
/**
+ * Checks whether the MimePart contains an object of the given mime type.
+ *
+ * @param part the current MimePart
+ * @param mimeType the mime type to check
+ * @return {@code true} if the MimePart matches the given mime type, {@code false} otherwise
+ * @throws MessagingException parsing the MimeMessage failed
+ * @throws IOException parsing the MimeMessage failed
+ */
+ private boolean isMimeType(MimePart part, String mimeType)
+ throws MessagingException, IOException
+ {
+ // Do not use part.isMimeType(String) as it is broken for MimeBodyPart
+ // and does not really check the actual content type.
+
+ try
+ {
+ ContentType ct = new ContentType(part.getDataHandler().getContentType());
+ return ct.match(mimeType);
+ }
+ catch (ParseException ex)
+ {
+ return part.getContentType().equalsIgnoreCase(mimeType);
+ }
+ }
+
+ /**
* Parses the MimePart to create a DataSource.
*
* @param parent the parent multi-part
Modified: commons/proper/email/trunk/src/test/java/org/apache/commons/mail/util/MimeMessageParserTest.java
URL: http://svn.apache.org/viewvc/commons/proper/email/trunk/src/test/java/org/apache/commons/mail/util/MimeMessageParserTest.java?rev=1591128&r1=1591127&r2=1591128&view=diff
==============================================================================
--- commons/proper/email/trunk/src/test/java/org/apache/commons/mail/util/MimeMessageParserTest.java (original)
+++ commons/proper/email/trunk/src/test/java/org/apache/commons/mail/util/MimeMessageParserTest.java Tue Apr 29 22:31:39 2014
@@ -16,18 +16,23 @@
*/
package org.apache.commons.mail.util;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.util.List;
+import java.util.Properties;
import javax.activation.DataSource;
import javax.mail.Session;
import javax.mail.internet.MimeMessage;
+import org.apache.commons.mail.HtmlEmail;
import org.junit.Test;
-import java.io.File;
-import java.util.List;
-import java.util.Properties;
-
/**
* Testing the MimeMessageParser.
*/
@@ -92,7 +97,7 @@ public class MimeMessageParserTest
mimeMessageParser.parse();
assertEquals("Test", mimeMessageParser.getSubject());
- assertNotNull(mimeMessageParser.getMimeMessage());
+ assertNotNull(mimeMessageParser.getMimeMessage());
assertTrue(mimeMessageParser.isMultipart());
assertTrue(mimeMessageParser.hasHtmlContent());
assertTrue(mimeMessageParser.hasPlainContent());
@@ -307,7 +312,7 @@ public class MimeMessageParserTest
mimeMessageParser.parse();
assertEquals("test", mimeMessageParser.getSubject());
- assertNotNull(mimeMessageParser.getMimeMessage());
+ assertNotNull(mimeMessageParser.getMimeMessage());
assertTrue(mimeMessageParser.isMultipart());
assertFalse(mimeMessageParser.hasHtmlContent());
assertTrue(mimeMessageParser.hasPlainContent());
@@ -327,4 +332,108 @@ public class MimeMessageParserTest
assertEquals("text/html", dataSource.getContentType());
}
+ @Test
+ public void testParseCreatedHtmlEmailWithNoContent() throws Exception
+ {
+ Session session = Session.getDefaultInstance(new Properties());
+
+ HtmlEmail email = new HtmlEmail();
+
+ email.setMailSession(session);
+
+ email.setFrom("test_from@apache.org");
+ email.setSubject("Test Subject");
+ email.addTo("test_to@apache.org");
+
+ email.buildMimeMessage();
+ MimeMessage msg = email.getMimeMessage();
+
+ MimeMessageParser mimeMessageParser = new MimeMessageParser(msg);
+ mimeMessageParser.parse();
+
+ assertEquals("Test Subject", mimeMessageParser.getSubject());
+ assertNotNull(mimeMessageParser.getMimeMessage());
+ assertTrue(mimeMessageParser.isMultipart());
+ assertFalse(mimeMessageParser.hasHtmlContent());
+ assertFalse(mimeMessageParser.hasPlainContent());
+ assertNull(mimeMessageParser.getPlainContent());
+ assertNull(mimeMessageParser.getHtmlContent());
+ assertTrue(mimeMessageParser.getTo().size() == 1);
+ assertTrue(mimeMessageParser.getCc().size() == 0);
+ assertTrue(mimeMessageParser.getBcc().size() == 0);
+ assertEquals("test_from@apache.org", mimeMessageParser.getFrom());
+ assertEquals("test_from@apache.org", mimeMessageParser.getReplyTo());
+ assertFalse(mimeMessageParser.hasAttachments());
+ }
+
+ @Test
+ public void testParseCreatedHtmlEmailWithTextContent() throws Exception
+ {
+ Session session = Session.getDefaultInstance(new Properties());
+
+ HtmlEmail email = new HtmlEmail();
+
+ email.setMailSession(session);
+
+ email.setFrom("test_from@apache.org");
+ email.setSubject("Test Subject");
+ email.addTo("test_to@apache.org");
+ email.setTextMsg("My test message");
+
+ email.buildMimeMessage();
+ MimeMessage msg = email.getMimeMessage();
+
+ MimeMessageParser mimeMessageParser = new MimeMessageParser(msg);
+ mimeMessageParser.parse();
+
+ assertEquals("Test Subject", mimeMessageParser.getSubject());
+ assertNotNull(mimeMessageParser.getMimeMessage());
+ assertTrue(mimeMessageParser.isMultipart());
+ assertFalse(mimeMessageParser.hasHtmlContent());
+ assertTrue(mimeMessageParser.hasPlainContent());
+ assertNotNull(mimeMessageParser.getPlainContent());
+ assertNull(mimeMessageParser.getHtmlContent());
+ assertTrue(mimeMessageParser.getTo().size() == 1);
+ assertTrue(mimeMessageParser.getCc().size() == 0);
+ assertTrue(mimeMessageParser.getBcc().size() == 0);
+ assertEquals("test_from@apache.org", mimeMessageParser.getFrom());
+ assertEquals("test_from@apache.org", mimeMessageParser.getReplyTo());
+ assertFalse(mimeMessageParser.hasAttachments());
+ }
+
+ @Test
+ public void testParseCreatedHtmlEmailWithMixedContent() throws Exception
+ {
+ Session session = Session.getDefaultInstance(new Properties());
+
+ HtmlEmail email = new HtmlEmail();
+
+ email.setMailSession(session);
+
+ email.setFrom("test_from@apache.org");
+ email.setSubject("Test Subject");
+ email.addTo("test_to@apache.org");
+ email.setTextMsg("My test message");
+ email.setHtmlMsg("<p>My HTML message</p>");
+
+ email.buildMimeMessage();
+ MimeMessage msg = email.getMimeMessage();
+
+ MimeMessageParser mimeMessageParser = new MimeMessageParser(msg);
+ mimeMessageParser.parse();
+
+ assertEquals("Test Subject", mimeMessageParser.getSubject());
+ assertNotNull(mimeMessageParser.getMimeMessage());
+ assertTrue(mimeMessageParser.isMultipart());
+ assertTrue(mimeMessageParser.hasHtmlContent());
+ assertTrue(mimeMessageParser.hasPlainContent());
+ assertNotNull(mimeMessageParser.getPlainContent());
+ assertNotNull(mimeMessageParser.getHtmlContent());
+ assertTrue(mimeMessageParser.getTo().size() == 1);
+ assertTrue(mimeMessageParser.getCc().size() == 0);
+ assertTrue(mimeMessageParser.getBcc().size() == 0);
+ assertEquals("test_from@apache.org", mimeMessageParser.getFrom());
+ assertEquals("test_from@apache.org", mimeMessageParser.getReplyTo());
+ assertFalse(mimeMessageParser.hasAttachments());
+ }
}