public static Envelope fromMime4JMessage(org.apache.james.mime4j.dom.Message mime4JMessage) { MailAddress sender = mime4JMessage.getFrom() .stream() .findAny() .map(Mailbox::getAddress) .map(Throwing.function(MailAddress::new)) .orElseThrow(() -> new RuntimeException("Sender is mandatory")); Stream<MailAddress> to = emailersToMailAddresses(mime4JMessage.getTo()); Stream<MailAddress> cc = emailersToMailAddresses(mime4JMessage.getCc()); Stream<MailAddress> bcc = emailersToMailAddresses(mime4JMessage.getBcc()); return new Envelope(sender, StreamUtils.flatten(Stream.of(to, cc, bcc)) .collect(Guavate.toImmutableSet())); }
@Test public void convertToMimeShouldSetBothFromAndSenderHeaders() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); String joesEmail = "joe@example.com"; CreationMessage testMessage = CreationMessage.builder() .mailboxIds(ImmutableList.of("deadbeef-dead-beef-dead-beef")) .subject("subject") .from(DraftEmailer.builder().email(joesEmail).name("joe").build()) .build(); // When Message result = sut.convertToMime(new ValueWithId.CreationMessageEntry( CreationMessageId.of("user|mailbox|1"), testMessage), ImmutableList.of()); // Then assertThat(result.getFrom()).extracting(Mailbox::getAddress).allMatch(f -> f.equals(joesEmail)); assertThat(result.getSender().getAddress()).isEqualTo(joesEmail); }
private HeaderImpl buildTextHeaders(MailboxMessage message) throws IOException, MimeIOException { DefaultMessageBuilder defaultMessageBuilder = new DefaultMessageBuilder(); defaultMessageBuilder.setMimeEntityConfig(MimeConfig.PERMISSIVE); Message headersMessage = defaultMessageBuilder .parseMessage(message.getHeaderContent()); HeaderImpl headerImpl = new HeaderImpl(); addFrom(headerImpl, headersMessage.getFrom()); addAddressList(headerImpl, headersMessage.getTo()); addAddressList(headerImpl, headersMessage.getCc()); addAddressList(headerImpl, headersMessage.getBcc()); headerImpl.addField(Fields.subject(headersMessage.getSubject())); return headerImpl; }
@Test public void convertToMimeShouldFilterGeneratedHeadersWhenProvided() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); String joesEmail = "joe@example.com"; CreationMessage messageHavingInReplyTo = CreationMessage.builder() .from(DraftEmailer.builder().email(joesEmail).name("joe").build()) .headers(ImmutableMap.of("From", "hacker@example.com", "VALID", "valid header value")) .mailboxIds(ImmutableList.of("dead-beef-1337")) .subject("subject") .build(); // When Message result = sut.convertToMime(new ValueWithId.CreationMessageEntry( CreationMessageId.of("user|mailbox|1"), messageHavingInReplyTo), ImmutableList.of()); // Then assertThat(result.getFrom()).extracting(Mailbox::getAddress) .allMatch(f -> f.equals(joesEmail)); assertThat(result.getHeader().getFields("VALID")).extracting(Field::getBody) .containsOnly("valid header value"); assertThat(result.getHeader().getFields("From")).extracting(Field::getBody) .containsOnly("joe <joe@example.com>"); }
@Test public void convertToMimeShouldFilterGeneratedHeadersRegardlessOfCaseWhenProvided() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); String joesEmail = "joe@example.com"; CreationMessage messageHavingInReplyTo = CreationMessage.builder() .from(DraftEmailer.builder().email(joesEmail).name("joe").build()) .headers(ImmutableMap.of("frOM", "hacker@example.com", "VALID", "valid header value")) .mailboxIds(ImmutableList.of("dead-beef-1337")) .subject("subject") .build(); // When Message result = sut.convertToMime(new ValueWithId.CreationMessageEntry( CreationMessageId.of("user|mailbox|1"), messageHavingInReplyTo), ImmutableList.of()); // Then assertThat(result.getFrom()).extracting(Mailbox::getAddress) .allMatch(f -> f.equals(joesEmail)); assertThat(result.getHeader().getFields("VALID")).extracting(Field::getBody) .containsOnly("valid header value"); assertThat(result.getHeader().getFields("From")).extracting(Field::getBody) .containsOnly("joe <joe@example.com>"); }
public Message fromMetaDataWithContent(MetaDataWithContent message) throws MailboxException { org.apache.james.mime4j.dom.Message mimeMessage = parse(message); MessageContent messageContent = extractContent(mimeMessage); Optional<String> htmlBody = messageContent.getHtmlBody(); Optional<String> mainTextContent = mainTextContent(messageContent); Optional<String> textBody = computeTextBodyIfNeeded(messageContent, mainTextContent); String preview = messagePreview.compute(mainTextContent); return Message.builder() .id(message.getMessageId()) .blobId(BlobId.of(blobManager.toBlobId(message.getMessageId()))) .threadId(message.getMessageId().serialize()) .mailboxIds(message.getMailboxIds()) .inReplyToMessageId(getHeader(mimeMessage, "in-reply-to")) .keywords(message.getKeywords()) .subject(Strings.nullToEmpty(mimeMessage.getSubject()).trim()) .headers(toMap(mimeMessage.getHeader().getFields())) .from(firstFromMailboxList(mimeMessage.getFrom())) .to(fromAddressList(mimeMessage.getTo())) .cc(fromAddressList(mimeMessage.getCc())) .bcc(fromAddressList(mimeMessage.getBcc())) .replyTo(fromAddressList(mimeMessage.getReplyTo())) .size(message.getSize()) .date(getDateFromHeaderOrInternalDateOtherwise(mimeMessage, message)) .textBody(textBody) .htmlBody(htmlBody) .preview(preview) .attachments(getAttachments(message.getAttachments())) .build(); }