如何使用spring集成正确获取入站邮件头

时间:2016-07-18 19:44:23

标签: java spring spring-integration javamail

我正在接收带有spring的电子邮件,到目前为止还有一个非常基本的脚本

ApplicationContext ac = new ClassPathXmlApplicationContext("imap.xml");
DirectChannel inputChannel = ac.getBean("receiveChannel", DirectChannel.class);
inputChannel.subscribe(message -> {
    System.out.println(message.getHeaders());
    System.out.println(message.getPayload());

    MessageHeaders headers = message.getHeaders();
    String from = (String) headers.get("mail_from");
});

根据documentation,我认为标题会自动解析,但我用第一个System.out.println();得到的标题只是

{id=c65f55aa-c611-71ee-c56d-6bf13c6f71d0, timestamp=1468869891279}

第二个输出(getPayload())是

org.springframework.integration.mail.AbstractMailReceiver$IntegrationMimeMessage@6af5615d

from输出null ...

然后我尝试使用MailToStringTransformer

MailToStringTransformer a = transformer();
    a.setCharset("utf-8");
System.out.println(a.transform(message));

哪个输出有效负载和我期望的所有头,但(自然地)作为String。

如何在对象中获取邮件标题和文​​本?

1 个答案:

答案 0 :(得分:1)

不确定您所引用的文档,但当前的4.3版本具有以下内容:

  

默认情况下,入站适配器生成的消息的有效负载是原始MimeMessage;您可以使用该对象查询标题和内容。从版本4.3开始,您可以提供HeaderMapper<MimeMessage>来将标头映射到MessageHeaders;为方便起见,为此提供了DefaultMailHeaderMapper

还有一点:

  

如果不提供标头映射器,则消息有效负载是javax.mail提供的MimeMessage。该框架提供了MailToStringTransformer ...

如果您需要对地图进行自定义,则始终可以提供自己的HeaderMapper<MimeMessage>实施或DefaultMailHeaderMapper扩展。