JavaMail检查GMail INBOX需要很长时间才能连接并回复

时间:2018-05-10 12:46:38

标签: javamail gmail-api

我有一个进程必须检查GMail上的INBOX是否有失败消息,除了连接和检查消息所花费的时间问题外,它的工作时间大约需要1分钟,这是太多时间了。 / p>

我的代码:

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分钟以上。

======= 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]

有没有办法减少这个时间?

1 个答案:

答案 0 :(得分:1)

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

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

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