Skip to content

Commit

Permalink
restructured internal parser classes and added support for parsing Ou…
Browse files Browse the repository at this point in the history
…tlook messages!
  • Loading branch information
bbottema committed Mar 5, 2017
1 parent aada381 commit 859b2b9
Show file tree
Hide file tree
Showing 12 changed files with 146 additions and 20 deletions.
7 changes: 7 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,11 @@
<artifactId>utils-mail-dkim</artifactId>
<version>1.1.6</version>
</dependency>
<dependency>
<groupId>org.simplejavamail</groupId>
<artifactId>outlook-message-parser</artifactId>
<version>1.1.16-SNAPSHOT</version>
</dependency>

<!-- utility -->
<dependency><!-- gives us @NonNull annotations-->
Expand Down Expand Up @@ -166,6 +171,7 @@
<target>1.7</target>
</configuration>
</plugin>

<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.2</version>
Expand Down Expand Up @@ -254,6 +260,7 @@
<includes>
<include>com.github.bbottema:emailaddress-rfc2822</include>
<include>net.markenwerk:utils-mail-dkim</include>
<include>org.simplejavamail:outlook-message-parser</include>
</includes>
</artifactSet>
</configuration>
Expand Down
80 changes: 73 additions & 7 deletions src/main/java/org/simplejavamail/converter/EmailConverter.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
package org.simplejavamail.converter;

import org.simplejavamail.converter.internal.MimeMessageHelper;
import org.simplejavamail.converter.internal.MimeMessageParser;
import org.simplejavamail.converter.internal.mimemessage.MimeMessageHelper;
import org.simplejavamail.converter.internal.mimemessage.MimeMessageParser;
import org.simplejavamail.converter.internal.msgparser.OutlookMessageParser;
import org.simplejavamail.email.Email;
import org.simplejavamail.internal.util.MiscUtil;
import org.simplejavamail.outlookmessageparser.model.OutlookFileAttachment;
import org.simplejavamail.outlookmessageparser.model.OutlookMessage;
import org.simplejavamail.outlookmessageparser.model.OutlookRecipient;

import javax.activation.DataSource;
import javax.annotation.Nonnull;
Expand All @@ -11,13 +16,19 @@
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import java.util.Properties;

import static java.lang.String.format;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.simplejavamail.converter.internal.MimeMessageHelper.produceMimeMessage;
import static org.simplejavamail.converter.internal.mimemessage.MimeMessageHelper.produceMimeMessage;
import static org.simplejavamail.internal.util.MiscUtil.extractCID;

/**
Expand All @@ -36,15 +47,43 @@ private EmailConverter() {
public static Email mimeMessageToEmail(@Nonnull final MimeMessage mimeMessage) {
final Email email = new Email(false);
try {
fillEmailFromMimeMessage(email, new MimeMessageParser(mimeMessage).parse());
fillEmailFromMimeMessage(email, mimeMessage);
} catch (MessagingException | IOException e) {
throw new EmailConverterException(format(EmailConverterException.PARSE_ERROR_MIMEMESSAGE, e.getMessage()), e);
}
return email;
}

private static void fillEmailFromMimeMessage(@Nonnull final Email email, @Nonnull final MimeMessageParser parser)
throws MessagingException {
/**
* @param msgData The content of an Outlook (.msg) message from which to create the email.
*/
public static Email outlookMsgToEmail(@Nonnull final String msgData) {
final Email email = new Email(false);
fillEmailFromOutlookMessage(email, OutlookMessageParser.parseOutlookMsg(msgData));
return email;
}

/**
* @param msgfile The content of an Outlook (.msg) message from which to create the email.
*/
public static Email outlookMsgToEmail(@Nonnull final File msgfile) {
final Email email = new Email(false);
fillEmailFromOutlookMessage(email, OutlookMessageParser.parseOutlookMsg(msgfile));
return email;
}

/**
* @param msgInputStream The content of an Outlook (.msg) message from which to create the email.
*/
public static Email outlookMsgToEmail(@Nonnull final InputStream msgInputStream) {
final Email email = new Email(false);
fillEmailFromOutlookMessage(email, OutlookMessageParser.parseOutlookMsg(msgInputStream));
return email;
}

private static void fillEmailFromMimeMessage(@Nonnull final Email email, @Nonnull final MimeMessage mimeMessage)
throws MessagingException, IOException {
final MimeMessageParser parser = new MimeMessageParser(mimeMessage).parse();
final InternetAddress from = parser.getFrom();
email.setFromAddress(from.getPersonal(), from.getAddress());
final InternetAddress replyTo = parser.getReplyTo();
Expand Down Expand Up @@ -73,6 +112,33 @@ private static void fillEmailFromMimeMessage(@Nonnull final Email email, @Nonnul
}
}

private static void fillEmailFromOutlookMessage(@Nonnull final Email email, @Nonnull final OutlookMessage outlookMessage) {
email.setFromAddress(outlookMessage.getFromName(), outlookMessage.getFromEmail());
if (!MiscUtil.valueNullOrEmpty(outlookMessage.getReplyToEmail())) {
email.setReplyToAddress(outlookMessage.getReplyToName(), outlookMessage.getReplyToEmail());
}
for (final OutlookRecipient to : outlookMessage.getRecipients()) {
email.addRecipient(to.getName(), to.getAddress(), Message.RecipientType.TO);
}
//noinspection QuestionableName
for (final OutlookRecipient cc : outlookMessage.getCcRecipients()) {
email.addRecipient(cc.getName(), cc.getAddress(), Message.RecipientType.CC);
}
for (final OutlookRecipient bcc : outlookMessage.getBccRecipients()) {
email.addRecipient(bcc.getName(), bcc.getAddress(), Message.RecipientType.BCC);
}
email.setSubject(outlookMessage.getSubject());
email.setText(outlookMessage.getBodyText());
email.setTextHTML(outlookMessage.getBodyHTML() != null ? outlookMessage.getBodyHTML() : outlookMessage.getConvertedBodyHTML());

for (final Map.Entry<String, OutlookFileAttachment> cid : outlookMessage.fetchCIDMap().entrySet()) {
email.addEmbeddedImage(extractCID(cid.getKey()), cid.getValue().getData(), cid.getValue().getMimeTag());
}
for (final OutlookFileAttachment attachment : outlookMessage.fetchTrueAttachments()) {
email.addAttachment(attachment.getLongFilename(), attachment.getData(), attachment.getMimeTag());
}
}

