我正在尝试从 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/