Проверка JavaMail GMail INBOX занимает слишком много времени, чтобы подключиться и ответить - PullRequest
0 голосов
/ 10 мая 2018

У меня есть процесс, который должен проверить INBOX на 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 минуты, чтобы вернуть результат.

======= 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 голосов
/ 11 мая 2018

Проблема, скорее всего, связана с тем, что вы написали собственный поисковый запрос. JavaMail не знает, как преобразовать ваш поисковый запрос в запрос IMAP SEARCH, поэтому он выполняет поиск на клиенте, что требует загрузки всех сообщений на клиент для поиска там. Попробуйте вместо этого:

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

Это позволит выполнять поиск по серверу IMAP.

...