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 Program to Implement Dijkstra’s Algorithm using Queue
Java Program to Find Nearest Neighbor for Static Data Set
JPA/Hibernate Persistence Context
Java Timer
Model, ModelMap, and ModelAndView in Spring MVC
Introduction to Spring Data REST
Java Program to Implement Find all Back Edges in a Graph
Registration – Activate a New Account by Email
Hướng dẫn Java Design Pattern – Intercepting Filter
Java Program to Generate All Pairs of Subsets Whose Union Make the Set
Java Program to Implement JobStateReasons API
Java Program to Represent Graph Using Incidence Matrix
Map Serialization and Deserialization with Jackson
Spring REST API + OAuth2 + Angular
Deploy a Spring Boot WAR into a Tomcat Server
Spring’s RequestBody and ResponseBody Annotations
Spring Boot - Creating Docker Image
Sorting Query Results with Spring Data
Các kiểu dữ liệu trong java
Hashing a Password in Java
Java Program to Implement Best-First Search
Injecting Prototype Beans into a Singleton Instance in Spring
Java Program to Implement the Checksum Method for Small String Messages and Detect
Read an Outlook MSG file
Java Program to Check whether Undirected Graph is Connected using DFS
Control the Session with Spring Security
Hướng dẫn Java Design Pattern – Bridge
Spring Boot - Internationalization
Custom JUnit 4 Test Runners
Java Program for Topological Sorting in Graphs
Giới thiệu Json Web Token (JWT)
Using Spring ResponseEntity to Manipulate the HTTP Response