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());
+    }
 }