Download required jar for java mail from here.
Code snippet
package com.pritom.src; import com.sun.mail.imap.IMAPFolder; import com.sun.mail.imap.SortTerm; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.search.*; import java.io.File; import java.util.*; /** * @author PRITOM * @date 2016-11-25 */ public class ReadEmailFromServer { public static void main(String[] args) { gmail(); //bleep(); //yahoo();; //office(); } private static void office() { String PROTOCOL = "imaps", HOST = "outlook.office365.com", USER = "xxxxx@outlook.com", PASSWORD = "xxxxx", ENCRYPTION_TYPE = "tls", PORT = "993"; readEmail(PROTOCOL, HOST, USER, PASSWORD, ENCRYPTION_TYPE, PORT); } private static void yahoo() { String PROTOCOL = "imaps", HOST = "mail.yahoo.com", USER = "xxxxx@yahoo.com", PASSWORD = "xxxxx", ENCRYPTION_TYPE = "tls", PORT = "993"; readEmail(PROTOCOL, HOST, USER, PASSWORD, ENCRYPTION_TYPE, PORT); } private static void bleep() { String PROTOCOL = "imaps", HOST = "bleep.xxxxx.com", USER = "pritom@xxxxx.com", PASSWORD = "xxxxx", ENCRYPTION_TYPE = "tls", PORT = "993"; readEmail(PROTOCOL, HOST, USER, PASSWORD, ENCRYPTION_TYPE, PORT); } private static void gmail() { String PROTOCOL = "imaps", HOST = "imap.gmail.com", USER = "xxxxx@gmail.com", PASSWORD = "xxxxx", ENCRYPTION_TYPE = "tls", PORT = "993"; readEmail(PROTOCOL, HOST, USER, PASSWORD, ENCRYPTION_TYPE, PORT); } private static void readEmail(String PROTOCOL, String HOST, String USER, String PASSWORD, String ENCRYPTION_TYPE, String PORT) { Properties props = new Properties(); props.setProperty("mail.store.protocol", PROTOCOL); if(ENCRYPTION_TYPE.length() > 0 && !ENCRYPTION_TYPE.equalsIgnoreCase("none")) { if(PROTOCOL.equalsIgnoreCase("imap")) { props.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.setProperty("mail.imap.socketFactory.fallback", "false"); props.setProperty("mail.imap.ssl.enable", "true"); props.setProperty("mail.imap.socketFactory.port", PORT.length() > 0 ? PORT : "993"); if(ENCRYPTION_TYPE.equalsIgnoreCase("tls")) { props.setProperty("mail.imap.starttls.enable", "true"); } } else if(PROTOCOL.equalsIgnoreCase("pop3")) { props.setProperty("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.setProperty("mail.pop3.socketFactory.fallback", "false"); props.setProperty("mail.pop3.ssl.enable", "true"); props.setProperty("mail.pop3.socketFactory.port", PORT.length() > 0 ? PORT : "995"); if(ENCRYPTION_TYPE.equalsIgnoreCase("tls")) { props.setProperty("mail.pop3.starttls.enable", "true"); } } } try { Session session = Session.getInstance(props, null); Store store = session.getStore(); store.connect(HOST, USER, PASSWORD); printAllFolders(store); IMAPFolder inbox = (IMAPFolder) store.getFolder("INBOX"); inbox.open(Folder.READ_ONLY); SortTerm[] sortTerms = new SortTerm[1]; sortTerms[0] = SortTerm.ARRIVAL; Message[] messages = inbox.getSortedMessages(sortTerms, getSearchCriteria()); int maxReadNumber = 1; int total = messages.length > maxReadNumber ? maxReadNumber : messages.length; println("\nTotal_Email = " + messages.length); boolean ascending = false; for (int index = 0; index < total; index++) { int message_index = ascending ? index : messages.length - index - 1; Message message = messages[message_index]; String subject = message.getSubject(); println("-------------------------------------------------------------------------------------------"); println("-------------------------------------------------------------------------------------------"); println("------------------" + (index + 1) + "/" + messages.length + "----------------------" + subject); println("-------------------------------------------------------------------------------------------"); println("-------------------------------------------------------------------------------------------"); printAllHeaders(message); if (message.getContent() instanceof String) { println("\tContent---------------Type=" + message.getContentType()); String body = message.getContent().toString(); body = body.length() > 100 ? body.substring(0, 100) + "..." : body; println("\t\t" + toSingleLine(body)); } else { Map output = processMultipart((Multipart) message.getContent()); Object[] keys = output.keySet().toArray(); for (int i = 0; i < keys.length; i++) { println("\t" + keys[i].toString().toUpperCase() + "-------------------------------------------"); if (keys[i].toString() == "attachments") { List attachments = (List) output.get("attachments"); for (int j = 0; j < attachments.size(); j++) { Map attachment = (Map) attachments.get(j); /* You can save attachments to your local machine by uncomment line below */ //String toFile = saveFileFromEmailAttachment(attachment); //println("File_Saved_To=" + toFile); println("\t\tFile_Name=" + attachment.get("fileName")); } } else { String body = output.get(keys[i].toString()).toString().trim(); body = body.length() > 100 ? body.substring(0, 100) + "..." : body; println("\t\t[[[" + toSingleLine(body) + "]]]"); } } } if (total == index + 1) { println("-------------------------------------------------------------------------------------------"); println("-------------------------------------------------------------------------------------------"); println("-------------------------------------------------------------------------------------------"); } } inbox.close(false); store.close(); } catch (Exception ex) { ex.printStackTrace(); } } private static void printAllFolders(Store store) throws Exception { println("Folders:::"); Folder[] folders = store.getDefaultFolder().list(); for (Folder folder : folders) { println("\t" + folder.getFullName()); for (Folder subFolder : folder.list()) { println("\t\t" + subFolder.getFullName()); } } } private static void printAllHeaders(Message message) throws Exception { Enumeration enumeration = message.getAllHeaders(); while (enumeration.hasMoreElements()) { Header header = (Header) enumeration.nextElement(); boolean show = !header.getName().startsWith("X-") && !header.getName().equals("Received"); show = show && !header.getName().startsWith("Authentication-") && !header.getName().startsWith("DKIM-"); if (show) { println("\t" + header.getName() + "===" + toSingleLine(header.getValue())); } } } private static SearchTerm getSearchCriteria() throws Exception { if (true) { //return null; //return new FlagTerm(new Flags(Flags.Flag.SEEN), false); //return new MessageIDTerm("CAD-oc7fMFqioVurtMPnGm63mWAA51wELBaLhtm38zvthTv0+DQ@mail.gmail.com"); } FlagTerm unread = new FlagTerm(new Flags(Flags.Flag.SEEN), false); FromTerm fromTerm = new FromTerm(new InternetAddress("pritomkucse@gmail.com")); Calendar cal = Calendar.getInstance(); /* Set date to 1 day back from now */ cal.roll(Calendar.DATE, false); ReceivedDateTerm latest = new ReceivedDateTerm(DateTerm.GT, cal.getTime()); SearchTerm andTerm = new AndTerm(unread, latest); SearchTerm notFromTerm = new NotTerm(new FromTerm(new InternetAddress("black_listed_domain.com"))); SubjectTerm subjectTerm = new SubjectTerm("Notable"); OrTerm orTerm = new OrTerm(fromTerm, new OrTerm(andTerm, subjectTerm)); AndTerm andTerm1 = new AndTerm(orTerm, notFromTerm); /** * (FROM_pritomkucse@gmail.com OR (NOT_REED AND YESTERDAY) OR SUBJECT_CONTAINS_Notable) AND NOT_FROM_*@black_listed_domain.com */ /* Custom search term, actually download email from server then check (slow) */ SearchTerm searchTerm = new SearchTerm() { @Override public boolean match(Message message) { try { if (message.getSubject().contains("forwarding")) { return true; } } catch (MessagingException ex) { ex.printStackTrace(); } return false; } }; return andTerm1; } private static String saveFileFromEmailAttachment(Map attachment) { try { File dir = createAndGetDirectory(); String fileName = attachment.get("fileName").toString(); File toFile = new File(dir, fileName); MimeBodyPart mimeBodyPart = (MimeBodyPart) attachment.get("mimeBodyPart"); mimeBodyPart.saveFile(toFile); return toFile.getAbsolutePath(); } catch (Exception e) { e.printStackTrace(); return e.getMessage(); } } private static File createAndGetDirectory() { File file = new File("attachments"); if (!file.exists()) { file.mkdir(); } return file; } private static Map processMultipart(Multipart multipart) throws Exception { Map output = new HashMap(); output.put("html", ""); output.put("text", ""); List attachments = new ArrayList(); for(int i = 0; i < multipart.getCount(); i++) { Map result = processBodyPart(multipart.getBodyPart(i)); if (result != null) { if (result.containsKey("type")) { if (result.get("type").toString().equalsIgnoreCase("html")) { output.put("html", result.get("content").toString()); } else if (result.get("type").toString().equalsIgnoreCase("text")) { output.put("text", result.get("content").toString()); } else if (result.get("type").toString().equalsIgnoreCase("attachment")) { attachments.add(result); } } if (result.containsKey("html")) { output.put("html", result.get("html").toString()); } if (result.containsKey("text")) { output.put("text", result.get("text").toString()); } if (result.containsKey("attachments")) { List thisAttachments = (List) result.get("attachments"); for (int i2 = 0; i2 < thisAttachments.size(); i2++) { attachments.add(thisAttachments.get(i2)); } } } } output.put("attachments", attachments); return output; } private static Map processBodyPart(BodyPart bodyPart) throws Exception { if(bodyPart.isMimeType("text/html") && bodyPart.getFileName() == null) { Map data = new HashMap(); data.put("type", "html"); data.put("content", bodyPart.getContent().toString()); return data; } else if(bodyPart.isMimeType("text/plain") && bodyPart.getFileName() == null) { Map data = new HashMap(); data.put("type", "text"); data.put("content", bodyPart.getContent().toString()); return data; } else if(Part.ATTACHMENT.equalsIgnoreCase(bodyPart.getDisposition()) && bodyPart.getFileName() != null) { try { Map map = new HashMap(); map.put("type", "attachment"); map.put("fileName", bodyPart.getFileName()); String fileType = bodyPart.getContentType(); map.put("fileType", fileType.contains(":") ? fileType.substring(0, fileType.indexOf(";")) : fileType); map.put("mimeBodyPart", bodyPart); return map; } catch (Exception ex) { println("Error_Content=" + bodyPart.getContentType()); ex.printStackTrace(); } } else if(bodyPart.getContentType().contains("multipart")) { Map o = processMultipart((Multipart) bodyPart.getContent()); return o; } return null; } private static String toSingleLine(String str) throws Exception { return str.replaceAll("\\s+", " "); } private static void println(Object o) { System.out.println(o); } }