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:
Java 8 and Infinite Streams
Java Program to Check Multiplicability of Two Matrices
Connect through a Proxy
Java Program to Construct an Expression Tree for an Prefix Expression
Serialize Only Fields that meet a Custom Criteria with Jackson
Prevent Brute Force Authentication Attempts with Spring Security
Java Program to Implement EnumMap API
Hướng dẫn sử dụng Lớp FilePermission trong java
Java Optional as Return Type
Form Validation with AngularJS and Spring MVC
Java Program to Generate All Subsets of a Given Set in the Gray Code Order
@DynamicUpdate with Spring Data JPA
Java Program to Implement Horner Algorithm
New Features in Java 14
Convert Character Array to String in Java
How to Get a Name of a Method Being Executed?
Lớp Collectors trong Java 8
Upload and Display Excel Files with Spring MVC
Java Program to Implement Singly Linked List
Java Program to Implement Sorted Vector
Spring Boot - Application Properties
Java Program to do a Depth First Search/Traversal on a graph non-recursively
Hướng dẫn Java Design Pattern – Bridge
Java Program to Implement PriorityQueue API
Tạo chương trình Java đầu tiên sử dụng Eclipse
Removing all duplicates from a List in Java
Sử dụng JDBC API thực thi câu lệnh truy vấn dữ liệu
REST Web service: Basic Authentication trong Jersey 2.x
Different Ways to Capture Java Heap Dumps
Java 8 Collectors toMap
Java Program to Perform Matrix Multiplication
Intro to the Jackson ObjectMapper