My Blog

My WordPress Blog

My Blog

My WordPress Blog

Fetching Emails

In the previous chapter we learnt how to check emails. Now let us see how to fetch each email and read its content. Let us write a Java class FetchingEmail which will read following types of emails:

  • Simple email
  • Email with attachment
  • Email with inline image

Basic steps followed in the code are as below:

  • Get the Session object.
  • Create POP3 store object and connect to the store.
  • Create Folder object and open the appropriate folder in your mailbox.
  • Retrieve messages.
  • Close the folder and store objects respectively.

Create Java Class

Create a java class file FetchingEmail, contents of which are as below:

package com.tutorialspoint;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.Properties;

import javax.mail.Address;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;

public class FetchingEmail {

   public static void fetch(String pop3Host, String storeType, String user,
  String password) {
  try {
     // create properties field
     Properties properties = new Properties();
     properties.put("mail.store.protocol", "pop3");
     properties.put("mail.pop3.host", pop3Host);
     properties.put("mail.pop3.port", "995");
     properties.put("mail.pop3.starttls.enable", "true");
     Session emailSession = Session.getDefaultInstance(properties);
     // emailSession.setDebug(true);
     // create the POP3 store object and connect with the pop server
     Store store = emailSession.getStore("pop3s");
     store.connect(pop3Host, user, password);
     // create the folder object and open it
     Folder emailFolder = store.getFolder("INBOX");
     emailFolder.open(Folder.READ_ONLY);
     BufferedReader reader = new BufferedReader(new InputStreamReader(
      System.in));
     // retrieve the messages from the folder in an array and print it
     Message[] messages = emailFolder.getMessages();
     System.out.println("messages.length---" + messages.length);
     for (int i = 0; i < messages.length; i++) {
        Message message = messages[i];
        System.out.println("---------------------------------");
        writePart(message);
        String line = reader.readLine();
        if ("YES".equals(line)) {
           message.writeTo(System.out);
        } else if ("QUIT".equals(line)) {
           break;
        }
     }
     // close the store and folder objects
     emailFolder.close(false);
     store.close();
  } catch (NoSuchProviderException e) {
     e.printStackTrace();
  } catch (MessagingException e) {
     e.printStackTrace();
  } catch (IOException e) {
     e.printStackTrace();
  } catch (Exception e) {
     e.printStackTrace();
  }
} public static void main(String[] args) {
  String host = "pop.gmail.com";// change accordingly
  String mailStoreType = "pop3";
  String username = 
     "[email protected]";// change accordingly
  String password = "*****";// change accordingly
  //Call method fetch
  fetch(host, mailStoreType, username, password);
} /* * This method checks for content-type * based on which, it processes and * fetches the content of the message */ public static void writePart(Part p) throws Exception {
  if (p instanceof Message)
     //Call methos writeEnvelope
     writeEnvelope((Message) p);
  System.out.println("----------------------------");
  System.out.println("CONTENT-TYPE: " + p.getContentType());
  //check if the content is plain text
  if (p.isMimeType("text/plain")) {
     System.out.println("This is plain text");
     System.out.println("---------------------------");
     System.out.println((String) p.getContent());
  } 
  //check if the content has attachment
  else if (p.isMimeType("multipart/*")) {
     System.out.println("This is a Multipart");
     System.out.println("---------------------------");
     Multipart mp = (Multipart) p.getContent();
     int count = mp.getCount();
     for (int i = 0; i < count; i++)
        writePart(mp.getBodyPart(i));
  } 
  //check if the content is a nested message
  else if (p.isMimeType("message/rfc822")) {
     System.out.println("This is a Nested Message");
     System.out.println("---------------------------");
     writePart((Part) p.getContent());
  } 
  //check if the content is an inline image
  else if (p.isMimeType("image/jpeg")) {
     System.out.println("--------> image/jpeg");
     Object o = p.getContent();
     InputStream x = (InputStream) o;
     // Construct the required byte array
     System.out.println("x.length = " + x.available());
     while ((i = (int) ((InputStream) x).available()) > 0) {
        int result = (int) (((InputStream) x).read(bArray));
        if (result == -1)
     int i = 0;
     byte[] bArray = new byte[x.available()];
        break;
     }
     FileOutputStream f2 = new FileOutputStream("/tmp/image.jpg");
     f2.write(bArray);
  } 
  else if (p.getContentType().contains("image/")) {
     System.out.println("content type" + p.getContentType());
     File f = new File("image" + new Date().getTime() + ".jpg");
     DataOutputStream output = new DataOutputStream(
        new BufferedOutputStream(new FileOutputStream(f)));
        com.sun.mail.util.BASE64DecoderStream test = 
             (com.sun.mail.util.BASE64DecoderStream) p
              .getContent();
     byte[] buffer = new byte[1024];
     int bytesRead;
     while ((bytesRead = test.read(buffer)) != -1) {
        output.write(buffer, 0, bytesRead);
     }
  } 
  else {
     Object o = p.getContent();
     if (o instanceof String) {
        System.out.println("This is a string");
        System.out.println("---------------------------");
        System.out.println((String) o);
     } 
     else if (o instanceof InputStream) {
        System.out.println("This is just an input stream");
        System.out.println("---------------------------");
        InputStream is = (InputStream) o;
        is = (InputStream) o;
        int c;
        while ((c = is.read()) != -1)
           System.out.write(c);
     } 
     else {
        System.out.println("This is an unknown type");
        System.out.println("---------------------------");
        System.out.println(o.toString());
     }
  }
} /* * This method would print FROM,TO and SUBJECT of the message */ public static void writeEnvelope(Message m) throws Exception {
  System.out.println("This is the message envelope");
  System.out.println("---------------------------");
  Address[] a;
  // FROM
  if ((a = m.getFrom()) != null) {
     for (int j = 0; j < a.length; j++)
     System.out.println("FROM: " + a[j].toString());
  }
  // TO
  if ((a = m.getRecipients(Message.RecipientType.TO)) != null) {
     for (int j = 0; j < a.length; j++)
     System.out.println("TO: " + a[j].toString());
  }
  // SUBJECT
  if (m.getSubject() != null)
     System.out.println("SUBJECT: " + m.getSubject());
} }

