Dear Camel user list,

I have such route:
{code}
import java.util.Map;
import java.util.UUID;

import javax.mail.internet.MimeMessage;

import org.apache.camel.Attachment;
import org.apache.camel.CamelContext;
import org.apache.camel.EndpointInject;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;
import org.apache.camel.RoutesBuilder;
import org.apache.camel.builder.AdviceWithRouteBuilder;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.apache.http.client.utils.URIBuilder;
import org.junit.Test;

public class EmailRouteTest extends CamelTestSupport {

  protected static final String HOST = "<SET_ME>";
  protected static final String LOGIN = "<SET_ME>";
  protected static final String PASSWORD = "<SET_ME>";

  protected static final String ROUTE_ID = UUID.randomUUID().toString();

  @EndpointInject(uri = "mock:email")
  private MockEndpoint mockEndpoint;

  @Override
  protected RoutesBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {

      @Override
      public void configure() throws Exception {
        final String routeUri = new URIBuilder()
            .setScheme("imaps")
            .setHost(HOST)
            .setPort(993)
            .addParameter("username", LOGIN)
            .addParameter("password", PASSWORD)
            .addParameter("debugMode", "false")
            .addParameter("delete", "false")
            .addParameter("unseen", "true")
            .addParameter("consumer.delay", "600000")
            .addParameter("contentType", "text/html")
            .addParameter("mapMailMessage", "true") //<-- change this
            .toString();

        from(routeUri)
          .id(ROUTE_ID)
          .marshal().mimeMultipart()
          .process(new Processor() {

            @Override
            public void process(final Exchange exchange) throws Exception {
              final Message in = exchange.getIn();
              final String contentType =
exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class);
              final String stringBody = in.getBody(String.class);
              final Map<String, Attachment> attachmentObjects =
in.getAttachmentObjects();

              //Uncomment for mapMailMessage=true
              final MimeMessage message = in.getBody(MimeMessage.class);

              //Uncomment for mapMailMessage=false
//              javax.mail.Message message =
in.getBody(javax.mail.Message.class);

              System.out.println("----");
              System.out.println(String.format("Body Content-Type: %s",
contentType));
              System.out.println(String.format("String Body:\n%s",
stringBody));
              System.out.println(String.format("Body:\n%s", message));
              System.out.println(String.format("Attachments:\n%s",
attachmentObjects));
              System.out.println("----");

              assertNotNull(message);
            }
          });
      }
    };
  }

  @Override
  public void setUp() throws Exception {
    super.setUp();
    final CamelContext camelContext = context();
    camelContext.getRouteDefinition(ROUTE_ID)
      .adviceWith(camelContext, new AdviceWithRouteBuilder() {
        @Override
        public void configure() throws Exception {
          weaveAddLast()
            .to(mockEndpoint);
        }
      });
    camelContext.start();
  }

  @Override
  public boolean isUseAdviceWith() {
    return true;
  }

  @Test
  public void shouldConvertToMailMessage() throws Exception {
    mockEndpoint.expectedMessageCount(1);
//    mockEndpoint.expectedMessagesMatches(ex -> ex.getIn().getBody()
instanceof javax.mail.Message);
    mockEndpoint.assertIsSatisfied();
  }
}
{code}

When `mapMailMessage` is set to `true`, no matter what I do, I can't get
text/html part.

`final String stringBody = in.getBody(String.class);` gives text/plain part
of the message, while `final MimeMessage mimeMessage =
in.getBody(MimeMessage.class);` and `final MimeMultipart message =
in.getBody(MimeMultipart.class);` both return null.

When `mapMailMessage` is set to `false`
`javax.mail.Message message = in.getBody(javax.mail.Message.class);` also
returns null.

Is there any possibility to map HTML part of the email to some Camel
Message ?

Kind regards,
Kamil

Reply via email to