Search in sources :

Example 11 with AndTerm

use of javax.mail.search.AndTerm in project spring-integration by spring-projects.

the class ImapMailReceiverTests method testIdleWithServerCustomSearch.

@Test
public void testIdleWithServerCustomSearch() throws Exception {
    ImapMailReceiver receiver = new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort() + "/INBOX");
    receiver.setSearchTermStrategy((supportedFlags, folder) -> {
        try {
            FromTerm fromTerm = new FromTerm(new InternetAddress("bar@baz"));
            return new AndTerm(fromTerm, new FlagTerm(new Flags(Flag.SEEN), false));
        } catch (AddressException e) {
            throw new RuntimeException(e);
        }
    });
    testIdleWithServerGuts(receiver, false);
}
Also used : AndTerm(javax.mail.search.AndTerm) InternetAddress(javax.mail.internet.InternetAddress) FlagTerm(javax.mail.search.FlagTerm) AddressException(javax.mail.internet.AddressException) Flags(javax.mail.Flags) FromTerm(javax.mail.search.FromTerm) LongRunningIntegrationTest(org.springframework.integration.test.support.LongRunningIntegrationTest) Test(org.junit.Test)

Example 12 with AndTerm

use of javax.mail.search.AndTerm in project opentest by mcdcorp.

the class ReadEmailImap method run.

