Using JavaMail to Search GMail With IMAP
Enable IMAP in GMail
- Log into your GMail account and go to Settings
- Switch to tab “Forwarding and POP/IMAP”
- Select Enable IMAP
- Set Folder size limits to Limit IMAP folders to contain no more than this many messages 1,000
Less secure app access
- Go to https://myaccount.google.com/lesssecureapps?pli=1
- Turn on Allow less secure apps if this is not turned on, we will get following exception
javax.mail.AuthenticationFailedException: [AUTHENTICATIONFAILED] Invalid credentials (Failure)
	at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:732)
	at javax.mail.Service.connect(Service.java:366)
	at javax.mail.Service.connect(Service.java:246)
Connect to email account
        Properties props = new Properties();
        props.setProperty("mail.store.protocol", "imaps");
        Session session = Session.getInstance(props, null);
        Store store = session.getStore();
        store.connect("imap.gmail.com", <username>, <password>);
        Folder inbox = store.getFolder("INBOX");
        inbox.open(Folder.READ_ONLY);
Multiple Term Search
Search criteria are expressed with search terms, such as SubjectTerm, BodyTerm,FlagTerm etc, with help of logical search terms, more complicated search criteria can be implemented.
        SearchTerm[] srchTerms = new SearchTerm[4];
        srchTerms[0] = new SubjectTerm(subject);
        srchTerms[1] = new BodyTerm(body);
        srchTerms[2] = new FlagTerm(new Flags(Flags.Flag.SEEN), seen);
        srchTerms[3] = new FlagTerm(new Flags(Flags.Flag.RECENT), recent);
        SearchTerm searchTerm = new AndTerm(srchTerms);
        Message[] messages = folder.search(searchTerm);
Sample code
import org.testng.annotations.Test;
import java.util.*;
import javax.mail.*;
import javax.mail.search.*;
public class EmailTest {
    @Test
    public void SearchEmailTest()
    {
        Properties props = new Properties();
        props.setProperty("mail.store.protocol", "imaps");
        try {
            Session session = Session.getInstance(props, null);
            Store store = session.getStore();
            store.connect("imap.gmail.com", <username>, <password>);
            Folder inbox = store.getFolder("INBOX");
            inbox.open(Folder.READ_ONLY);
            GetMessage(inbox);
            SearchEmail(inbox, "Critical security alert","check activity");
            SearchEmail(inbox, "Critical security alert","check activity", false,false);
            SearchEmail(inbox, "Critical security alert","check activity",true,false);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    public void SearchEmail(Folder folder, String subject, String body, boolean seen, boolean recent)
    {
        System.out.println("=====SearchEmail with seen and recent======");
        try{
            SearchTerm[] srchTerms = new SearchTerm[4];
            srchTerms[0] = new SubjectTerm(subject);
            srchTerms[1] = new BodyTerm(body);
            srchTerms[2] = new FlagTerm(new Flags(Flags.Flag.SEEN), seen);
            srchTerms[3] = new FlagTerm(new Flags(Flags.Flag.RECENT), recent);
            SearchTerm searchTerm = new AndTerm(srchTerms);
            Message[] messages = folder.search(searchTerm);
            System.out.println("Message count: " + messages.length);
            Message msg = messages[0];
            PrintMsg(msg);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    public void SearchEmail(Folder folder, String subject, String body)
    {
        System.out.println("=====SearchEmail======");
        try{
            SearchTerm searchTerm = new AndTerm(new SubjectTerm(subject), new BodyTerm(body));
            Message[] messages = folder.search(searchTerm);
            System.out.println("Message count: " + messages.length);
            Message msg = messages[0];
            PrintMsg(msg);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    public void GetMessage(Folder folder)
    {
        System.out.println("=====GetMessage======");
        try
        {
            System.out.println("Message count: " + folder.getMessageCount());
            Message msg = folder.getMessage(folder.getMessageCount());
            PrintMsg(msg);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    public void PrintMsg(Message msg)
    {
        try
        {
            Address[] in = msg.getFrom();
            for (Address address : in) {
                System.out.println("FROM:" + address.toString());
            }
            Multipart mp = (Multipart) msg.getContent();
            int count = mp.getCount();
            System.out.println("body count: "+count);
            for (int i = 0; i < count; i++)
            {
                System.out.println("===========Body no. " + i);
                BodyPart bp = mp.getBodyPart(i);
                System.out.println("SENT DATE:" + msg.getSentDate());
                System.out.println("SUBJECT:" + msg.getSubject());
                System.out.println("CONTENT:" + bp.getContent());
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
Execution output
# Removed the email message details from the output
=====GetMessage======
Message count: 1000
=====SearchEmail======
Message count: 2
=====SearchEmail with seen and recent======
Message count: 1
=====SearchEmail with seen and recent======
Message count: 1
