我正在创建一项服务,该服务需要监听和处理邮件帐户中收到的任何新电子邮件。
问题:我无法转换我在 handleMessageInternal(Message<?> message)
中收到的消息方法转换为任何形式的 MimeMessage 类型,我可以使用它来获取收件人/抄送地址和/或任何附加文件。
我的邮件配置类:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.dsl.IntegrationFlow;
import org.springframework.integration.dsl.IntegrationFlows;
import org.springframework.integration.mail.dsl.Mail;
import org.springframework.integration.mail.support.DefaultMailHeaderMapper;
import org.springframework.integration.mapping.HeaderMapper;
import org.springframework.integration.scheduling.PollerMetadata;
import org.springframework.scheduling.support.PeriodicTrigger;
import javax.mail.internet.MimeMessage;
@Configuration
public class MailConfiguration {
@Bean
public IntegrationFlow imapMailFlow() {
return IntegrationFlows
.from(Mail.imapInboundAdapter("imaps://username:pass123@imap.gmail.com:" + 993 + "/INBOX")
.javaMailProperties(p -> p.put("mail.debug", "true"))
.headerMapper(mailHeaderMapper()),
e -> e.autoStartup(true).poller(p -> p.fixedDelay(5000)))
.handle(new MailHandler())
.get();
}
@Bean
public HeaderMapper<MimeMessage> mailHeaderMapper() {
return new DefaultMailHeaderMapper();
}
@Bean(name = PollerMetadata.DEFAULT_POLLER)
public PollerMetadata defaultPoller() {
PollerMetadata pollerMetadata = new PollerMetadata();
pollerMetadata.setTrigger(new PeriodicTrigger(1000));
return pollerMetadata;
}
}
我的 MailHandler 类:
import org.springframework.integration.handler.AbstractMessageHandler;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;
import javax.mail.internet.MimeMessage;
@Component
public class MailHandler extends AbstractMessageHandler {
@Override
protected void handleMessageInternal(Message<?> message) {
System.out.println("RECEIVED NEW MAIL");
//Doesnt Work
MimeMessage mimeMessage = (MimeMessage) message.getPayload();
//Doesnt Work
MimeMessage mimeMessage = (MimeMessage) message;
}
}
如果可以将消息转换为也可以工作的自定义域模型。
如有任何帮助,我们将不胜感激。
最佳答案
要访问包括附件在内的所有电子邮件内容,您需要配置 autoCloseFolder(false)
并且不应配置 .headerMapper(mailHeaderMapper())
。
参见文档:https://docs.spring.io/spring-integration/docs/5.3.0.RC1/reference/html/mail.html#mail-mapping
When message mapping is enabled, the payload depends on the mail message and its implementation. Email contents are usually rendered by a
DataHandler
within theMimeMessage
.
还有这里:https://docs.spring.io/spring-integration/docs/5.3.0.RC1/reference/html/mail.html#mail-inbound
Keeping the folder open is useful in cases where communication with the server is needed during parsing multipart content of the email with attachments.
这样,您的处理程序中的 message.getPayload()
确实可以转换为 MimeMessage
。
关于java - Spring Mail Integration - 我如何将 org.springframework.messaging.Message 转换为 javax.mail.internet.MimeMessage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61633684/