Spring MVC 通过IMAPS异步阅读电子邮件时无法请求Spring-Boot的API

k4emjkb1  于 2023-08-06  发布在  Spring
关注(0)|答案(2)|浏览(107)

以下情况。我有一个Spring-Boot应用程序,它处理两个主要功能。
1.通过IMAPS从服务器异步阅读电子邮件。(配置见下文)
1.提供生成和阅读order的API(这是我的业务对象)
问题是好奇的。如果我启动我的应用程序没有连接到IMAP和阅读电子邮件,我可以向我的API发出任何请求。但是在启动电子邮件连接和阅读电子邮件的情况下,我无法向我的API发出任何请求。
我总是收到以下错误:

Error: connect ECONNREFUSED 127.0.0.1:8081

字符串
有没有人可以帮助我,给予我一个建议,如何处理这个问题?

// Email Connection
        Store store = null;
        var props = new Properties();
        props.setProperty("mail.store.protocol", mailProperties.getProtocol());
        try {
            var session = Session.getInstance(props, null);
            store = session.getStore();
            store.connect(
                    mailProperties.getHost(),
                    mailProperties.getUsername(),
                    decodeAsString(mailProperties.getPassword())
            );
            var inbox = store.getFolder("INBOX");
            inbox.open(Folder.READ_WRITE);
            waitForNewMessages(inbox);
       ...

       inbox.addMessageCountListener(new MessageCountAdapter() {
            @Override
            @SneakyThrows
            public void messagesAdded(MessageCountEvent ev) {
                for (Message message : ev.getMessages()) {
                    log.info("Message received subject={}, from={}", message.getSubject(), message.getFrom());
                    emailMessageHandler.handle(message);
                }
            }
        });
       ...

    private void waitForNewMessages(Folder inbox) throws MessagingException {
        while (inbox.isOpen()) {
            //every 25 minutes poke the server with a inbox.getMessageCount() to keep the connection active/open
            var scheduler = Executors.newScheduledThreadPool(1);
            final Runnable pokeInbox = () -> {
                try {
                    inbox.getMessageCount();
                } catch (MessagingException ex) {
                    //nothing doin'
                }
            };
            scheduler.schedule(pokeInbox, 25, TimeUnit.MINUTES);
            ((IMAPFolder) inbox).idle();
        }
    }

swvgeqrz

swvgeqrz1#

在研究了整个www之后,我发现了以下解决方案IdleManager。IdleManager使用ExecutorService监听来自SMTP服务器的所有事件,并且不会阻止Web应用程序接收其他传入请求。
要取得联系和更多信息,您可以查看以下文档。IdleManager

huwehgph

huwehgph2#

提供关于上述问题的更多细节:
要通过IMAP协议在Sping Boot 应用程序中监视/读取传入的电子邮件:
1.我们可以使用提供IMAP实现的JavaMail API。
1.我们需要一个支持IMAP IDLE功能的电子邮件服务器,IMAP IDLE允许我们的应用程序在新邮件到达邮箱时立即接收通知,而不是依赖于定期轮询。
请参阅此处的详细实现:https://medium.com/@sushant7/how-to-monitor-incoming-emails-in-a-spring-boot-application-indefinitely-7dabbdb74b2d

相关问题