Author: tn
Date: Sat Sep 14 19:26:28 2013
New Revision: 1523299
URL: http://svn.apache.org/r1523299
Log:
[EMAIL-131] Correctly parse mime multipart emails with content-disposition
headers.
Added:
commons/proper/email/trunk/src/test/resources/eml/html-attachment-content-disposition.eml
commons/proper/email/trunk/src/test/resources/eml/multipart-text-attachment-only.eml
commons/proper/email/trunk/src/test/resources/eml/multipart-text-attachment.eml
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=1523299&r1=1523298&r2=1523299&view=diff
==============================================================================
--- commons/proper/email/trunk/src/changes/changes.xml (original)
+++ commons/proper/email/trunk/src/changes/changes.xml Sat Sep 14 19:26:28 2013
@@ -23,6 +23,11 @@
<body>
<release version="1.3.2" date="TBD">
+ <action dev="tn" type="fix" issue="EMAIL-131" date="2013-09-14"
due-to="Raju Y">
+ The MimeMessageParser will now correctly parse MIME multi-parts of
type "text/plain"
+ and "text/html" with a content disposition header of "attachment". The
parts will
+ be added to the list of attachments even if there is no other text or
html content.
+ </action>
<action dev="tn" type="fix" issue="EMAIL-127" date="2013-07-01"
due-to="Dominik Stadler">
Special characters in the body of an HTML email could lead to an
exception when the
mime message was built.
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=1523299&r1=1523298&r2=1523299&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
Sat Sep 14 19:26:28 2013
@@ -170,13 +170,15 @@ public class MimeMessageParser
protected void parse(Multipart parent, MimePart part)
throws MessagingException, IOException
{
- if (part.isMimeType("text/plain") && (plainContent == null))
+ if (part.isMimeType("text/plain") && (plainContent == null)
+ && (!
MimePart.ATTACHMENT.equalsIgnoreCase(part.getDisposition())))
{
plainContent = (String) part.getContent();
}
else
{
- if (part.isMimeType("text/html") && (htmlContent == null))
+ if (part.isMimeType("text/html") && (htmlContent == null)
+ && (!
MimePart.ATTACHMENT.equalsIgnoreCase(part.getDisposition())))
{
htmlContent = (String) part.getContent();
}
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=1523299&r1=1523298&r2=1523299&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
Sat Sep 14 19:26:28 2013
@@ -218,4 +218,113 @@ public class MimeMessageParserTest
assertEquals(mimeMessageParser.getCc().size(), 0);
assertEquals(mimeMessageParser.getBcc().size(), 0);
}
+
+ /**
+ * This test parses an email which contains a text attachment together
with email text.
+ *
+ * @throws Exception the test failed
+ */
+ @Test
+ public void testMultipartTextAttachment() throws Exception
+ {
+ DataSource dataSource;
+ Session session = Session.getDefaultInstance(new Properties());
+ MimeMessage message = MimeMessageUtils.createMimeMessage(session, new
File("./src/test/resources/eml/multipart-text-attachment.eml"));
+ MimeMessageParser mimeMessageParser = new MimeMessageParser(message);
+
+ mimeMessageParser.parse();
+
+ assertEquals("test", 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("[email protected]", mimeMessageParser.getFrom());
+ assertEquals("[email protected]", mimeMessageParser.getReplyTo());
+ assertTrue(mimeMessageParser.hasAttachments());
+ List<?> attachmentList = mimeMessageParser.getAttachmentList();
+ assertTrue(attachmentList.size() == 1);
+
+ dataSource = mimeMessageParser.findAttachmentByName("test.txt");
+ assertNotNull(dataSource);
+ assertEquals("text/plain", dataSource.getContentType());
+ }
+
+ /**
+ * This test parses an email which only contains a text attachment with
content-disposition: attachment.
+ *
+ * @throws Exception the test failed
+ */
+ @Test
+ public void testMultipartTextAttachmentOnly() throws Exception
+ {
+ DataSource dataSource;
+ Session session = Session.getDefaultInstance(new Properties());
+ MimeMessage message = MimeMessageUtils.createMimeMessage(session, new
File("./src/test/resources/eml/multipart-text-attachment-only.eml"));
+ MimeMessageParser mimeMessageParser = new MimeMessageParser(message);
+
+ mimeMessageParser.parse();
+
+ assertEquals("test", 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("[email protected]", mimeMessageParser.getFrom());
+ assertEquals("[email protected]", mimeMessageParser.getReplyTo());
+ assertTrue(mimeMessageParser.hasAttachments());
+ List<?> attachmentList = mimeMessageParser.getAttachmentList();
+ assertTrue(attachmentList.size() == 1);
+
+ dataSource = mimeMessageParser.findAttachmentByName("test.txt");
+ assertNotNull(dataSource);
+ assertEquals("text/plain", dataSource.getContentType());
+ }
+
+ /**
+ * This test parses an email which contains an html attachment with
content-disposition: attachment.
+ *
+ * @throws Exception the test failed
+ */
+ @Test
+ public void testParseHtmlEmailWithHtmlAttachment() throws Exception
+ {
+ DataSource dataSource;
+ Session session = Session.getDefaultInstance(new Properties());
+ MimeMessage message = MimeMessageUtils.createMimeMessage(session, new
File("./src/test/resources/eml/html-attachment-content-disposition.eml"));
+ MimeMessageParser mimeMessageParser = new MimeMessageParser(message);
+
+ mimeMessageParser.parse();
+
+ assertEquals("test", 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("[email protected]", mimeMessageParser.getFrom());
+ assertEquals("[email protected]", mimeMessageParser.getReplyTo());
+ assertTrue(mimeMessageParser.hasAttachments());
+ List<?> attachmentList = mimeMessageParser.getAttachmentList();
+ assertTrue(attachmentList.size() == 1);
+
+ dataSource = mimeMessageParser.findAttachmentByName("test.html");
+ assertNotNull(dataSource);
+ assertEquals("text/html", dataSource.getContentType());
+ }
+
}
Added:
commons/proper/email/trunk/src/test/resources/eml/html-attachment-content-disposition.eml
URL:
http://svn.apache.org/viewvc/commons/proper/email/trunk/src/test/resources/eml/html-attachment-content-disposition.eml?rev=1523299&view=auto
==============================================================================
---
commons/proper/email/trunk/src/test/resources/eml/html-attachment-content-disposition.eml
(added)
+++
commons/proper/email/trunk/src/test/resources/eml/html-attachment-content-disposition.eml
Sat Sep 14 19:26:28 2013
@@ -0,0 +1,26 @@
+Return-Path: <[email protected]>
+Message-ID: <[email protected]>
+Date: Sat, 14 Sep 2013 21:02:30 +0200
+From: [email protected]
+MIME-Version: 1.0
+To: [email protected]
+Subject: test
+Content-Type: multipart/mixed;
+ boundary="------------060402020304050501030801"
+
+This is a multi-part message in MIME format.
+--------------060402020304050501030801
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 7bit
+
+
+--------------060402020304050501030801
+Content-Type: text/html;
+ name="test.html"
+Content-Transfer-Encoding: 7bit
+Content-Disposition: attachment;
+ filename="test.html"
+
+test
+
+--------------060402020304050501030801--
Added:
commons/proper/email/trunk/src/test/resources/eml/multipart-text-attachment-only.eml
URL:
http://svn.apache.org/viewvc/commons/proper/email/trunk/src/test/resources/eml/multipart-text-attachment-only.eml?rev=1523299&view=auto
==============================================================================
---
commons/proper/email/trunk/src/test/resources/eml/multipart-text-attachment-only.eml
(added)
+++
commons/proper/email/trunk/src/test/resources/eml/multipart-text-attachment-only.eml
Sat Sep 14 19:26:28 2013
@@ -0,0 +1,20 @@
+Return-Path: <[email protected]>
+Message-ID: <[email protected]>
+Date: Fri, 02 Aug 2013 20:53:33 +0200
+From: [email protected]
+MIME-Version: 1.0
+To: [email protected]
+Subject: test
+Content-Type: multipart/mixed;
+ boundary="------------010700020404090103050203"
+
+This is a multi-part message in MIME format.
+--------------010700020404090103050203
+Content-Type: text/plain; charset=UTF-8;
+ name="test.txt"
+Content-Transfer-Encoding: 7bit
+Content-Disposition: attachment;
+
+test
+
+--------------010700020404090103050203--
\ No newline at end of file
Added:
commons/proper/email/trunk/src/test/resources/eml/multipart-text-attachment.eml
URL:
http://svn.apache.org/viewvc/commons/proper/email/trunk/src/test/resources/eml/multipart-text-attachment.eml?rev=1523299&view=auto
==============================================================================
---
commons/proper/email/trunk/src/test/resources/eml/multipart-text-attachment.eml
(added)
+++
commons/proper/email/trunk/src/test/resources/eml/multipart-text-attachment.eml
Sat Sep 14 19:26:28 2013
@@ -0,0 +1,25 @@
+Return-Path: <[email protected]>
+Message-ID: <[email protected]>
+Date: Fri, 02 Aug 2013 20:53:33 +0200
+From: [email protected]
+MIME-Version: 1.0
+To: [email protected]
+Subject: test
+Content-Type: multipart/mixed;
+ boundary="------------010700020404090103050203"
+
+This is a multi-part message in MIME format.
+--------------010700020404090103050203
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 7bit
+
+This is my content
+--------------010700020404090103050203
+Content-Type: text/plain; charset=UTF-8;
+ name="test.txt"
+Content-Transfer-Encoding: 7bit
+Content-Disposition: attachment;
+
+test
+
+--------------010700020404090103050203--
\ No newline at end of file