You can set the debug on by uncommenting the statement emailSession.setDebug(true);

Compile and Run

Now that our class is ready, let us compile the above class. I’ve saved the class FetchingEmail.java to directory : /home/manisha/JavaMailAPIExercise. We would need the jars javax.mail.jar and activation.jar in the classpath. Execute the command below to compile the class (both the jars are placed in /home/manisha/ directory) from command prompt:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: FetchingEmail.java

Now that the class is compiled, execute the below command to run:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: FetchingEmail

Learn Java in-depth with real-world projects through our Java certification course. Enroll and become a certified expert to boost your career.

Verify Output

You should see the following message on the command console:

messages.length---3
---------------------------------
This is the message envelope
---------------------------
FROM: XYZ <[email protected]>
TO: ABC <[email protected]>
SUBJECT: Simple Message
----------------------------
CONTENT-TYPE: multipart/alternative; boundary=047d7b343d6ad3e4ea04e8ec6579
This is a Multipart
---------------------------

----------------------------
CONTENT-TYPE: text/plain; charset=ISO-8859-1
This is plain text
---------------------------
Hi am a simple message string....

-- 
Regards
xyz

This is the message envelope
---------------------------
FROM: XYZ <[email protected]>
TO: ABC <[email protected]>
SUBJECT: Attachement
----------------------------
CONTENT-TYPE: multipart/mixed; boundary=047d7b343d6a99180904e8ec6751
This is a Multipart
---------------------------

----------------------------
CONTENT-TYPE: text/plain; charset=ISO-8859-1
This is plain text
---------------------------
Hi I've an attachment.Please check

-- 
Regards
XYZ

----------------------------
CONTENT-TYPE: application/octet-stream; name=sample_attachement
This is just an input stream
---------------------------
Submit your Tutorials, White Papers and Articles into our Tutorials Directory. This is a tutorials database where we are keeping all the tutorials shared by the internet community for the benefit of others.


This is the message envelope
---------------------------
FROM: XYZ <[email protected]>
TO: ABC <[email protected]>
SUBJECT: Inline Image
----------------------------
CONTENT-TYPE: multipart/related; boundary=f46d04182582be803504e8ece94b
This is a Multipart
---------------------------

----------------------------
CONTENT-TYPE: text/plain; charset=ISO-8859-1
This is plain text
---------------------------
Hi I've an inline image


[image: Inline image 3]

-- 
Regards
XYZ

----------------------------
CONTENT-TYPE: image/png; name="javamail-mini-logo.png"
content typeimage/png; name="javamail-mini-logo.png"

Here you can see there are three emails in our mailbox. First a simple mail with message “Hi am a simple message string….”. The second mail has an attachment. The contents of the attachment are also printed as seen above. The third mail has an inline image.

Fetching Emails

Leave a Reply

Your email address will not be published. Required fields are marked *

Scroll to top