JavaMail 检查 GMail INBOX 连接和回复时间太长

JavaMail Check GMail INBOX is taking too long to connect and answer back

我有一个进程必须检查 GMail 上的收件箱是否有失败消息,它工作正常,除了连接和检查消息所需的时间问题,大约需要 1 分钟,时间太多了.

我的代码:

public static SendResult sendingSuccess(final String email) {
        SendResult result = new SendResult();
        try {
            Properties props = new Properties();
            props.setProperty("mail.store.protocol", "imaps");
            props.setProperty("mail.imap.com", "993");
            props.setProperty("mail.imap.connectiontimeout", "5000");
            props.setProperty("mail.imap.timeout", "5000");

            Session session = Session.getDefaultInstance(props);
            Store store = session.getStore("imaps");
            store.connect("imap.googlemail.com", 993, GMAIL_USER, GMAIL_PASSWORD);

            // Select and open folder
            Folder inbox = store.getFolder("INBOX");
            inbox.open(Folder.READ_WRITE);

            // What to search for
            SearchTerm searchTerm = new SearchTerm() {
                private static final long serialVersionUID = -7187666524976851520L;

                public boolean match(Message message) {
                    try {
                        String content = getContent(message);
                        boolean daemon = (message.getFrom()[0].toString()).contains("mailer-daemon@googlemail.com");
                        boolean failure = message.getSubject().contains("Failure");
                        boolean foundWarning = content.contains(email);
                        if (daemon && failure && foundWarning) {
                            return true;
                        }
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                    return false;
                }
            };

            // Fetch unseen messages from inbox folder
            Message[] messages = inbox.search(searchTerm);

            // If there is no message then it's OK
            result.setStatus(messages.length == 0);
            result.setMessage(result.isStatus() ? "No failure message found for " + email : "Failure message found for " + email);

            // Flag message as DELETED
            for (Message message : messages) {
                message.setFlag(Flags.Flag.DELETED, true);
            }

            // disconnect and close
            inbox.close(false);
            store.close();
        } catch (Exception ex) {
            result.setMessage(ex.getMessage());
            ex.printStackTrace();
        }
        return result;
    }

当我运行此代码查询失败消息时,需要 1 多分钟才能return结果给我。

======= Checking Gmail account for message failure! =====
Start...: 09:00:33
Finish..: 09:01:01
Result..: SendResult [status=true, message=No failure found for wrong.user@gmxexexex.net]

有什么办法可以减少这个时间吗?

问题很可能是因为您编写了自己的搜索词。 JavaMail 不知道如何将您的搜索词翻译成 IMAP SEARCH 请求,因此它在客户端执行搜索,这需要将所有邮件下载到客户端以在那里进行搜索。试试这个:

    SearchTerm searchTerm = new AndTerm(new SearchTerm[] {
            new FromStringTerm("mailer-daemon@googlemail.com"),
            new SubjectTerm("Failure"),
            new BodyTerm(email)
    });

这将允许 IMAP 服务器完成搜索。