MAILET-115 Move message altering from AbstractRedirect to AlteredMailUtils
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/6bffadb9 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/6bffadb9 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/6bffadb9 Branch: refs/heads/master Commit: 6bffadb90ea3d5b10b09c41a460c3e0efaacff67 Parents: fe3a35e Author: Antoine Duprat <[email protected]> Authored: Tue Nov 15 16:22:20 2016 +0100 Committer: Benoit Tellier <[email protected]> Committed: Wed Jan 11 10:03:30 2017 +0700 ---------------------------------------------------------------------- .../mailets/utils/MimeMessageUtils.java | 15 ++ .../mailets/utils/MimeMessageUtilsTest.java | 21 +- .../apache/james/transport/mailets/Bounce.java | 2 +- .../james/transport/mailets/DSNBounce.java | 4 +- .../apache/james/transport/mailets/Forward.java | 2 +- .../transport/mailets/NotifyPostmaster.java | 2 +- .../james/transport/mailets/NotifySender.java | 2 +- .../james/transport/mailets/Redirect.java | 2 +- .../apache/james/transport/mailets/Resend.java | 2 +- .../mailets/redirect/AbstractRedirect.java | 193 +------------- .../redirect/MailMessageAlteringUtils.java | 257 +++++++++++++++++++ .../redirect/MailMessageAlteringUtilsTest.java | 113 ++++++++ 12 files changed, 419 insertions(+), 196 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/6bffadb9/mailet/standard/src/main/java/org/apache/james/transport/mailets/utils/MimeMessageUtils.java ---------------------------------------------------------------------- diff --git a/mailet/standard/src/main/java/org/apache/james/transport/mailets/utils/MimeMessageUtils.java b/mailet/standard/src/main/java/org/apache/james/transport/mailets/utils/MimeMessageUtils.java index 8f93b65..5186abc 100644 --- a/mailet/standard/src/main/java/org/apache/james/transport/mailets/utils/MimeMessageUtils.java +++ b/mailet/standard/src/main/java/org/apache/james/transport/mailets/utils/MimeMessageUtils.java @@ -18,6 +18,8 @@ ****************************************************************/ package org.apache.james.transport.mailets.utils; +import java.util.Enumeration; + import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; @@ -68,4 +70,17 @@ public class MimeMessageUtils { return Optional.fromNullable(newSubject).or(originalSubject); } + /** + * Utility method for obtaining a string representation of a Message's + * headers + */ + public String getMessageHeaders() throws MessagingException { + @SuppressWarnings("unchecked") + Enumeration<String> heads = message.getAllHeaderLines(); + StringBuilder headBuffer = new StringBuilder(1024); + while (heads.hasMoreElements()) { + headBuffer.append(heads.nextElement()).append("\r\n"); + } + return headBuffer.toString(); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/6bffadb9/mailet/standard/src/test/java/org/apache/james/transport/mailets/utils/MimeMessageUtilsTest.java ---------------------------------------------------------------------- diff --git a/mailet/standard/src/test/java/org/apache/james/transport/mailets/utils/MimeMessageUtilsTest.java b/mailet/standard/src/test/java/org/apache/james/transport/mailets/utils/MimeMessageUtilsTest.java index 1af99e6..6a66541 100644 --- a/mailet/standard/src/test/java/org/apache/james/transport/mailets/utils/MimeMessageUtilsTest.java +++ b/mailet/standard/src/test/java/org/apache/james/transport/mailets/utils/MimeMessageUtilsTest.java @@ -19,6 +19,7 @@ package org.apache.james.transport.mailets.utils; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.guava.api.Assertions.assertThat; import java.util.Properties; @@ -26,7 +27,6 @@ import java.util.Properties; import javax.mail.Session; import javax.mail.internet.MimeMessage; -import org.apache.james.transport.mailets.utils.MimeMessageUtils; import org.apache.mailet.base.test.FakeMail; import org.junit.Test; @@ -133,4 +133,23 @@ public class MimeMessageUtilsTest { assertThat(newSubject).contains(prefix); } + + @Test + public void getMessageHeadersShouldReturnEmptyStringWhenNoHeaders() throws Exception { + MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties())); + String messageHeaders = new MimeMessageUtils(message).getMessageHeaders(); + + assertThat(messageHeaders).isEmpty(); + } + + @Test + public void getMessageHeadersShouldHeadersWhenSome() throws Exception { + MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties())); + message.addHeader("first", "value"); + message.addHeader("second", "value2"); + String messageHeaders = new MimeMessageUtils(message).getMessageHeaders(); + + String expectedHeaders = "first: value\r\nsecond: value2\r\n"; + assertThat(messageHeaders).isEqualTo(expectedHeaders); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/6bffadb9/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Bounce.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Bounce.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Bounce.java index e78873d..ef770dc 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Bounce.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Bounce.java @@ -136,7 +136,7 @@ public class Bounce extends AbstractRedirect { } @Override - protected String getMessage(Mail originalMail) throws MessagingException { + public String getMessage(Mail originalMail) throws MessagingException { return new NotifyMailetsMessage().generateMessage(getInitParameters().getMessage(), originalMail); } http://git-wip-us.apache.org/repos/asf/james-project/blob/6bffadb9/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/DSNBounce.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/DSNBounce.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/DSNBounce.java index 617af79..36c099d 100755 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/DSNBounce.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/DSNBounce.java @@ -129,7 +129,7 @@ public class DSNBounce extends AbstractRedirect { } @Override - protected String getMessage(Mail originalMail) throws MessagingException { + public String getMessage(Mail originalMail) throws MessagingException { return new NotifyMailetsMessage().generateMessage(getInitParameters().getMessage(), originalMail); } @@ -376,7 +376,7 @@ public class DSNBounce extends AbstractRedirect { MimeMessage originalMessage = originalMail.getMessage(); if (attachmentType.equals(TypeCode.HEADS)) { - part.setContent(getMessageHeaders(originalMessage), "text/plain"); + part.setContent(new MimeMessageUtils(originalMessage).getMessageHeaders(), "text/plain"); part.setHeader("Content-Type", "text/rfc822-headers"); } else { part.setContent(originalMessage, "message/rfc822"); http://git-wip-us.apache.org/repos/asf/james-project/blob/6bffadb9/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Forward.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Forward.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Forward.java index 76c4a03..1d62f6a 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Forward.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Forward.java @@ -106,7 +106,7 @@ public class Forward extends AbstractRedirect { } @Override - protected String getMessage(Mail originalMail) throws MessagingException { + public String getMessage(Mail originalMail) throws MessagingException { return getInitParameters().getMessage(); } http://git-wip-us.apache.org/repos/asf/james-project/blob/6bffadb9/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/NotifyPostmaster.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/NotifyPostmaster.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/NotifyPostmaster.java index 6c54b94..0c3b1a2 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/NotifyPostmaster.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/NotifyPostmaster.java @@ -143,7 +143,7 @@ public class NotifyPostmaster extends AbstractRedirect { } @Override - protected String getMessage(Mail originalMail) throws MessagingException { + public String getMessage(Mail originalMail) throws MessagingException { return new NotifyMailetsMessage().generateMessage(getInitParameters().getMessage(), originalMail); } http://git-wip-us.apache.org/repos/asf/james-project/blob/6bffadb9/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/NotifySender.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/NotifySender.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/NotifySender.java index fa92a1f..ed4c0ae 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/NotifySender.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/NotifySender.java @@ -143,7 +143,7 @@ public class NotifySender extends AbstractRedirect { } @Override - protected String getMessage(Mail originalMail) throws MessagingException { + public String getMessage(Mail originalMail) throws MessagingException { return new NotifyMailetsMessage().generateMessage(getInitParameters().getMessage(), originalMail); } http://git-wip-us.apache.org/repos/asf/james-project/blob/6bffadb9/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Redirect.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Redirect.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Redirect.java index cf86f9b..4cb7295 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Redirect.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Redirect.java @@ -315,7 +315,7 @@ public class Redirect extends AbstractRedirect { } @Override - protected String getMessage(Mail originalMail) throws MessagingException { + public String getMessage(Mail originalMail) throws MessagingException { return getInitParameters().getMessage(); } http://git-wip-us.apache.org/repos/asf/james-project/blob/6bffadb9/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Resend.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Resend.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Resend.java index 72b8d12..d1b0b78 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Resend.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Resend.java @@ -308,7 +308,7 @@ public class Resend extends AbstractRedirect { } @Override - protected String getMessage(Mail originalMail) throws MessagingException { + public String getMessage(Mail originalMail) throws MessagingException { return getInitParameters().getMessage(); } http://git-wip-us.apache.org/repos/asf/james-project/blob/6bffadb9/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/AbstractRedirect.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/AbstractRedirect.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/AbstractRedirect.java index 8583685..393cbf8 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/AbstractRedirect.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/AbstractRedirect.java @@ -19,21 +19,15 @@ package org.apache.james.transport.mailets.redirect; -import java.io.ByteArrayOutputStream; -import java.util.Enumeration; import java.util.List; import javax.inject.Inject; -import javax.mail.BodyPart; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; -import javax.mail.internet.MimeMultipart; import org.apache.james.core.MailImpl; -import org.apache.james.core.MimeMessageUtil; import org.apache.james.dnsservice.api.DNSService; import org.apache.james.transport.mailets.Redirect; import org.apache.james.transport.mailets.utils.MimeMessageModifier; @@ -41,7 +35,6 @@ import org.apache.james.transport.util.SpecialAddressesUtils; import org.apache.mailet.Mail; import org.apache.mailet.MailAddress; import org.apache.mailet.base.GenericMailet; -import org.apache.mailet.base.RFC2822Headers; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; @@ -147,7 +140,6 @@ import com.google.common.collect.ImmutableList; public abstract class AbstractRedirect extends GenericMailet { - private static final char LINE_BREAK = '\n'; public static final List<String> REVERSE_PATH_ALLOWED_SPECIALS = ImmutableList.of("postmaster", "sender", "null", "unaltered"); public static final List<String> SENDER_ALLOWED_SPECIALS = ImmutableList.of("postmaster", "sender", "unaltered"); @@ -168,7 +160,7 @@ public abstract class AbstractRedirect extends GenericMailet { * * @return {@link #getMessage()} */ - protected abstract String getMessage(Mail originalMail) throws MessagingException; + public abstract String getMessage(Mail originalMail) throws MessagingException; /** * Gets the <code>recipients</code> property. Returns the collection of @@ -388,7 +380,11 @@ public abstract class AbstractRedirect extends GenericMailet { newMail.setMessage(new MimeMessage(Session.getDefaultInstance(System.getProperties(), null))); // handle the new message if altered - buildAlteredMessage(newMail, originalMail); + AlteredMailUtils.builder() + .mailet(this) + .originalMail(originalMail) + .build() + .buildAlteredMessage(newMail); } else { // if we need the original, create a copy of this message to @@ -448,183 +444,6 @@ public abstract class AbstractRedirect extends GenericMailet { protected abstract MimeMessageModifier getMimeMessageModifier(Mail newMail, Mail originalMail) throws MessagingException; /** - * Utility method for obtaining a string representation of a Message's - * headers - */ - protected String getMessageHeaders(MimeMessage message) throws MessagingException { - @SuppressWarnings("unchecked") - Enumeration<String> heads = message.getAllHeaderLines(); - StringBuilder headBuffer = new StringBuilder(1024); - while (heads.hasMoreElements()) { - headBuffer.append(heads.nextElement().toString()).append("\r\n"); - } - return headBuffer.toString(); - } - - /** - * Utility method for obtaining a string representation of a Message's body - */ - private String getMessageBody(MimeMessage message) throws Exception { - ByteArrayOutputStream bodyOs = new ByteArrayOutputStream(); - MimeMessageUtil.writeMessageBodyTo(message, bodyOs); - return bodyOs.toString(); - } - - /** - * Builds the message of the newMail in case it has to be altered. - * - * @param originalMail the original Mail object - * @param newMail the Mail object to build - */ - protected void buildAlteredMessage(Mail newMail, Mail originalMail) throws MessagingException { - - MimeMessage originalMessage = originalMail.getMessage(); - MimeMessage newMessage = newMail.getMessage(); - - // Copy the relevant headers - copyRelevantHeaders(originalMessage, newMessage); - - String head = getMessageHeaders(originalMessage); - try { - // Create the message body - MimeMultipart multipart = new MimeMultipart("mixed"); - - // Create the message - MimeMultipart mpContent = new MimeMultipart("alternative"); - mpContent.addBodyPart(getBodyPart(originalMail, originalMessage, head)); - - MimeBodyPart contentPartRoot = new MimeBodyPart(); - contentPartRoot.setContent(mpContent); - - multipart.addBodyPart(contentPartRoot); - - if (getInitParameters().isDebug()) { - log("attachmentType:" + getInitParameters().getAttachmentType()); - } - if (!getInitParameters().getAttachmentType().equals(TypeCode.NONE)) { - multipart.addBodyPart(getAttachmentPart(originalMail, originalMessage, head)); - } - - if (getInitParameters().isAttachError() && originalMail.getErrorMessage() != null) { - multipart.addBodyPart(getErrorPart(originalMail)); - } - newMail.getMessage().setContent(multipart); - newMail.getMessage().setHeader(RFC2822Headers.CONTENT_TYPE, multipart.getContentType()); - - } catch (Exception ioe) { - throw new MessagingException("Unable to create multipart body", ioe); - } - } - - private BodyPart getBodyPart(Mail originalMail, MimeMessage originalMessage, String head) throws MessagingException, Exception { - MimeBodyPart part = new MimeBodyPart(); - part.setText(getText(originalMail, originalMessage, head)); - part.setDisposition("inline"); - return part; - } - - private MimeBodyPart getAttachmentPart(Mail originalMail, MimeMessage originalMessage, String head) throws MessagingException, Exception { - MimeBodyPart attachmentPart = new MimeBodyPart(); - switch (getInitParameters().getAttachmentType()) { - case HEADS: - attachmentPart.setText(head); - break; - case BODY: - try { - attachmentPart.setText(getMessageBody(originalMessage)); - } catch (Exception e) { - attachmentPart.setText("body unavailable"); - } - break; - case ALL: - attachmentPart.setText(head + "\r\nMessage:\r\n" + getMessageBody(originalMessage)); - break; - case MESSAGE: - attachmentPart.setContent(originalMessage, "message/rfc822"); - break; - case NONE: - break; - case UNALTERED: - break; - } - if ((originalMessage.getSubject() != null) && (originalMessage.getSubject().trim().length() > 0)) { - attachmentPart.setFileName(originalMessage.getSubject().trim()); - } else { - attachmentPart.setFileName("No Subject"); - } - attachmentPart.setDisposition("Attachment"); - return attachmentPart; - } - - private MimeBodyPart getErrorPart(Mail originalMail) throws MessagingException { - MimeBodyPart errorPart = new MimeBodyPart(); - errorPart.setContent(originalMail.getErrorMessage(), "text/plain"); - errorPart.setHeader(RFC2822Headers.CONTENT_TYPE, "text/plain"); - errorPart.setFileName("Reasons"); - errorPart.setDisposition(javax.mail.Part.ATTACHMENT); - return errorPart; - } - - private String getText(Mail originalMail, MimeMessage originalMessage, String head) throws MessagingException { - StringBuilder builder = new StringBuilder(); - - String messageText = getMessage(originalMail); - if (messageText != null) { - builder.append(messageText) - .append(LINE_BREAK); - } - - if (getInitParameters().isDebug()) { - log("inline:" + getInitParameters().getInLineType()); - } - boolean all = false; - switch (getInitParameters().getInLineType()) { - case ALL: - all = true; - case HEADS: - builder.append("Message Headers:") - .append(LINE_BREAK) - .append(head) - .append(LINE_BREAK); - if (!all) { - break; - } - case BODY: - appendBody(builder, originalMessage); - break; - case NONE: - break; - case MESSAGE: - break; - case UNALTERED: - break; - } - return builder.toString(); - } - - private void appendBody(StringBuilder builder, MimeMessage originalMessage) { - builder.append("Message:") - .append(LINE_BREAK); - try { - builder.append(getMessageBody(originalMessage)) - .append(LINE_BREAK); - } catch (Exception e) { - builder.append("body unavailable") - .append(LINE_BREAK); - } - } - - private void copyRelevantHeaders(MimeMessage originalMessage, MimeMessage newMessage) throws MessagingException { - @SuppressWarnings("unchecked") - Enumeration<String> headerEnum = originalMessage.getMatchingHeaderLines( - new String[] { RFC2822Headers.DATE, RFC2822Headers.FROM, RFC2822Headers.REPLY_TO, RFC2822Headers.TO, - RFC2822Headers.SUBJECT, RFC2822Headers.RETURN_PATH }); - while (headerEnum.hasMoreElements()) { - newMessage.addHeaderLine(headerEnum.nextElement()); - } - } - - /** * <p> * Checks if a sender domain of <i>mail</i> is valid. * </p> http://git-wip-us.apache.org/repos/asf/james-project/blob/6bffadb9/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/MailMessageAlteringUtils.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/MailMessageAlteringUtils.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/MailMessageAlteringUtils.java new file mode 100644 index 0000000..f83adb5 --- /dev/null +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/MailMessageAlteringUtils.java @@ -0,0 +1,257 @@ +/**************************************************************** + * 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.james.transport.mailets.redirect; + +import java.io.ByteArrayOutputStream; +import java.util.Enumeration; + +import javax.mail.BodyPart; +import javax.mail.MessagingException; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; + +import org.apache.james.core.MimeMessageUtil; +import org.apache.james.transport.mailets.utils.MimeMessageUtils; +import org.apache.mailet.Mail; +import org.apache.mailet.base.RFC2822Headers; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Preconditions; + +public class MailMessageAlteringUtils { + + private static final char LINE_BREAK = '\n'; + + public static Builder from(AbstractRedirect mailet) { + return new Builder(mailet); + } + + public static class Builder { + + private AbstractRedirect mailet; + private Mail originalMail; + private Mail newMail; + + private Builder(AbstractRedirect mailet) { + this.mailet = mailet; + } + + public Builder originalMail(Mail originalMail) { + this.originalMail = originalMail; + return this; + } + + public Builder newMail(Mail newMail) { + this.newMail = newMail; + return this; + } + + public void alterNewMessage() throws MessagingException { + build().alterNewMessage(); + } + + @VisibleForTesting MailMessageAlteringUtils build() { + Preconditions.checkNotNull(mailet, "'mailet' is mandatory"); + Preconditions.checkNotNull(originalMail, "'originalMail' is mandatory"); + Preconditions.checkNotNull(newMail, "'newMail' is mandatory"); + return new MailMessageAlteringUtils(mailet, originalMail, newMail); + } + } + + private final AbstractRedirect mailet; + private final Mail originalMail; + private final Mail newMail; + + private MailMessageAlteringUtils(AbstractRedirect mailet, Mail originalMail, Mail newMail) { + this.mailet = mailet; + this.originalMail = originalMail; + this.newMail = newMail; + } + + /** + * Builds the message of the newMail in case it has to be altered. + * + * @param originalMail the original Mail object + * @param newMail the Mail object to build + */ + private void alterNewMessage() throws MessagingException { + + MimeMessage originalMessage = originalMail.getMessage(); + MimeMessage newMessage = newMail.getMessage(); + + // Copy the relevant headers + copyRelevantHeaders(originalMessage, newMessage); + + String head = new MimeMessageUtils(originalMessage).getMessageHeaders(); + try { + // Create the message body + MimeMultipart multipart = new MimeMultipart("mixed"); + + // Create the message + MimeMultipart mpContent = new MimeMultipart("alternative"); + mpContent.addBodyPart(getBodyPart(originalMail, originalMessage, head)); + + MimeBodyPart contentPartRoot = new MimeBodyPart(); + contentPartRoot.setContent(mpContent); + + multipart.addBodyPart(contentPartRoot); + + if (mailet.getInitParameters().isDebug()) { + mailet.log("attachmentType:" + mailet.getInitParameters().getAttachmentType()); + } + if (!mailet.getInitParameters().getAttachmentType().equals(TypeCode.NONE)) { + multipart.addBodyPart(getAttachmentPart(originalMail, originalMessage, head)); + } + + if (mailet.getInitParameters().isAttachError() && originalMail.getErrorMessage() != null) { + multipart.addBodyPart(getErrorPart(originalMail)); + } + newMail.getMessage().setContent(multipart); + newMail.getMessage().setHeader(RFC2822Headers.CONTENT_TYPE, multipart.getContentType()); + + } catch (Exception ioe) { + throw new MessagingException("Unable to create multipart body", ioe); + } + } + + private BodyPart getBodyPart(Mail originalMail, MimeMessage originalMessage, String head) throws MessagingException, Exception { + MimeBodyPart part = new MimeBodyPart(); + part.setText(getText(originalMail, originalMessage, head)); + part.setDisposition("inline"); + return part; + } + + private MimeBodyPart getAttachmentPart(Mail originalMail, MimeMessage originalMessage, String head) throws MessagingException, Exception { + MimeBodyPart attachmentPart = new MimeBodyPart(); + switch (mailet.getInitParameters().getAttachmentType()) { + case HEADS: + attachmentPart.setText(head); + break; + case BODY: + try { + attachmentPart.setText(getMessageBody(originalMessage)); + } catch (Exception e) { + attachmentPart.setText("body unavailable"); + } + break; + case ALL: + attachmentPart.setText(head + "\r\nMessage:\r\n" + getMessageBody(originalMessage)); + break; + case MESSAGE: + attachmentPart.setContent(originalMessage, "message/rfc822"); + break; + case NONE: + break; + case UNALTERED: + break; + } + attachmentPart.setFileName(getFileName(originalMessage.getSubject())); + attachmentPart.setDisposition("Attachment"); + return attachmentPart; + } + + @VisibleForTesting String getFileName(String subject) { + if (subject != null && !subject.trim().isEmpty()) { + return subject.trim(); + } + return "No Subject"; + } + + private MimeBodyPart getErrorPart(Mail originalMail) throws MessagingException { + MimeBodyPart errorPart = new MimeBodyPart(); + errorPart.setContent(originalMail.getErrorMessage(), "text/plain"); + errorPart.setHeader(RFC2822Headers.CONTENT_TYPE, "text/plain"); + errorPart.setFileName("Reasons"); + errorPart.setDisposition(javax.mail.Part.ATTACHMENT); + return errorPart; + } + + private String getText(Mail originalMail, MimeMessage originalMessage, String head) throws MessagingException { + StringBuilder builder = new StringBuilder(); + + String messageText = mailet.getMessage(originalMail); + if (messageText != null) { + builder.append(messageText) + .append(LINE_BREAK); + } + + if (mailet.getInitParameters().isDebug()) { + mailet.log("inline:" + mailet.getInitParameters().getInLineType()); + } + switch (mailet.getInitParameters().getInLineType()) { + case ALL: + appendHead(builder, head); + appendBody(builder, originalMessage); + break; + case HEADS: + appendHead(builder, head); + break; + case BODY: + appendBody(builder, originalMessage); + break; + case NONE: + break; + case MESSAGE: + break; + case UNALTERED: + break; + } + return builder.toString(); + } + + private void appendHead(StringBuilder builder, String head) { + builder.append("Message Headers:") + .append(LINE_BREAK) + .append(head) + .append(LINE_BREAK); + } + + private void appendBody(StringBuilder builder, MimeMessage originalMessage) { + builder.append("Message:") + .append(LINE_BREAK); + try { + builder.append(getMessageBody(originalMessage)) + .append(LINE_BREAK); + } catch (Exception e) { + builder.append("body unavailable") + .append(LINE_BREAK); + } + } + + /** + * Utility method for obtaining a string representation of a Message's body + */ + private String getMessageBody(MimeMessage message) throws Exception { + ByteArrayOutputStream bodyOs = new ByteArrayOutputStream(); + MimeMessageUtil.writeMessageBodyTo(message, bodyOs); + return bodyOs.toString(); + } + + private void copyRelevantHeaders(MimeMessage originalMessage, MimeMessage newMessage) throws MessagingException { + @SuppressWarnings("unchecked") + Enumeration<String> headerEnum = originalMessage.getMatchingHeaderLines( + new String[] { RFC2822Headers.DATE, RFC2822Headers.FROM, RFC2822Headers.REPLY_TO, RFC2822Headers.TO, + RFC2822Headers.SUBJECT, RFC2822Headers.RETURN_PATH }); + while (headerEnum.hasMoreElements()) { + newMessage.addHeaderLine(headerEnum.nextElement()); + } + } + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/6bffadb9/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/redirect/MailMessageAlteringUtilsTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/redirect/MailMessageAlteringUtilsTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/redirect/MailMessageAlteringUtilsTest.java new file mode 100644 index 0000000..b43d883 --- /dev/null +++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/redirect/MailMessageAlteringUtilsTest.java @@ -0,0 +1,113 @@ +/**************************************************************** + * 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.james.transport.mailets.redirect; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +import org.apache.mailet.Mail; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +public class MailMessageAlteringUtilsTest { + + @Rule + public ExpectedException expectedException = ExpectedException.none(); + + @Test + public void buildShouldThrowWhenMailetIsNull() { + expectedException.expect(NullPointerException.class); + expectedException.expectMessage("'mailet' is mandatory"); + MailMessageAlteringUtils.from(null).build(); + } + + @Test + public void buildShouldThrowWhenOriginalMailIsNull() { + expectedException.expect(NullPointerException.class); + expectedException.expectMessage("'originalMail' is mandatory"); + MailMessageAlteringUtils.from(mock(AbstractRedirect.class)) + .build(); + } + + @Test + public void buildShouldThrowWhenNewMailIsNull() { + expectedException.expect(NullPointerException.class); + expectedException.expectMessage("'newMail' is mandatory"); + MailMessageAlteringUtils.from(mock(AbstractRedirect.class)) + .originalMail(mock(Mail.class)) + .build(); + } + + @Test + public void buildShouldWorkWhenEverythingProvided() { + MailMessageAlteringUtils.from(mock(AbstractRedirect.class)) + .originalMail(mock(Mail.class)) + .newMail(mock(Mail.class)) + .build(); + } + + @Test + public void getFileNameShouldReturnNoSubjectWhenSubjectIsNull() { + MailMessageAlteringUtils alteredMailUtils = MailMessageAlteringUtils.from(mock(AbstractRedirect.class)) + .originalMail(mock(Mail.class)) + .newMail(mock(Mail.class)) + .build(); + + String fileName = alteredMailUtils.getFileName(null); + + assertThat(fileName).isEqualTo("No Subject"); + } + + @Test + public void getFileNameShouldReturnNoSubjectWhenSubjectContainsOnlySpaces() { + MailMessageAlteringUtils alteredMailUtils = MailMessageAlteringUtils.from(mock(AbstractRedirect.class)) + .originalMail(mock(Mail.class)) + .newMail(mock(Mail.class)) + .build(); + + String fileName = alteredMailUtils.getFileName(" "); + + assertThat(fileName).isEqualTo("No Subject"); + } + + @Test + public void getFileNameShouldReturnSubjectWhenSubjectIsGiven() { + MailMessageAlteringUtils alteredMailUtils = MailMessageAlteringUtils.from(mock(AbstractRedirect.class)) + .originalMail(mock(Mail.class)) + .newMail(mock(Mail.class)) + .build(); + + String fileName = alteredMailUtils.getFileName("my Subject"); + + assertThat(fileName).isEqualTo("my Subject"); + } + + @Test + public void getFileNameShouldReturnTrimmedSubjectWhenSubjectStartsWithSpaces() { + MailMessageAlteringUtils alteredMailUtils = MailMessageAlteringUtils.from(mock(AbstractRedirect.class)) + .originalMail(mock(Mail.class)) + .newMail(mock(Mail.class)) + .build(); + + String fileName = alteredMailUtils.getFileName(" my Subject"); + + assertThat(fileName).isEqualTo("my Subject"); + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