@Override
public void run() {
    super.run();
    final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DATE_TIME_FORMAT);
    String defaultSentAfterTime = LocalDateTime.now().minusDays(365).format(dateTimeFormatter);
    String imapServer = this.readStringArgument("server");
    Integer port = this.readIntArgument("port", null);
    String subjectContains = this.readStringArgument("subjectContains", this.readStringArgument("subject", null));
    Pattern subjectRegex = this.readRegexArgument("subjectRegex", null);
    String bodyContains = this.readStringArgument("bodyContains", null);
    Pattern bodyRegex = this.readRegexArgument("bodyRegex", null);
    String fromAddress = this.readStringArgument("from", null);
    String sentAfter = this.readStringArgument("sentAfter", defaultSentAfterTime);
    String userName = this.readStringArgument("userName");
    String password = this.readStringArgument("password");
    Integer maxResults = this.readIntArgument("maxResults", 1);
    Integer minResults = this.readIntArgument("minResults", 1);
    LocalDateTime sentAfterDate = LocalDateTime.parse(sentAfter, dateTimeFormatter);
    ZonedDateTime sentAfterZonedDate = ZonedDateTime.of(sentAfterDate, ZoneId.systemDefault());
    Folder inbox = null;
    Store store = null;
    try {
        Session session = Session.getDefaultInstance(System.getProperties());
        store = session.getStore("imaps");
        if (port == null) {
            store.connect(imapServer, userName, password);
        } else {
            store.connect(imapServer, port, userName, password);
        }
        inbox = store.getFolder("Inbox");
        inbox.open(Folder.READ_ONLY);
        SentDateTerm sentDateTerm = new SentDateTerm(ComparisonTerm.GE, Date.from(sentAfterZonedDate.toInstant()));
        SearchTerm searchTerm = sentDateTerm;
        if (subjectContains != null) {
            SubjectTerm subjectTerm = new SubjectTerm(subjectContains);
            searchTerm = new AndTerm(searchTerm, subjectTerm);
        }
        if (bodyContains != null) {
            BodyTerm bodyTerm = new BodyTerm(bodyContains);
            searchTerm = new AndTerm(searchTerm, bodyTerm);
        }
        if (fromAddress != null) {
            FromStringTerm fromTerm = new FromStringTerm(fromAddress);
            searchTerm = new AndTerm(searchTerm, fromTerm);
        }
        List<Message> allMessages = Arrays.asList(inbox.search(searchTerm));
        int resultsIndex = 0;
        ArrayList<HashMap<String, String>> resultMessages = new ArrayList<>();
        while (resultMessages.size() < maxResults) {
            resultsIndex++;
            if (resultsIndex > allMessages.size()) {
                break;
            }
            Message currentMessage = allMessages.get(allMessages.size() - resultsIndex);
            // Make sure the sent date and time is after the specified
            // one. Since javax.mail only takes the date into consideration
            // and ignores the time, we might end up with messages sent earlier
            // than the time specified, so we must check this ourselves
            boolean sentDateIsInRange = currentMessage.getSentDate().after(Date.from(sentAfterZonedDate.toInstant()));
            if (!sentDateIsInRange) {
                continue;
            }
            String subject = currentMessage.getSubject();
            if (subjectRegex != null && !subjectRegex.matcher(subject).find()) {
                continue;
            }
            String body = this.getTextFromMessage(currentMessage);
            if (bodyRegex != null && !bodyRegex.matcher(body).find()) {
                continue;
            }
            HashMap resultMessage = new HashMap<>();
            resultMessage.put("subject", subject);
            resultMessage.put("body", body);
            resultMessage.put("from", getEmailAddresses(currentMessage.getFrom()));
            resultMessage.put("to", getEmailAddresses(currentMessage.getAllRecipients()));
            LocalDateTime sentDate = LocalDateTime.ofInstant(currentMessage.getSentDate().toInstant(), ZoneId.systemDefault());
            resultMessage.put("sentDate", sentDate.format(dateTimeFormatter));
            HashMap<String, String> headers = new HashMap<>();
            Enumeration headersIterator = currentMessage.getAllHeaders();
            while (headersIterator.hasMoreElements()) {
                Header header = (Header) headersIterator.nextElement();
                headers.put(header.getName(), header.getValue());
            }
            resultMessage.put("headers", headers);
            resultMessages.add(resultMessage);
        }
        if (resultMessages.size() < minResults) {
            throw new RuntimeException(String.format("We were expecting to find at least %s email message(s) matching the " + "given criteria, but we found %s. You can set the minimum number " + "of messages expected by using the \"minResults\" argument.", minResults, resultMessages.size()));
        } else {
            Logger.info(String.format("We found %s email message(s) matching the given criteria", resultMessages.size()));
        }
        this.writeOutput("emails", ScriptUtils.wrapArray(resultMessages.toArray()));
        // Write the details of the most recent message again, to
        // dedicated output values. These three output values will be
        // deprecated and are only populated for backward compatibility.
        HashMap mostRecentMessage = resultMessages.get(0);
        this.writeOutput("subject", mostRecentMessage.get("subject"));
        this.writeOutput("body", mostRecentMessage.get("body"));
        this.writeOutput("from", mostRecentMessage.get("from"));
    } catch (Exception ex) {
        throw new RuntimeException(String.format("Failed to read emails from server %s", imapServer), ex);
    } finally {
        try {
            if (inbox != null) {
                inbox.close(true);
            }
            if (store != null) {
                store.close();
            }
        } catch (MessagingException ex) {
            Logger.error("Failed to close the email store and/or folder", ex);
        }
    }
}
Also used : LocalDateTime(java.time.LocalDateTime) Message(javax.mail.Message) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) Store(javax.mail.Store) SentDateTerm(javax.mail.search.SentDateTerm) Folder(javax.mail.Folder) AndTerm(javax.mail.search.AndTerm) ZonedDateTime(java.time.ZonedDateTime) BodyTerm(javax.mail.search.BodyTerm) Pattern(java.util.regex.Pattern) Enumeration(java.util.Enumeration) MessagingException(javax.mail.MessagingException) SearchTerm(javax.mail.search.SearchTerm) SubjectTerm(javax.mail.search.SubjectTerm) MessagingException(javax.mail.MessagingException) FromStringTerm(javax.mail.search.FromStringTerm) Header(javax.mail.Header) DateTimeFormatter(java.time.format.DateTimeFormatter) Session(javax.mail.Session)

Aggregations

AndTerm (javax.mail.search.AndTerm)12 SearchTerm (javax.mail.search.SearchTerm)11 FromStringTerm (javax.mail.search.FromStringTerm)7 SubjectTerm (javax.mail.search.SubjectTerm)7 Test (org.junit.Test)6 InternetAddress (javax.mail.internet.InternetAddress)5 URISyntaxException (java.net.URISyntaxException)3 DateFormat (java.text.DateFormat)3 ParseException (java.text.ParseException)3 SimpleDateFormat (java.text.SimpleDateFormat)3 Flags (javax.mail.Flags)3 Folder (javax.mail.Folder)3 MimeMessage (javax.mail.internet.MimeMessage)3 FlagTerm (javax.mail.search.FlagTerm)3 Message (javax.mail.Message)2 MessagingException (javax.mail.MessagingException)2 Session (javax.mail.Session)2 Store (javax.mail.Store)2 FromTerm (javax.mail.search.FromTerm)2 NotTerm (javax.mail.search.NotTerm)2