for (int i = 0; i < msgCount; i++) { mailboxManager.getMailbox(mailboxPath, session).appendMessage(MessageManager.AppendCommand.from( Message.Builder.of() .setSubject("test") .setBody(String.valueOf(i), StandardCharsets.UTF_8)), session);
@Test public void processShouldNotFailOnSingleMessageFailure() throws Exception { MessageFactory messageFactory = mock(MessageFactory.class); testee = new GetMessagesMethod(messageFactory, messageIdManager, new DefaultMetricFactory()); MessageManager inbox = mailboxManager.getMailbox(inboxPath, session); org.apache.james.mime4j.dom.Message messageContent = org.apache.james.mime4j.dom.Message.Builder.of() .setFrom("user@domain.tld") .setField(new RawField("header1", "Header1Content")) .setField(new RawField("HEADer2", "Header2Content")) .setSubject("message 1 subject") .setBody("my message", StandardCharsets.UTF_8) .build(); ComposedMessageId message1 = inbox.appendMessage(AppendCommand.from(messageContent), session); ComposedMessageId message2 = inbox.appendMessage(AppendCommand.from(messageContent), session); when(messageFactory.fromMetaDataWithContent(any())) .thenReturn(mock(Message.class)) .thenThrow(new RuntimeException()); GetMessagesRequest request = GetMessagesRequest.builder() .ids(ImmutableList.of(message1.getMessageId(), message2.getMessageId())) .properties(ImmutableList.of("mailboxIds")) .build(); List<JmapResponse> responses = testee.process(request, clientId, session).collect(Guavate.toImmutableList()); assertThat(responses).hasSize(1); Method.Response response = responses.get(0).getResponse(); assertThat(response).isInstanceOf(GetMessagesResponse.class); GetMessagesResponse getMessagesResponse = (GetMessagesResponse) response; assertThat(getMessagesResponse.list()).hasSize(1); }
@Test public void generateMDNMessageShouldFailOnMissingDisposition() throws Exception { String senderAddress = "sender@local"; Message originMessage = Message.Builder.of() .setMessageId("45554@local.com") .setFrom(senderAddress) .setBody("body", StandardCharsets.UTF_8) .addField(new RawField(JmapMDN.RETURN_PATH, "<" + senderAddress + ">")) .build(); assertThatThrownBy(() -> MDN.generateMDNMessage(originMessage, MAILBOX_SESSION)) .isInstanceOf(InvalidOriginMessageForMDNException.class); }
ComposedMessageId messageId = m.appendMessage( MessageManager.AppendCommand .from(Message.Builder.of() .setSubject("test") .setBody("testmail", StandardCharsets.UTF_8)), mailboxSession);
for (int i = 0; i < msgCount; i++) { mailboxManager.getMailbox(mailboxPath, session).appendMessage(MessageManager.AppendCommand.from( Message.Builder.of() .setSubject("test") .setBody(String.valueOf(i), StandardCharsets.UTF_8)), session);
messageManager.appendMessage(MessageManager.AppendCommand.builder() .withFlags(defaultUnseenFlag) .build(Message.Builder.of() .setSubject("test") .setBody("testmail", StandardCharsets.UTF_8)), mailboxSession); messageManager.appendMessage(MessageManager.AppendCommand.builder() .withFlags(defaultUnseenFlag) .build(Message.Builder.of() .setSubject("test2") .setBody("testmail", StandardCharsets.UTF_8)), mailboxSession); messageManager.appendMessage(MessageManager.AppendCommand.builder() .withFlags(readMessageFlag) .build(Message.Builder.of() .setSubject("test3") .setBody("testmail", StandardCharsets.UTF_8)), mailboxSession); GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder() .build();
fromAddress.ifPresent(messageBuilder::setSender); messageBuilder.setReplyTo(newMessage.getReplyTo().stream() .map(this::convertEmailToMimeHeader) .collect(Collectors.toList())); messageBuilder.setTo(newMessage.getTo().stream() .filter(DraftEmailer::hasValidEmail) .map(this::convertEmailToMimeHeader) .collect(Collectors.toList())); messageBuilder.setCc(newMessage.getCc().stream() .filter(DraftEmailer::hasValidEmail) .map(this::convertEmailToMimeHeader) .collect(Collectors.toList())); messageBuilder.setBcc(newMessage.getBcc().stream() .filter(DraftEmailer::hasValidEmail) .map(this::convertEmailToMimeHeader) .collect(Collectors.toList())); messageBuilder.setSubject(newMessage.getSubject()); messageBuilder.setMessageId(generateUniqueMessageId(fromAddress)); messageBuilder.setDate(Date.from(newMessage.getDate().toInstant()), TimeZone.getTimeZone(newMessage.getDate().getZone())); newMessage.getInReplyToMessageId() .ifPresent(id -> addHeader(messageBuilder, IN_REPLY_TO_HEADER, id)); if (!isMultipart(newMessage, messageAttachments)) { newMessage.getHtmlBody().ifPresent(x -> messageBuilder.setContentType(HTML_MEDIA_TYPE, UTF_8_CHARSET));
.build(Message.Builder.of() .setSubject("test") .setBody("content", StandardCharsets.UTF_8))); ComposedMessageId message2 = mailboxProbe.appendMessage(ALICE, MailboxPath.forUser(ALICE, "mailbox"), MessageManager.AppendCommand.builder() .build(Message.Builder.of() .setBody( MultipartBuilder.create("alternative") .addBodyPart(BodyPartBuilder.create()
.build(Message.Builder.of() .setSubject("test") .setBody("content", StandardCharsets.UTF_8))); ComposedMessageId message2 = mailboxProbe.appendMessage(ALICE, MailboxPath.forUser(ALICE, "mailbox"), MessageManager.AppendCommand.builder() .build(Message.Builder.of() .setBody( MultipartBuilder.create("alternative") .addBodyPart(BodyPartBuilder.create()
@Test public void processShouldReturnOneMessageWhenMessageInSeveralMailboxes() throws Exception { MessageManager inbox = mailboxManager.getMailbox(inboxPath, session); ComposedMessageId message1 = inbox.appendMessage( AppendCommand.from( org.apache.james.mime4j.dom.Message.Builder.of() .setFrom("user@domain.tld") .setField(new RawField("header1", "Header1Content")) .setField(new RawField("HEADer2", "Header2Content")) .setSubject("message 1 subject") .setBody("my message", StandardCharsets.UTF_8)), session); MailboxId customMailboxId = mailboxManager.getMailbox(customMailboxPath, session).getId(); messageIdManager.setInMailboxes(message1.getMessageId(), ImmutableList.of(message1.getMailboxId(), customMailboxId), session); GetMessagesRequest request = GetMessagesRequest.builder() .ids(ImmutableList.of(message1.getMessageId())) .properties(ImmutableList.of("mailboxIds")) .build(); List<JmapResponse> result = testee.process(request, clientId, session).collect(Collectors.toList()); assertThat(result).hasSize(1); Method.Response response = result.get(0).getResponse(); assertThat(response).isInstanceOf(GetMessagesResponse.class); GetMessagesResponse getMessagesResponse = (GetMessagesResponse) response; assertThat(getMessagesResponse.list()).hasSize(1); assertThat(getMessagesResponse.list().get(0).getMailboxIds()).containsOnly(customMailboxId, message1.getMailboxId()); }
testee = new GetMessagesMethod(messageFactory, messageIdManager, new DefaultMetricFactory()); messageContent1 = org.apache.james.mime4j.dom.Message.Builder.of() .setSubject("message 1 subject") .setBody("my message", StandardCharsets.UTF_8) .build(); messageContent2 = org.apache.james.mime4j.dom.Message.Builder.of() .setSubject("message 2 subject") .setBody("my message", StandardCharsets.UTF_8) .build(); messageContent3 = org.apache.james.mime4j.dom.Message.Builder.of() .addField(new RawField("Great-Header", "message 3 subject")) .setBody("my message", StandardCharsets.UTF_8) .build();
public Builder parse(final InputStream is) throws IOException { MimeConfig currentConfig = config != null ? config : MimeConfig.DEFAULT; boolean strict = currentConfig.isStrictParsing(); DecodeMonitor currentMonitor = monitor != null ? monitor : strict ? DecodeMonitor.STRICT : DecodeMonitor.SILENT; BodyDescriptorBuilder currentBodyDescBuilder = bodyDescBuilder != null ? bodyDescBuilder : new DefaultBodyDescriptorBuilder(null, fieldParser != null ? fieldParser : strict ? DefaultFieldParser.getParser() : LenientFieldParser.getParser(), currentMonitor); BodyFactory currentBodyFactory = bodyFactory != null ? bodyFactory : new BasicBodyFactory(!strict); MimeStreamParser parser = new MimeStreamParser(currentConfig, currentMonitor, currentBodyDescBuilder); Message message = new MessageImpl(); parser.setContentHandler(new ParserStreamContentHandler(message, currentBodyFactory)); parser.setContentDecoding(!rawContent); if (flatMode) { parser.setFlat(); } try { parser.parse(is); } catch (MimeException e) { throw new MimeIOException(e); } clearFields(); final List<Field> fields = message.getHeader().getFields(); for (Field field: fields) { addField(field); } setBody(message.getBody()); return this; }
@Test @SuppressWarnings("unchecked") public void getMailboxesShouldReturnMailboxesWhenAvailable() throws Exception { MailboxPath mailboxPath = MailboxPath.forUser(USERNAME, "name"); MailboxSession mailboxSession = mailboxManager.createSystemSession(USERNAME); mailboxManager.createMailbox(mailboxPath, mailboxSession); MessageManager messageManager = mailboxManager.getMailbox(mailboxPath, mailboxSession); messageManager.appendMessage(MessageManager.AppendCommand.from( Message.Builder.of() .setSubject("test") .setBody("testmail", StandardCharsets.UTF_8)), mailboxSession); messageManager.appendMessage(MessageManager.AppendCommand.from( Message.Builder.of() .setSubject("test2") .setBody("testmail", StandardCharsets.UTF_8)), mailboxSession); GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder() .build(); List<JmapResponse> getMailboxesResponse = getMailboxesMethod.process(getMailboxesRequest, clientId, mailboxSession).collect(Collectors.toList()); assertThat(getMailboxesResponse) .hasSize(1) .extracting(JmapResponse::getResponse) .hasOnlyElementsOfType(GetMailboxesResponse.class) .extracting(GetMailboxesResponse.class::cast) .flatExtracting(GetMailboxesResponse::getList) .extracting(Mailbox::getId, Mailbox::getName, Mailbox::getUnreadMessages) .containsOnly(Tuple.tuple(InMemoryId.of(1), mailboxPath.getName(), Number.fromLong(2L))); }
@Test @SuppressWarnings("unchecked") public void processShouldNotOverrideTextBodyWhenItIsThere() throws Exception { MessageManager inbox = mailboxManager.getMailbox(inboxPath, session); ComposedMessageId message = inbox.appendMessage( AppendCommand.from(org.apache.james.mime4j.dom.Message.Builder.of() .setSubject("message subject") .setBody(MultipartBuilder.create() .setSubType("alternative") .addBodyPart(BodyPartBuilder.create() .setBody("My plain message", "plain", StandardCharsets.UTF_8)) .addBodyPart(BodyPartBuilder.create() .setBody("<a>The </a> <strong>HTML</strong> message", "html", StandardCharsets.UTF_8)) .build())), session); GetMessagesRequest request = GetMessagesRequest.builder() .ids(ImmutableList.of(message.getMessageId())) .build(); List<JmapResponse> result = testee.process(request, clientId, session).collect(Collectors.toList()); assertThat(result).hasSize(1) .extracting(JmapResponse::getResponse) .hasOnlyElementsOfType(GetMessagesResponse.class) .extracting(GetMessagesResponse.class::cast) .flatExtracting(GetMessagesResponse::list) .extracting(Message::getId, Message::getTextBody, Message::getHtmlBody) .containsOnly(Tuple.tuple(message.getMessageId(), Optional.of("My plain message"), Optional.of("<a>The </a> <strong>HTML</strong> message"))); }
@Test public void getMailboxesShouldReturnCorrectTotalMessagesCount() throws Exception { MailboxPath mailboxPath = MailboxPath.forUser(USERNAME, "name"); MailboxSession mailboxSession = mailboxManager.createSystemSession(USERNAME); mailboxManager.createMailbox(mailboxPath, mailboxSession); MessageManager messageManager = mailboxManager.getMailbox(mailboxPath, mailboxSession); messageManager.appendMessage(MessageManager.AppendCommand.from( Message.Builder.of() .setSubject("test") .setBody("testmail", StandardCharsets.UTF_8)), mailboxSession); messageManager.appendMessage(MessageManager.AppendCommand.from( Message.Builder.of() .setSubject("test2") .setBody("testmail", StandardCharsets.UTF_8)), mailboxSession); GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder() .build(); List<JmapResponse> getMailboxesResponse = getMailboxesMethod.process(getMailboxesRequest, clientId, mailboxSession).collect(Collectors.toList()); assertThat(getMailboxesResponse) .hasSize(1) .extracting(JmapResponse::getResponse) .hasOnlyElementsOfType(GetMailboxesResponse.class) .extracting(GetMailboxesResponse.class::cast) .flatExtracting(GetMailboxesResponse::getList) .extracting(Mailbox::getTotalMessages) .containsExactly(Number.fromLong(2L)); }
@Test public void processShouldReturnPropertyFilterWhenFilteringHeadersRequested() throws Exception { MessageManager inbox = mailboxManager.getMailbox(inboxPath, session); ComposedMessageId message1 = inbox.appendMessage( AppendCommand.from( org.apache.james.mime4j.dom.Message.Builder.of() .setFrom("user@domain.tld") .setField(new RawField("header1", "Header1Content")) .setField(new RawField("HEADer2", "Header2Content")) .setSubject("message 1 subject") .setBody("my message", StandardCharsets.UTF_8)), session); GetMessagesRequest request = GetMessagesRequest.builder() .ids(ImmutableList.of(message1.getMessageId())) .properties(ImmutableList.of("headers.from", "headers.heADER2")) .build(); List<JmapResponse> result = testee.process(request, clientId, session).collect(Collectors.toList()); assertThat(result) .hasSize(1) .extracting(JmapResponse::getFilterProvider) .are(new Condition<>(Optional::isPresent, "present")); SimpleFilterProvider actualFilterProvider = result.get(0).getFilterProvider().get(); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setFilterProvider(actualFilterProvider.setDefaultFilter(SimpleBeanPropertyFilter.serializeAll())); String response = objectMapper.writer().writeValueAsString(result.get(0)); assertThat(JsonPath.parse(response).<Map<String, String>>read("$.response.list[0].headers")).containsOnly(MapEntry.entry("From", "user@domain.tld"), MapEntry.entry("HEADer2", "Header2Content")); }
public Builder copy(Message other) { if (other == null) { return this; } clearFields(); final Header otherHeader = other.getHeader(); if (otherHeader != null) { final List<Field> otherFields = otherHeader.getFields(); for (Field field: otherFields) { addField(field); } } Body body = null; Body otherBody = other.getBody(); if (otherBody instanceof Message) { body = Builder.of((Message) otherBody).build(); } else if (otherBody instanceof Multipart) { body = MultipartBuilder.createCopy((Multipart) otherBody).build(); } else if (otherBody instanceof SingleBody) { body = ((SingleBody) otherBody).copy(); } setBody(body); return this; }
@Test @SuppressWarnings("unchecked") public void processShouldReturnTextBodyWhenEmptyTextBodyAndNotEmptyHtmlBody() throws Exception { MessageManager inbox = mailboxManager.getMailbox(inboxPath, session); ComposedMessageId message = inbox.appendMessage( AppendCommand.from( org.apache.james.mime4j.dom.Message.Builder.of() .setSubject("message 1 subject") .setBody("my <b>HTML</b> message", "html", StandardCharsets.UTF_8)), session); GetMessagesRequest request = GetMessagesRequest.builder() .ids(ImmutableList.of(message.getMessageId())) .build(); List<JmapResponse> result = testee.process(request, clientId, session).collect(Collectors.toList()); assertThat(result).hasSize(1) .extracting(JmapResponse::getResponse) .hasOnlyElementsOfType(GetMessagesResponse.class) .extracting(GetMessagesResponse.class::cast) .flatExtracting(GetMessagesResponse::list) .extracting(Message::getId, Message::getTextBody, Message::getHtmlBody) .containsOnly(Tuple.tuple(message.getMessageId(), Optional.of("my HTML message"), Optional.of("my <b>HTML</b> message"))); }
@Test @SuppressWarnings("unchecked") public void processShouldFetchHtmlMessage() throws Exception { MessageManager inbox = mailboxManager.getMailbox(inboxPath, session); ComposedMessageId message = inbox.appendMessage( AppendCommand.from( org.apache.james.mime4j.dom.Message.Builder.of() .setSubject("message 1 subject") .setBody("my <b>HTML</b> message", "html", StandardCharsets.UTF_8)), session); GetMessagesRequest request = GetMessagesRequest.builder() .ids(ImmutableList.of(message.getMessageId())) .build(); List<JmapResponse> result = testee.process(request, clientId, session).collect(Collectors.toList()); assertThat(result).hasSize(1) .extracting(JmapResponse::getResponse) .hasOnlyElementsOfType(GetMessagesResponse.class) .extracting(GetMessagesResponse.class::cast) .flatExtracting(GetMessagesResponse::list) .extracting(Message::getId, Message::getHtmlBody) .containsOnly(Tuple.tuple(message.getMessageId(), Optional.of("my <b>HTML</b> message"))); }
@Test public void processShouldReturnHeadersFieldWhenSpecificHeadersRequestedInPropertyList() throws Exception { MessageManager inbox = mailboxManager.getMailbox(inboxPath, session); ComposedMessageId message1 = inbox.appendMessage( AppendCommand.from( org.apache.james.mime4j.dom.Message.Builder.of() .setFrom("user@domain.tld") .setField(new RawField("header1", "Header1Content")) .setField(new RawField("HEADer2", "Header2Content")) .setSubject("message 1 subject") .setBody("my message", StandardCharsets.UTF_8)), session); GetMessagesRequest request = GetMessagesRequest.builder() .ids(ImmutableList.of(message1.getMessageId())) .properties(ImmutableList.of("headers.from", "headers.heADER2")) .build(); Set<MessageProperty> expected = Sets.newHashSet(MessageProperty.id, MessageProperty.headers); List<JmapResponse> result = testee.process(request, clientId, session).collect(Collectors.toList()); assertThat(result).hasSize(1); assertThat(result.get(0).getProperties()) .isEqualTo(Optional.of(expected)); }