Интеграция с Spring Mail - как преобразовать org.springframework.messaging.Message в javax.mail.inte rnet .MimeMessage - PullRequest
1 голос
/ 06 мая 2020

Я создаю службу, которая должна прослушивать и обрабатывать любые новые электронные письма, полученные в учетной записи электронной почты.

Проблема: Я не могу преобразовать сообщение, которое я получаю в метод handleMessageInternal(Message<?> message) в любую форму типа MimeMessage, с которым я могу работать, чтобы получить адреса / cc и / или любой вложенный файл.

Мой класс MailConfiguration:

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;

    }
}

Если возможно преобразовать сообщение в модель пользовательского домена, которая также будет работать.

Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 06 мая 2020

Чтобы получить доступ ко всему содержимому электронной почты, включая вложения, вам необходимо настроить autoCloseFolder(false), но не .headerMapper(mailHeaderMapper()).

См. Документы: https://docs.spring.io/spring-integration/docs/5.3.0.RC1/reference/html/mail.html#mail -mapping

Когда включено сопоставление сообщений, полезная нагрузка зависит от почтового сообщения и его реализации. Содержимое электронной почты обычно отображается DataHandler внутри MimeMessage.

А также здесь: https://docs.spring.io/spring-integration/docs/5.3.0.RC1/reference/html/mail.html#mail -inbound

Сохранение открытая папка полезна в тех случаях, когда связь с сервером необходима во время анализа составного содержимого электронного письма с вложениями.

Таким образом, message.getPayload() в вашем обработчике действительно может быть преобразовано в MimeMessage.

...