/**
* Delegates to {@link #emailToMimeMessage(Email, Session)}, using a new empty {@link Session} instance.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package org.simplejavamail.converter.internal;
package org.simplejavamail.converter.internal.mimemessage;

import org.simplejavamail.MailException;

/**
* This exception is used to communicate errors during the sending of email.
* This exception is used to communicate errors during parsing of a {@link javax.mail.internet.MimeMessage}.
*
* @author Benny Bottema
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.simplejavamail.converter.internal;
package org.simplejavamail.converter.internal.mimemessage;

import net.markenwerk.utils.mail.dkim.Canonicalization;
import net.markenwerk.utils.mail.dkim.DkimMessage;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.simplejavamail.converter.internal;
package org.simplejavamail.converter.internal.mimemessage;

import javax.activation.DataHandler;
import javax.activation.DataSource;
Expand All @@ -29,8 +29,7 @@

/**
* <strong>heavily modified version based on org.apache.commons.mail.util.MimeMessageParser.html</strong>
* Parses a MimeMessage and stores the individual parts such a plain text,
* HTML text and attachments.
* Parses a MimeMessage and stores the individual parts such a plain text, HTML text and attachments.
*
* @version current: MimeMessageParser.java 2016-02-25 Benny Bottema
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.simplejavamail.converter.internal;
package org.simplejavamail.converter.internal.mimemessage;

import javax.activation.DataSource;
import java.io.IOException;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.simplejavamail.converter.internal.msgparser;

import org.simplejavamail.MailException;

/**
* This exception is used to communicate errors during parsing of a MsgParser {@link org.simplejavamail.outlookmessageparser.model.OutlookMessage} of Outlook
* .msg data.
*
* @author Benny Bottema
*/
@SuppressWarnings("serial")
class OutlookMessageException extends MailException {

static final String ERROR_PARSING_OUTLOOK_MSG = "Unable to parse Outlook message";

OutlookMessageException(final String message, final Exception cause) {
super(message, cause);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package org.simplejavamail.converter.internal.msgparser;

import org.simplejavamail.outlookmessageparser.model.OutlookMessage;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

/**
* Helper class that parses {@link OutlookMessage} instances from the {@link org.simplejavamail.outlookmessageparser.OutlookMessageParser} library.
*/
public class OutlookMessageParser {

public static OutlookMessage parseOutlookMsg(File msgFile) {
try {
return new org.simplejavamail.outlookmessageparser.OutlookMessageParser().parseMsg(msgFile);
} catch (IOException e) {
throw new OutlookMessageException(OutlookMessageException.ERROR_PARSING_OUTLOOK_MSG, e);
}
}

public static OutlookMessage parseOutlookMsg(InputStream msgInputStream) {
try {
return new org.simplejavamail.outlookmessageparser.OutlookMessageParser().parseMsg(msgInputStream);
} catch (IOException e) {
throw new OutlookMessageException(OutlookMessageException.ERROR_PARSING_OUTLOOK_MSG, e);
}
}

public static OutlookMessage parseOutlookMsg(String msgData) {
try {
return new org.simplejavamail.outlookmessageparser.OutlookMessageParser().parseMsg(msgData);
} catch (IOException e) {
throw new OutlookMessageException(OutlookMessageException.ERROR_PARSING_OUTLOOK_MSG, e);
}
}
}
2 changes: 1 addition & 1 deletion src/main/java/org/simplejavamail/mailer/Mailer.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import org.simplejavamail.mailer.config.ServerConfig;
import org.simplejavamail.mailer.config.TransportStrategy;
import org.simplejavamail.mailer.internal.mailsender.MailSender;
import org.simplejavamail.converter.internal.MimeMessageHelper;
import org.simplejavamail.converter.internal.mimemessage.MimeMessageHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.simplejavamail.mailer.internal.mailsender;

import org.simplejavamail.MailException;
import org.simplejavamail.converter.internal.MimeMessageHelper;
import org.simplejavamail.converter.internal.mimemessage.MimeMessageHelper;
import org.simplejavamail.email.Email;
import org.simplejavamail.mailer.config.ProxyConfig;
import org.simplejavamail.mailer.config.TransportStrategy;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package org.simplejavamail.converter.internal;
package org.simplejavamail.converter.internal.mimemessage;

import org.junit.Test;
import org.simplejavamail.email.AttachmentResource;
import org.simplejavamail.converter.internal.MimeMessageHelper;

import javax.mail.util.ByteArrayDataSource;
import java.io.IOException;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package org.simplejavamail.converter.internal;
package org.simplejavamail.converter.internal.mimemessage;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.simplejavamail.converter.internal.NamedDataSource;

import javax.activation.DataSource;

Expand Down

2 comments on commit 859b2b9

@bbottema
Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Implements #65

@bbottema
Copy link
Owner Author

@bbottema bbottema commented on 859b2b9 Mar 5, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Breaks build until org.simplejavamail:outlook-message-parser is in Maven Central (https://github.com/bbottema/outlook-message-parser).

Please sign in to comment.