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.

Comments

Leave a Reply

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