Repository: james-project Updated Branches: refs/heads/master 240bed003 -> 6d30e8db7
JAMES-1819 Add ContentTransferEncoding when converting a message from JMAP to Mime Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/e55bd9c6 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/e55bd9c6 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/e55bd9c6 Branch: refs/heads/master Commit: e55bd9c6e1abe58b4ced60934e30a12ce8ac9d2f Parents: f91fc65 Author: Antoine Duprat <[email protected]> Authored: Wed Aug 24 09:10:48 2016 +0200 Committer: Antoine Duprat <[email protected]> Committed: Fri Aug 26 08:45:38 2016 +0200 ---------------------------------------------------------------------- .../jmap/methods/MIMEMessageConverter.java | 9 ++- .../jmap/methods/MIMEMessageConverterTest.java | 74 ++++++++++++++++---- .../james/jmap/model/CreationMessageTest.java | 14 +++- 3 files changed, 81 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/e55bd9c6/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MIMEMessageConverter.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MIMEMessageConverter.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MIMEMessageConverter.java index f598d98..b802276 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MIMEMessageConverter.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MIMEMessageConverter.java @@ -75,6 +75,8 @@ public class MIMEMessageConverter { private static final String ALTERNATIVE_SUB_TYPE = "alternative"; private static final String MIXED_SUB_TYPE = "mixed"; private static final String FIELD_PARAMETERS_SEPARATOR = ";"; + private static final String QUOTED_PRINTABLE = "quoted-printable"; + private static final String BASE64 = "base64"; private final BasicBodyFactory bodyFactory; @@ -103,7 +105,8 @@ public class MIMEMessageConverter { if (isMultipart(creationMessageEntry.getValue(), messageAttachments)) { messageBuilder.setBody(createMultipart(creationMessageEntry.getValue(), messageAttachments)); } else { - messageBuilder.setBody(createTextBody(creationMessageEntry.getValue())); + messageBuilder.setBody(createTextBody(creationMessageEntry.getValue())) + .setContentTransferEncoding(QUOTED_PRINTABLE); } buildMimeHeaders(messageBuilder, creationMessageEntry.getCreationId(), creationMessageEntry.getValue(), messageAttachments); return messageBuilder.build(); @@ -209,6 +212,7 @@ public class MIMEMessageConverter { .use(bodyFactory) .setBody(textBody.get(), Charsets.UTF_8) .setContentType(PLAIN_TEXT_MEDIA_TYPE, UTF_8_CHARSET) + .setContentTransferEncoding(QUOTED_PRINTABLE) .build()); } } @@ -219,6 +223,7 @@ public class MIMEMessageConverter { .use(bodyFactory) .setBody(htmlBody.get(), Charsets.UTF_8) .setContentType(HTML_MEDIA_TYPE, UTF_8_CHARSET) + .setContentTransferEncoding(QUOTED_PRINTABLE) .build()); } } @@ -240,7 +245,7 @@ public class MIMEMessageConverter { .setBody(new BasicBodyFactory().binaryBody(ByteStreams.toByteArray(att.getAttachment().getStream()))) .setField(contentTypeField(att)) .setField(contentDispositionField(att.isInline())) - .setContentTransferEncoding("base64"); + .setContentTransferEncoding(BASE64); contentId(builder, att); return builder.build(); } http://git-wip-us.apache.org/repos/asf/james-project/blob/e55bd9c6/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/MIMEMessageConverterTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/MIMEMessageConverterTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/MIMEMessageConverterTest.java index b898aff..3bbe36c 100644 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/MIMEMessageConverterTest.java +++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/MIMEMessageConverterTest.java @@ -105,7 +105,7 @@ public class MIMEMessageConverterTest { ZonedDateTime messageDate = ZonedDateTime.ofInstant(now, ZoneId.systemDefault()); CreationMessage testMessage = CreationMessage.builder() - .mailboxIds(ImmutableList.of("dead-bada55")) + .mailboxId("dead-bada55") .subject("subject") .from(DraftEmailer.builder().name("sender").build()) .date(messageDate) @@ -120,13 +120,36 @@ public class MIMEMessageConverterTest { } @Test + public void convertToMimeShouldSetQuotedPrintableContentTransferEncodingWhenText() { + // Given + MIMEMessageConverter sut = new MIMEMessageConverter(); + + CreationMessage testMessage = CreationMessage.builder() + .mailboxId("dead-bada55") + .subject("subject") + .from(DraftEmailer.builder().name("sender").build()) + .htmlBody("Hello <b>all</b>!") + .build(); + + // When + Message result = sut.convertToMime(new ValueWithId.CreationMessageEntry( + CreationMessageId.of("user|mailbox|1"), testMessage), ImmutableList.of()); + + // Then + assertThat(result.getHeader() + .getField("Content-Transfer-Encoding") + .getBody()) + .isEqualTo("quoted-printable"); + } + + @Test public void convertToMimeShouldSetTextBodyWhenProvided() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); TextBody expected = new BasicBodyFactory().textBody("Hello all!", Charsets.UTF_8); CreationMessage testMessage = CreationMessage.builder() - .mailboxIds(ImmutableList.of("dead-bada55")) + .mailboxId("dead-bada55") .subject("subject") .from(DraftEmailer.builder().name("sender").build()) .textBody("Hello all!") @@ -147,7 +170,7 @@ public class MIMEMessageConverterTest { TextBody expected = new BasicBodyFactory().textBody("", Charsets.UTF_8); CreationMessage testMessage = CreationMessage.builder() - .mailboxIds(ImmutableList.of("dead-bada55")) + .mailboxId("dead-bada55") .subject("subject") .from(DraftEmailer.builder().name("sender").build()) .build(); @@ -167,7 +190,7 @@ public class MIMEMessageConverterTest { TextBody expected = new BasicBodyFactory().textBody("Hello <b>all</b>!", Charsets.UTF_8); CreationMessage testMessage = CreationMessage.builder() - .mailboxIds(ImmutableList.of("dead-bada55")) + .mailboxId("dead-bada55") .subject("subject") .from(DraftEmailer.builder().name("sender").build()) .htmlBody("Hello <b>all</b>!") @@ -187,7 +210,7 @@ public class MIMEMessageConverterTest { MIMEMessageConverter sut = new MIMEMessageConverter(); CreationMessage testMessage = CreationMessage.builder() - .mailboxIds(ImmutableList.of("dead-bada55")) + .mailboxId("dead-bada55") .subject("subject") .from(DraftEmailer.builder().name("sender").build()) .textBody("Hello all!") @@ -212,7 +235,7 @@ public class MIMEMessageConverterTest { MIMEMessageConverter sut = new MIMEMessageConverter(); CreationMessage testMessage = CreationMessage.builder() - .mailboxIds(ImmutableList.of("dead-bada55")) + .mailboxId("dead-bada55") .subject("subject") .from(DraftEmailer.builder().name("sender").build()) .textBody("Hello all!") @@ -223,9 +246,11 @@ public class MIMEMessageConverterTest { "Content-Type: multipart/alternative;\r\n" + " boundary=\"-=Part.1."; String expectedPart1 = "Content-Type: text/plain; charset=UTF-8\r\n" + + "Content-Transfer-Encoding: quoted-printable\r\n" + "\r\n" + "Hello all!\r\n"; String expectedPart2 = "Content-Type: text/html; charset=UTF-8\r\n" + + "Content-Transfer-Encoding: quoted-printable\r\n" + "\r\n" + "Hello <b>all</b>!\r\n"; @@ -246,7 +271,7 @@ public class MIMEMessageConverterTest { MIMEMessageConverter sut = new MIMEMessageConverter(); CreationMessage testMessage = CreationMessage.builder() - .mailboxIds(ImmutableList.of("dead-bada55")) + .mailboxId("dead-bada55") .subject("subject") .from(DraftEmailer.builder().name("sender").build()) .textBody("Hello all!") @@ -266,7 +291,7 @@ public class MIMEMessageConverterTest { MIMEMessageConverter sut = new MIMEMessageConverter(); CreationMessage testMessage = CreationMessage.builder() - .mailboxIds(ImmutableList.of("dead-bada55")) + .mailboxId("dead-bada55") .subject("subject") .from(DraftEmailer.builder().name("sender").build()) .htmlBody("Hello <b>all<b>!") @@ -287,7 +312,7 @@ public class MIMEMessageConverterTest { TextBody expected = new BasicBodyFactory().textBody("", Charsets.UTF_8); CreationMessage testMessage = CreationMessage.builder() - .mailboxIds(ImmutableList.of("dead-bada55")) + .mailboxId("dead-bada55") .subject("subject") .from(DraftEmailer.builder().name("sender").build()) .htmlBody("") @@ -309,7 +334,7 @@ public class MIMEMessageConverterTest { TextBody expected = new BasicBodyFactory().textBody("", Charsets.UTF_8); CreationMessage testMessage = CreationMessage.builder() - .mailboxIds(ImmutableList.of("dead-bada55")) + .mailboxId("dead-bada55") .subject("subject") .from(DraftEmailer.builder().name("sender").build()) .textBody("") @@ -330,7 +355,7 @@ public class MIMEMessageConverterTest { MIMEMessageConverter sut = new MIMEMessageConverter(); CreationMessage testMessage = CreationMessage.builder() - .mailboxIds(ImmutableList.of("dead-bada55")) + .mailboxId("dead-bada55") .subject("subject") .from(DraftEmailer.builder().name("sender").build()) .htmlBody("Hello <b>all<b>!") @@ -364,6 +389,7 @@ public class MIMEMessageConverterTest { assertThat(attachmentPart.getDispositionType()).isEqualTo("inline"); assertThat(attachmentPart.getMimeType()).isEqualTo(expectedMimeType); assertThat(attachmentPart.getHeader().getField("Content-ID").getBody()).isEqualTo(expectedCID); + assertThat(attachmentPart.getContentTransferEncoding()).isEqualTo("base64"); } @Test @@ -372,7 +398,7 @@ public class MIMEMessageConverterTest { MIMEMessageConverter sut = new MIMEMessageConverter(); CreationMessage testMessage = CreationMessage.builder() - .mailboxIds(ImmutableList.of("dead-bada55")) + .mailboxId("dead-bada55") .subject("subject") .from(DraftEmailer.builder().name("sender").build()) .textBody("Hello all!") @@ -420,4 +446,28 @@ public class MIMEMessageConverterTest { assertThat(attachmentPart.getMimeType()).isEqualTo(expectedMimeType); assertThat(attachmentPart.getHeader().getField("Content-ID").getBody()).isEqualTo(expectedCID); } + + @Test + public void convertShouldEncodeWhenNonASCIICharacters() { + // Given + MIMEMessageConverter sut = new MIMEMessageConverter(); + + CreationMessage testMessage = CreationMessage.builder() + .mailboxId("dead-bada55") + .subject("subject") + .from(DraftEmailer.builder().name("sender").build()) + .htmlBody("Some non-ASCII characters: áÃÃÃÿ") + .build(); + + // When + ImmutableList<MessageAttachment> attachments = ImmutableList.of(); + byte[] convert = sut.convert(new ValueWithId.CreationMessageEntry( + CreationMessageId.of("user|mailbox|1"), testMessage), attachments); + + String expectedEncodedContent = "Some non-ASCII characters: =C3=A1=C3=84=C3=8E=C3=9F=C3=BF"; + + // Then + String actual = new String(convert, Charsets.US_ASCII); + assertThat(actual).contains(expectedEncodedContent); + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/james-project/blob/e55bd9c6/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/CreationMessageTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/CreationMessageTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/CreationMessageTest.java index a72647f..e7762aa 100644 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/CreationMessageTest.java +++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/CreationMessageTest.java @@ -19,11 +19,11 @@ package org.apache.james.jmap.model; -import static org.apache.james.jmap.model.CreationMessage.DraftEmailer; -import static org.apache.james.jmap.model.MessageProperties.MessageProperty; import static org.assertj.core.api.Assertions.assertThat; import org.apache.james.jmap.methods.ValidationResult; +import org.apache.james.jmap.model.CreationMessage.DraftEmailer; +import org.apache.james.jmap.model.MessageProperties.MessageProperty; import org.junit.Before; import org.junit.Test; @@ -134,4 +134,14 @@ public class CreationMessageTest { assertThat(sut.validate()).isEmpty(); } + @Test + public void mailboxIdShouldSetASingletonList() { + String mailboxId = "123"; + CreationMessage message = CreationMessage.builder() + .headers(ImmutableMap.of()) + .mailboxId(mailboxId) + .build(); + + assertThat(message.getMailboxIds()).containsExactly(mailboxId); + } } \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
