java - 使用 Spring Boot 和 Spring 集成进行异步邮件接收

标签 java spring spring-boot spring-integration jakarta-mail

我正在尝试从 gmail 服务器接收电子邮件,然后以某种方式处理它们。因此,每次新电子邮件到达邮件服务器时,我的应用程序都应该下载它并处理它,这意味着异步调用其他服务,这些服务将被注册为监听器。

我对 Spring 集成还很陌生,我不完全理解它是如何工作的或者它是否正确。

1) 到目前为止,我有这段代码——我可以阅读所有电子邮件,但我不确定它们是否异步处理,或者是否是正确的方式?

ListeningExample 类

@Configuration
public class ListeningExample {

    @Bean
    public HeaderMapper<MimeMessage> mailHeaderMapper() {
        return new DefaultMailHeaderMapper();
    }

    @Bean
    public IntegrationFlow imapMailFlow() {    
        IntegrationFlow flow =  IntegrationFlows
                .from(Mail.imapInboundAdapter("imap://user:pwd@imap.gmail.com/INBOX")
                                .userFlag("testSIUserFlag")
                                .javaMailProperties(javaMailProperties()),
                        e -> e.autoStartup(true)
                                .poller(p -> p.fixedDelay(5000)))dostane to detailni zpravy
                .transform(Mail.toStringTransformer())
                .channel(MessageChannels.queue("imapChannel"))
                .get();
        return flow;
     }

    @Bean(name = PollerMetadata.DEFAULT_POLLER)
    public PollerMetadata defaultPoller() {

        PollerMetadata pollerMetadata = new PollerMetadata();
        pollerMetadata.setTrigger(new PeriodicTrigger(1000));
        return pollerMetadata;
    }
}

MailRecieverService 类

@Service
public class MailRecieverService {

    private List<EmailAction> services;

    @Bean
    @ServiceActivator(inputChannel = "imapChannel")
    public MessageHandler processNewEmail() {
        MessageHandler messageHandler = new MessageHandler() {

            @Override
            public void handleMessage(org.springframework.messaging.Message<?> message) throws MessagingException {
                System.out.println("New email:" + message.toString());

                //Processing emails do with them something..
                for (EmailAction emailAction : services) {
                    emailAction.performAction(null);
                }

            }
        };
        return messageHandler;
    }

}

主类

@SpringBootApplication
@EnableIntegration
public class Main extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Main.class);
    }


    public static void main(String[] args) throws Exception {
        SpringApplicationBuilder builder = new SpringApplicationBuilder(Main.class);
        builder.headless(false).run(args);
    }

}

2) Spring Boot 中是否还可以移动/删除电子邮件、创建文件夹以及使用电子邮件帐户执行其他操作,还是我必须自己使用 javax.mail 库? 如果是,您能提供一些例子吗?

最佳答案

您的集成流程是正确的。 IMAP 入站 channel 适配器本质上是异步的,它会生成一个线程来循环新电子邮件。但是,如果您担心您的 for (EmailAction emailAction : services) {,那么您需要考虑自己将这部分设为异步。您绝对可以使用带有 Executor 和这些服务的多个订阅者的 PublishSubscribeChannel 来真正并行处理这些服务中的同一电子邮件。

有关删除、创建和其他电子邮件管理操作的所有其他内容均超出了企业集成模式的范围。因此,没有任何高级 Spring API 可以从应用程序执行这些操作。考虑直接使用Java Mail API:https://javaee.github.io/javamail/#Project_Documentation

关于java - 使用 Spring Boot 和 Spring 集成进行异步邮件接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59712461/

相关文章:

java - spring 单例作用域——每个容器每个 bean

java - 我试图将图像保存在我的内部存储器中,文件已保存,但它如何损坏

java - 如何读取 Google App Engine (JAVA) 中的文件

java - 使用 java 和 servlet、JSP 时出现错误 http 400

Spring 集成 - 多入站适配器不起作用

java - Spring Data JpaRepository "JOIN FETCH"返回重复项

java - @valid 注释未按预期工作

forms - Spring 形式 :options tag with enum

java - Spring Boot 自动配置顺序

java - Spring-Boot @Scheduled Cron 表达式在两个任务之间稍微延迟?