blob: 12ea7ebfdd17c3330e498fabb1181f151d83ab53 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.mail.util;
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;
/**
* Testing the MimeMessageParser.
*/
public class MimeMessageParserTest
{
@Test
public void testParseSimpleEmail() throws Exception
{
final Session session = Session.getDefaultInstance(new Properties());
final MimeMessage message = MimeMessageUtils.createMimeMessage(session, new File("./src/test/resources/eml/simple.eml"));
final MimeMessageParser mimeMessageParser = new MimeMessageParser(message);
mimeMessageParser.parse();
assertEquals("Test HTML Send #1 Subject (wo charset)", 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 testParseSimpleReplyEmail() throws Exception
{
final Session session = Session.getDefaultInstance(new Properties());
final MimeMessage message = MimeMessageUtils.createMimeMessage(session, new File("./src/test/resources/eml/simple-reply.eml"));
final MimeMessageParser mimeMessageParser = new MimeMessageParser(message);
mimeMessageParser.parse();
assertEquals("Re: java.lang.NoClassDefFoundError: org/bouncycastle/asn1/pkcs/PrivateKeyInfo", mimeMessageParser.getSubject());
assertNotNull(mimeMessageParser.getMimeMessage());
assertFalse(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("coheigea@apache.org", mimeMessageParser.getFrom());
assertEquals("dev@ws.apache.org", mimeMessageParser.getReplyTo());
assertFalse(mimeMessageParser.hasAttachments());
}
@Test
public void testParseHtmlEmailWithAttachments() throws Exception
{
DataSource dataSource;
final Session session = Session.getDefaultInstance(new Properties());
final MimeMessage message = MimeMessageUtils.createMimeMessage(session, new File("./src/test/resources/eml/html-attachment.eml"));
final MimeMessageParser mimeMessageParser = new MimeMessageParser(message);
mimeMessageParser.parse();
assertEquals("Test", 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("siegfried.goeschl@it20one.at", mimeMessageParser.getFrom());
assertEquals("siegfried.goeschl@it20one.at", mimeMessageParser.getReplyTo());
assertTrue(mimeMessageParser.hasAttachments());
final List<?> attachmentList = mimeMessageParser.getAttachmentList();
assertTrue(attachmentList.size() == 2);
dataSource = mimeMessageParser.findAttachmentByName("Wasserlilien.jpg");
assertNotNull(dataSource);
assertEquals("image/jpeg", dataSource.getContentType());
dataSource = mimeMessageParser.findAttachmentByName("it20one.pdf");
assertNotNull(dataSource);
assertEquals("application/pdf", dataSource.getContentType());
}
@Test
public void testParseHtmlEmailWithAttachmentAndEncodedFilename() throws Exception
{
DataSource dataSource;
final Session session = Session.getDefaultInstance(new Properties());
final MimeMessage message = MimeMessageUtils.createMimeMessage(session, new File("./src/test/resources/eml/html-attachment-encoded-filename.eml"));
final MimeMessageParser mimeMessageParser = new MimeMessageParser(message);
mimeMessageParser.parse();
assertEquals("Test HTML Send #1 Subject (w charset)", 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());
assertTrue(mimeMessageParser.hasAttachments());
final List<?> attachmentList = mimeMessageParser.getAttachmentList();
assertTrue(attachmentList.size() == 1);
dataSource = mimeMessageParser.getAttachmentList().get(0);
assertNotNull(dataSource);
assertEquals("text/plain", dataSource.getContentType());
assertEquals("Test Attachment - a>ä, o>ö, u>ü, au>äu", dataSource.getName());
}
/**
* This test parses an "email read notification" where the resulting data source has no name. Originally
* the missing name caused a NPE in MimeUtility.decodeText().
*
* @throws Exception the test failed
*/
@Test
public void testParseMultipartReport() throws Exception
{
DataSource dataSource;
final Session session = Session.getDefaultInstance(new Properties());
final MimeMessage message = MimeMessageUtils.createMimeMessage(session, new File("./src/test/resources/eml/multipart-report.eml"));
final MimeMessageParser mimeMessageParser = new MimeMessageParser(message);
mimeMessageParser.parse();
assertEquals("Gelesen: ", mimeMessageParser.getSubject());
assertNotNull(mimeMessageParser.getMimeMessage());
assertTrue(mimeMessageParser.isMultipart());
assertTrue(mimeMessageParser.hasHtmlContent());
assertFalse(mimeMessageParser.hasPlainContent());
assertNull(mimeMessageParser.getPlainContent());
assertNotNull(mimeMessageParser.getHtmlContent());
assertTrue(mimeMessageParser.getTo().size() == 1);
assertTrue(mimeMessageParser.getCc().size() == 0);
assertTrue(mimeMessageParser.getBcc().size() == 0);
assertEquals("siegfried.goeschl@it20one.at", mimeMessageParser.getFrom());
assertEquals("siegfried.goeschl@it20one.at", mimeMessageParser.getReplyTo());
assertTrue(mimeMessageParser.hasAttachments());
final List<?> attachmentList = mimeMessageParser.getAttachmentList();
assertTrue(attachmentList.size() == 1);
dataSource = (DataSource) attachmentList.get(0);
assertNotNull(dataSource);
assertNull(dataSource.getName());
assertEquals("message/disposition-notification", dataSource.getContentType());
}
/**
* This test parses a SAP generated email which only contains a PDF but no email
* text.
*
* @throws Exception the test failed
*/
@Test
public void testAttachmentOnly() throws Exception
{
DataSource dataSource;
final Session session = Session.getDefaultInstance(new Properties());
final MimeMessage message = MimeMessageUtils.createMimeMessage(session, new File("./src/test/resources/eml/attachment-only.eml"));
final MimeMessageParser mimeMessageParser = new MimeMessageParser(message);
mimeMessageParser.parse();
assertEquals("Kunde 100029 Auftrag 3600", mimeMessageParser.getSubject());
assertNotNull(mimeMessageParser.getMimeMessage());
assertFalse(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("siegfried.goeschl@it20one.at", mimeMessageParser.getFrom());
assertEquals("siegfried.goeschl@it20one.at", mimeMessageParser.getReplyTo());
assertTrue(mimeMessageParser.hasAttachments());
final List<?> attachmentList = mimeMessageParser.getAttachmentList();
assertTrue(attachmentList.size() == 1);
dataSource = mimeMessageParser.findAttachmentByName("Kunde 100029 Auftrag 3600.pdf");
assertNotNull(dataSource);
assertEquals("application/pdf", dataSource.getContentType());
}
/**
* This test parses an eml file published with issue EMAIL-110.
* This eml file has a corrupted attachment but should not create
* an OutOfMemoryException.
*
* @throws Exception the test failed
*/
@Test
public void testParseNoHeaderSeperatorWithOutOfMemory() throws Exception
{
final Session session = Session.getDefaultInstance(new Properties());
final MimeMessage message = MimeMessageUtils.createMimeMessage(session, new File("./src/test/resources/eml/outofmemory-no-header-seperation.eml"));
final MimeMessageParser mimeMessageParser = new MimeMessageParser(message);
mimeMessageParser.parse();
assertEquals("A corrupt Attachment", mimeMessageParser.getSubject());
assertNotNull(mimeMessageParser.getMimeMessage());
assertTrue(mimeMessageParser.isMultipart());
assertFalse(mimeMessageParser.hasHtmlContent());
assertFalse(mimeMessageParser.hasPlainContent());
assertNull(mimeMessageParser.getPlainContent());
assertNull(mimeMessageParser.getHtmlContent());
assertEquals(mimeMessageParser.getTo().size(), 1);
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;
final Session session = Session.getDefaultInstance(new Properties());
final MimeMessage message = MimeMessageUtils.createMimeMessage(session, new File("./src/test/resources/eml/multipart-text-attachment.eml"));
final 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("test_from@apache.org", mimeMessageParser.getFrom());
assertEquals("test_from@apache.org", mimeMessageParser.getReplyTo());
assertTrue(mimeMessageParser.hasAttachments());
final 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;
final Session session = Session.getDefaultInstance(new Properties());
final MimeMessage message = MimeMessageUtils.createMimeMessage(session, new File("./src/test/resources/eml/multipart-text-attachment-only.eml"));
final 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("test_from@apache.org", mimeMessageParser.getFrom());
assertEquals("test_from@apache.org", mimeMessageParser.getReplyTo());
assertTrue(mimeMessageParser.hasAttachments());
final 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;
final Session session = Session.getDefaultInstance(new Properties());
final MimeMessage message = MimeMessageUtils.createMimeMessage(session, new File("./src/test/resources/eml/html-attachment-content-disposition.eml"));
final 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("test_from@apache.org", mimeMessageParser.getFrom());
assertEquals("test_from@apache.org", mimeMessageParser.getReplyTo());
assertTrue(mimeMessageParser.hasAttachments());
final List<?> attachmentList = mimeMessageParser.getAttachmentList();
assertTrue(attachmentList.size() == 1);
dataSource = mimeMessageParser.findAttachmentByName("test.html");
assertNotNull(dataSource);
assertEquals("text/html", dataSource.getContentType());
}
@Test
public void testParseCreatedHtmlEmailWithNoContent() throws Exception
{
final Session session = Session.getDefaultInstance(new Properties());
final 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();
final MimeMessage msg = email.getMimeMessage();
final 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
{
final Session session = Session.getDefaultInstance(new Properties());
final 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();
final MimeMessage msg = email.getMimeMessage();
final 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
{
final Session session = Session.getDefaultInstance(new Properties());
final 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();
final MimeMessage msg = email.getMimeMessage();
final 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());
}
@Test
public void testParseInlineCID() throws Exception
{
final Session session = Session.getDefaultInstance(new Properties());
final MimeMessage message = MimeMessageUtils.createMimeMessage(session, new File("./src/test/resources/eml/html-attachment.eml"));
final MimeMessageParser mimeMessageParser = new MimeMessageParser(message);
mimeMessageParser.parse();
assertEquals("Test", mimeMessageParser.getSubject());
assertNotNull(mimeMessageParser.getMimeMessage());
assertTrue(mimeMessageParser.isMultipart());
assertTrue(mimeMessageParser.hasHtmlContent());
assertNotNull(mimeMessageParser.getHtmlContent());
assertTrue(mimeMessageParser.getTo().size() == 1);
assertTrue(mimeMessageParser.getCc().size() == 0);
assertTrue(mimeMessageParser.getBcc().size() == 0);
assertEquals("siegfried.goeschl@it20one.at", mimeMessageParser.getFrom());
assertEquals("siegfried.goeschl@it20one.at", mimeMessageParser.getReplyTo());
assertTrue(mimeMessageParser.hasAttachments());
assertTrue(mimeMessageParser.getContentIds().contains("part1.01080006.06060206@it20one.at"));
assertFalse(mimeMessageParser.getContentIds().contains("part2"));
final DataSource ds = mimeMessageParser.findAttachmentByCid("part1.01080006.06060206@it20one.at");
assertNotNull(ds);
assertEquals(ds, mimeMessageParser.getAttachmentList().get(0));
}
}