private Optional<Mailbox> getAddressForHeader(Message originalMessage, String fieldName) { return Optional.ofNullable(originalMessage.getHeader() .getFields(fieldName)) .orElse(ImmutableList.of()) .stream() .map(field -> AddressListFieldLenientImpl.PARSER.parse(field, new DecodeMonitor())) .findFirst() .map(AddressListField::getAddressList) .map(AddressList::flatten) .map(MailboxList::stream) .orElse(Stream.of()) .findFirst(); }
/** * @see org.apache.james.jdkim.api.Headers#getFields() */ public List<String> getFields() { List<Field> res = message.getHeader().getFields(); return convertFields(res); }
private String getHeader(org.apache.james.mime4j.dom.Message message, String header) { Field field = message.getHeader().getField(header); if (field == null) { return null; } return field.getBody(); }
/** * @see org.apache.james.jdkim.api.Headers#getFields(java.lang.String) */ public List<String> getFields(final String name) { return convertFields(message.getHeader().getFields(name)); }
/** * Creates a new <code>Message</code> from the specified * <code>Message</code>. The <code>Message</code> instance is * initialized with copies of header and body of the specified * <code>Message</code>. The parent entity of the new message is * <code>null</code>. * * @param other * message to copy. * @throws UnsupportedOperationException * if <code>other</code> contains a {@link SingleBody} that * does not support the {@link SingleBody#copy() copy()} * operation. * @throws IllegalArgumentException * if <code>other</code> contains a <code>Body</code> that * is neither a {@link MessageImpl}, {@link Multipart} or * {@link SingleBody}. */ public Message copy(Message other) { MessageImpl copy = newMessageImpl(); if (other.getHeader() != null) { copy.setHeader(copy(other.getHeader())); } if (other.getBody() != null) { copy.setBody(copy(other.getBody())); } return copy; }
@Test public void convertToMimeShouldFilterWhiteSpacesOnlyHeaderNames() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); CreationMessage messageHavingInReplyTo = CreationMessage.builder() .from(DraftEmailer.builder().name("joe").build()) .headers(ImmutableMap.of(" ", "only spaces header name values")) .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.getHeader().getFields(" ")).isEmpty(); assertThat(result.getHeader().getFields("")).isEmpty(); }
@Test public void convertToMimeShouldGenerateMessageIdContainingSenderDomain() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); CreationMessage message = CreationMessage.builder() .from(DraftEmailer.builder().email("email@domain.com").build()) .mailboxIds(ImmutableList.of("dead-beef-1337")) .subject("subject") .build(); // When Message result = sut.convertToMime(new ValueWithId.CreationMessageEntry( CreationMessageId.of("user|mailbox|1"), message), ImmutableList.of()); // Then assertThat(result.getHeader().getFields("Message-ID")).hasSize(1); assertThat(result.getHeader().getFields("Message-ID").get(0).getBody()) .contains("@domain.com"); }
@Test public void convertToMimeShouldFilterEmptyHeaderNames() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); CreationMessage messageHavingInReplyTo = CreationMessage.builder() .from(DraftEmailer.builder().name("joe").build()) .headers(ImmutableMap.of("", "empty header name 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.getHeader().getFields("")).isEmpty(); }
@Test public void convertToMimeShouldGenerateMessageId() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); CreationMessage message = CreationMessage.builder() .mailboxIds(ImmutableList.of("dead-beef-1337")) .subject("subject") .build(); // When Message result = sut.convertToMime(new ValueWithId.CreationMessageEntry( CreationMessageId.of("user|mailbox|1"), message), ImmutableList.of()); // Then assertThat(result.getHeader().getFields("Message-ID")).extracting(Field::getBody) .isNotNull(); }
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 public void convertToMimeShouldAddHeadersWhenProvided() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); CreationMessage messageHavingInReplyTo = CreationMessage.builder() .from(DraftEmailer.builder().name("sender").build()) .headers(ImmutableMap.of("FIRST", "first value", "SECOND", "second 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.getHeader().getFields("FIRST")).extracting(Field::getBody) .containsOnly("first value"); assertThat(result.getHeader().getFields("SECOND")).extracting(Field::getBody) .containsOnly("second value"); }
@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>"); }
@Test public void convertToMimeShouldAddMultivaluedHeadersWhenProvided() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); CreationMessage messageHavingInReplyTo = CreationMessage.builder() .from(DraftEmailer.builder().name("sender").build()) .headers(ImmutableMap.of("FIRST", "first value\nsecond 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.getHeader().getFields("FIRST")).extracting(Field::getBody) .containsOnly("first value", "second value"); }
@Test public void convertToMimeShouldAddHeaderWhenProvided() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); CreationMessage messageHavingInReplyTo = CreationMessage.builder() .from(DraftEmailer.builder().name("sender").build()) .headers(ImmutableMap.of("FIRST", "first 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.getHeader().getFields("FIRST")).extracting(Field::getBody) .containsOnly("first value"); }
@Test public void convertToMimeShouldGenerateMessageIdWhenSenderWithoutDomain() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); CreationMessage message = CreationMessage.builder() .from(DraftEmailer.builder().email("sender").build()) .mailboxIds(ImmutableList.of("dead-beef-1337")) .subject("subject") .build(); // When Message result = sut.convertToMime(new ValueWithId.CreationMessageEntry( CreationMessageId.of("user|mailbox|1"), message), ImmutableList.of()); // Then assertThat(result.getHeader().getFields("Message-ID")).extracting(Field::getBody) .isNotNull(); }
@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 convertToMimeShouldAddInReplyToHeaderWhenProvided() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); String matchingMessageId = "unique-message-id"; CreationMessage messageHavingInReplyTo = CreationMessage.builder() .from(DraftEmailer.builder().name("sender").build()) .inReplyToMessageId(matchingMessageId) .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.getHeader().getFields("In-Reply-To")).extracting(Field::getBody) .containsOnly(matchingMessageId); }
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; }
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(); }