Reading IMAP Server Emails Using Java

Java provides with set of API called JavaMail that allows you to connect to and read IMAP Server Emails. This article will show you how we can read IMAP Server Emails using Java.

import javax.mail.AuthenticationFailedException;
import javax.mail.Folder;
import javax.mail.FolderClosedException;
import javax.mail.FolderNotFoundException;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.Part;
import javax.mail.ReadOnlyFolderException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.StoreClosedException;
import javax.mail.internet.InternetAddress;
 
public class readEmails {
 
//Constructor Call
public readEmails() {
   processMail();
}
 
//Responsible for printing Data to Console
private void printData(String data) {
   System.out.println(data);
}
 
public void processMail() {
   Session session = null;
   Store store = null;
   Folder folder = null;
   Message message = null;
   Message[] messages = null;
   Object messagecontentObject = null;
   String sender = null;
   String subject = null;
   Multipart multipart = null;
   Part part = null;
   String contentType = null;
 
   try {
      printData("--------------processing mails started-----------------");
      session = Session.getDefaultInstance(System.getProperties(), null);
 
      printData("getting the session for accessing email.");
      store = session.getStore("imap");
 
      store.connect("host Name OR IP","username","password");
      printData("Connection established with IMAP server.");
 
      // Get a handle on the default folder
      folder = store.getDefaultFolder();
 
      printData("Getting the Inbox folder.");
 
      // Retrieve the "Inbox"
      folder = folder.getFolder("inbox");
 
      //Reading the Email Index in Read / Write Mode
      folder.open(Folder.READ_WRITE);
 
      // Retrieve the messages
      messages = folder.getMessages();
 
      // Loop over all of the messages
      for (int messageNumber = 0; messageNumber < messages.length; messageNumber++) {
           // Retrieve the next message to be read
	   message = messages[messageNumber];
 
           // Retrieve the message content
           messagecontentObject = message.getContent();
 
           // Determine email type
           if (messagecontentObject instanceof Multipart) {
               printData("Found Email with Attachment");
               sender = ((InternetAddress) message.getFrom()[0]).getPersonal();
 
               // If the "personal" information has no entry, check the address for the sender information
               printData("If the personal information has no entry, check the address for the sender information.");
 
	       if (sender == null) {
	 	   sender = ((InternetAddress) message.getFrom()[0]).getAddress();
		   printData("sender in NULL. Printing Address:" + sender);
	       }
               printData("Sender -." + sender);
 
               // Get the subject information
               subject = message.getSubject();
 
               printData("subject=" + subject);
 
               // Retrieve the Multipart object from the message
               multipart = (Multipart) message.getContent();
 
               printData("Retrieve the Multipart object from the message");
 
               // Loop over the parts of the email
               for (int i = 0; i < multipart.getCount(); i++) {
                    // Retrieve the next part
                    part = multipart.getBodyPart(i);
 
                    // Get the content type
                    contentType = part.getContentType();
 
                   // Display the content type
		   printData("Content: " + contentType);
 
                   if (contentType.startsWith("text/plain")) {
			printData("---------reading content type text/plain  mail -------------");
		   } else {
			// Retrieve the file name
			String fileName = part.getFileName();
			printData("retrive the fileName="+ fileName);
		   }
	      }
	   } else {
	      printData("Found Mail Without Attachment");
	      sender = ((InternetAddress) message.getFrom()[0]).getPersonal();
 
              // If the "personal" information has no entry, check the address for the sender information
	      printData("If the personal information has no entry, check the address for the sender information.");
 
              if (sender == null) {
		sender = ((InternetAddress) message.getFrom()[0]).getAddress();
		printData("sender in NULL. Printing Address:" + sender);
	     }
 
             // Get the subject information
	     subject = message.getSubject();
	     printData("subject=" + subject);
	 }
      }
 
      // Close the folder
      folder.close(true);
 
      // Close the message store
      store.close();
  } catch(AuthenticationFailedException e) {
     printData("Not able to process the mail reading.");
     e.printStackTrace();
  } catch(FolderClosedException e) {
     printData("Not able to process the mail reading.");
     e.printStackTrace();
  } catch(FolderNotFoundException e) {
     printData("Not able to process the mail reading.");
     e.printStackTrace();
  }  catch(NoSuchProviderException e) {
     printData("Not able to process the mail reading.");
     e.printStackTrace();
  } catch(ReadOnlyFolderException e) {
     printData("Not able to process the mail reading.");
     e.printStackTrace();
  } catch(StoreClosedException e) {
     printData("Not able to process the mail reading.");
     e.printStackTrace();
  } catch (Exception e) {
     printData("Not able to process the mail reading.");
     e.printStackTrace();
  }
}
 
//Main  Function for The readEmail Class
public static void main(String args[]) {
    //Creating new readEmail Object
    readEmails readMail = new readEmails();
 
    //Calling processMail Function to read from IMAP Account
    readMail.processMail();
}
 
}

Your email:

 


Code Explanation:

  • processMail() function is the core function responsible for connecting and reading the mails.
  • Here i am reading the INBOX folder of the email account.
  • Also i am reading the emails in READ-WRITE mode that allows me to do read and modify emails at runtime.
  • I am than iterating to the individual messages using for loop.
  • While iterating individual messages i am checking whether the message contains attachment or not.
  • Finally i am closing the email folder and store connection.

Custom Search


Popular Articles:

Categories: Java Tags:
  1. February 2nd, 2009 at 16:30 | #1

    Get rid of “processMail();” from the constructor because in your code it is called after creating the instance in main method.

  2. Rob
    May 4th, 2009 at 14:51 | #2

    Great stuff here! Very clear.

  3. October 21st, 2009 at 06:50 | #3

    I really liked your blog!

  1. March 1st, 2010 at 22:52 | #1