IMAP presents mail messages as entries in a hierarchy of folders, one of which will be an inbox.
Java Mail comes with Provider implementations for POP3 and IMAP, and the secure versions of those as POP3S and IMAPS.
This HowTo connects to a Google Mail account with IMAPS. IMAP protocol is more advanced than POP. With IMAP, you can talk back to the server and sync your changes automatically.
This Howto connects to a server using the IMAPS (Secure, encrypted IMAP) to download messages with or without attachments and save them into files.
import java.io.*; import java.util.*; import javax.mail.*; import javax.mail.internet.*; public class ReceiveMailImap { public ReceiveMailImap() {} // // inspired by : // http://www.mikedesjardins.net/content/2008/03/using-javamail-to-read-and-extract/ // public static void doit() throws MessagingException, IOException { Folder folder = null; Store store = null; try { Properties props = System.getProperties(); props.setProperty("mail.store.protocol", "imaps"); Session session = Session.getDefaultInstance(props, null); // session.setDebug(true); store = session.getStore("imaps"); store.connect("imap.gmail.com","myemail@gmail.com", "******"); folder = store.getFolder("Inbox"); /* Others GMail folders : * [Gmail]/All Mail This folder contains all of your Gmail messages. * [Gmail]/Drafts Your drafts. * [Gmail]/Sent Mail Messages you sent to other people. * [Gmail]/Spam Messages marked as spam. * [Gmail]/Starred Starred messages. * [Gmail]/Trash Messages deleted from Gmail. */ folder.open(Folder.READ_WRITE); Message messages[] = folder.getMessages(); System.out.println("No of Messages : " + folder.getMessageCount()); System.out.println("No of Unread Messages : " + folder.getUnreadMessageCount()); for (int i=0; i < messages.length; ++i) { System.out.println("MESSAGE #" + (i + 1) + ":"); Message msg = messages[i]; /* if we don''t want to fetch messages already processed if (!msg.isSet(Flags.Flag.SEEN)) { String from = "unknown"; ... } */ String from = "unknown"; if (msg.getReplyTo().length >= 1) { from = msg.getReplyTo()[0].toString(); } else if (msg.getFrom().length >= 1) { from = msg.getFrom()[0].toString(); } String subject = msg.getSubject(); System.out.println("Saving ... " + subject +" " + from); // you may want to replace the spaces with "_" // the TEMP directory is used to store the files String filename = "c:/temp/" + subject; saveParts(msg.getContent(), filename); msg.setFlag(Flags.Flag.SEEN,true); // to delete the message // msg.setFlag(Flags.Flag.DELETED, true); } } finally { if (folder != null) { folder.close(true); } if (store != null) { store.close(); } } } public static void saveParts(Object content, String filename) throws IOException, MessagingException { OutputStream out = null; InputStream in = null; try { if (content instanceof Multipart) { Multipart multi = ((Multipart)content); int parts = multi.getCount(); for (int j=0; j < parts; ++j) { MimeBodyPart part = (MimeBodyPart)multi.getBodyPart(j); if (part.getContent() instanceof Multipart) { // part-within-a-part, do some recursion... saveParts(part.getContent(), filename); } else { String extension = ""; if (part.isMimeType("text/html")) { extension = "html"; } else { if (part.isMimeType("text/plain")) { extension = "txt"; } else { // Try to get the name of the attachment extension = part.getDataHandler().getName(); } filename = filename + "." + extension; System.out.println("... " + filename); out = new FileOutputStream(new File(filename)); in = part.getInputStream(); int k; while ((k = in.read()) != -1) { out.write(k); } } } } } } finally { if (in != null) { in.close(); } if (out != null) { out.flush(); out.close(); } } } public static void main(String args[]) throws Exception { ReceiveMailImap.doit(); } }
Done! Happy Coding!
Related posts:
Extra Login Fields with Spring Security
Java Program to Implement SimpeBindings API
Java Program to Implement Circular Doubly Linked List
Guide to Character Encoding
Java Program to Implement LinkedHashSet API
Jackson vs Gson
Một số từ khóa trong Java
Inheritance with Jackson
Introduction to Using FreeMarker in Spring MVC
Mix plain text and HTML content in a mail
Comparing getPath(), getAbsolutePath(), and getCanonicalPath() in Java
Java Program to Describe the Representation of Graph using Adjacency List
Java – Delete a File
Spring MVC and the @ModelAttribute Annotation
Java Program to Implement Binomial Tree
Remove HTML tags from a file to extract only the TEXT
A Custom Media Type for a Spring REST API
Java Program to Generate a Random Subset by Coin Flipping
How To Serialize and Deserialize Enums with Jackson
Creating Docker Images with Spring Boot
Giới thiệu Json Web Token (JWT)
Spring Boot - Bootstrapping
Spring Security Login Page with React
How to Find an Element in a List with Java
Java Program to Check Cycle in a Graph using Graph traversal
Java Program to implement Dynamic Array
Form Validation with AngularJS and Spring MVC
Java Program to Perform Inorder Non-Recursive Traversal of a Given Binary Tree
Java Program to Implement Depth-limited Search
Java Program to Implement Rope
Getting the Size of an Iterable in Java
Exploring the Spring 5 WebFlux URL Matching