Java mail IMAP list example - List all the email addresses in an IMAP mailbox

Java Mail (JavaMail) IMAP FAQ: Can you show me how to get a list of all the email addresses in an IMAP mailbox using the Java Mail API (JavaMail API)?

Sure. Here's the source code for a Java mail (JavaMail) program that extracts all of the "from" fields out of a specified mailbox. This works for both POP3 and IMAP mailboxes.

Before going to the code, note the cool use of a TreeSet (java.util.TreeSet) in this example. Based on our offline discussion, you mentioned that you really want is this:

  1. Only the unique email addresses, and
  2. The addresses sorted alphabetically.

Therefore, a TreeSet is a great data type for this purpose.

My JavaMail IMAP email address list program

With no further ado, here is the source code for my JavaMail email address list/extractor:

import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
import java.io.*;

/**
 * My JavaMail email address extractor.
 * A JavaMail API example.
 * @author alvin alexander, alvinalexander.com.
 */
public class AddressExtractor
{

  public static void main(String[] args)
  {
    Properties props = new Properties();

    String host      = args[0];
    String username  = args[1];
    String password  = args[2];
    //String provider  = "pop3";
    String provider  = "imap";

    try
    {
      //Connect to the server
      Session session = Session.getDefaultInstance(props, null);
      Store store     = session.getStore(provider);
      store.connect(host, username, password);

      //open the inbox folder
      Folder inbox = store.getFolder("INBOX");
      inbox.open(Folder.READ_ONLY);

      // get a list of javamail messages as an array of messages
      Message[] messages = inbox.getMessages();

      TreeSet treeSet = new TreeSet();

      for(int i = 0; i < messages.length; i++)
      {
        String from = getFrom(messages[i]);
        if ( from!=null)
        {
          from = removeQuotes(from);
          treeSet.add(from);
        }
      }

      Iterator it = treeSet.iterator();
      while ( it.hasNext() )
      {
        System.out.println("from: " + it.next());
      }

      //close the inbox folder but do not
      //remove the messages from the server
      inbox.close(false);
      store.close();
    }
    catch (NoSuchProviderException nspe)
    {
      System.err.println("invalid provider name");
    }
    catch (MessagingException me)
    {
      System.err.println("messaging exception");
      me.printStackTrace();
    }
  }

  private static String getFrom(Message javaMailMessage) 
  throws MessagingException
  {
    String from = "";
    Address a[] = javaMailMessage.getFrom();
    if ( a==null ) return null;
    for ( int i=0; i<a.length; i++ )
    {
      Address address = a[i];
      from = from + address.toString();
    }

    return from;
  }

  private static String removeQuotes(String stringToModify)
  {
    int indexOfFind = stringToModify.indexOf(stringToModify);
    if ( indexOfFind < 0 ) return stringToModify;

    StringBuffer oldStringBuffer = new StringBuffer(stringToModify);
    StringBuffer newStringBuffer = new StringBuffer();
    for ( int i=0, length=oldStringBuffer.length(); i<length; i++ )
    {
      char c = oldStringBuffer.charAt(i);
      if ( c == '"' || c == '\'' )
      {
        // do nothing
      }
      else
      {
        newStringBuffer.append(c);
      }

    }
    return new String(newStringBuffer);
  }

}

JavaMail IMAP list example - Discussion

Besides the TreeSet and JavaMail stuff going on, the removeQuotes() method may also be of interest to you. This method removes single- and double-quotes from the email address. During testing, I ran into situations where one email address was *almost* the same as another address, except for cases where one email address had a name embedded in single-quotes, and the other address had no quotes or double-quotes. Because both addresses are technically the same for what I needed, I added this method to strip out all quotes.

Note that you will also need the following JavaMail API jar files for this Java email extractor class to work:

  1. mail.jar
  2. activation.jar

These jar files can be downloaded from Sun's web site. Just look for the JavaMail API on their site for instructions on obtaining these Jar files.

Comments

Add new comment

Anonymous format

  • Allowed HTML tags: <em> <strong> <cite> <code> <ul type> <ol start type> <li> <pre>
  • Lines and paragraphs break automatically.