Common Java Cookbook

Edition: 0.19

Download PDF or Read on Scribd

Download Examples (ZIP)

10.17. Checking a POP3 Mailbox

10.17.1. Problem

You need to check a POP3 mailbox.

10.17.2. Solution

Use Commons Net POP3Client to check a POP3 mailbox for incoming mail. The following example connects to the POP3 server www.discursive.com, logs in as tobrien@discursive.com, and prints each message in the mailbox:

import org.apache.commons.io.CopyUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.net.pop3.POP3Client;
import org.apache.commons.net.pop3.POP3MessageInfo;
POP3Client client = new POP3Client( );
client.connect("www.discursive.com");
client.login("tobrien@discursive.com", "secretpassword");
        
POP3MessageInfo[] messages = client.listMessages( );
for (int i = 0; i < messages.length; i++) {
    int messageNum = messages[i].number;
    System.out.println( "************* Message number: " + messageNum );
    Reader reader = client.retrieveMessage( messageNum );
    System.out.println( "Message:\n" + IOUtils.toString( reader ) );
    IOUtils.closeQuietly( reader );
}
        
client.logout( );
client.disconnect( );

This example calls client.listMessage() to get an array of POP3MessageInfo objects. Each message is retrieved using the message number contained in each POP3MessageInfo. To retrieve the contents of an individual message, the message number is passed to retrieveMessage() , which returns a Reader from which the message body is read. The previous example prints the contents of a POP3 mailbox, as shown below:

************* Message number: 1
Message:
Return-Path: <jerk@spamheaven.net>
X-Original-To: tobrien@discursive.com
Delivered-To: tobrien@discursive.com
Received: from jerk-net.co.jp (unknown [219.71.255.123])
    by pericles.symbiont.net (Postfix) with SMTP id 6FA54543FE
    for <tobrien@discursive.com>; Tue, 22 Jun 2004 02:19:13 -0400 (EDT)
Received: from 228.4.65.206 by smtp.cito.nl;
    Tue, 22 Jun 2004 06:09:26 +0000
Message-ID: <9b8001c4581f$2524e2e9$d8470c90@jerk-net.co.jp>
From: "Spammer" <jerk@spamheaven.net>
To: tobrien@discursive.com
Subject: Hey, I heard you need a mortgage
Date: Tue, 22 Jun 2004 02:09:21 -0400
MIME-Version: 1.0
Content-Type: text/plain;
    charset="iso-8859-1"
Content-Transfer-Encoding: 8bit
Hello,
I heard that you must be a sucker, so I thought I would send you some 
unsolicited email about a mortgage.  Only 3%, and you can even wire 
the money directly to my friend from Nigeria.  Did I mention that if 
you decide to take this mortgage I'll send you the secret for making 
millions by sending useless spam.
---
Mr. Jerk Spammer
"I ruin email for everyone!"

10.17.3. Discussion

This example did not venture into the topic of parsing an email message body. As shown above, the message read with retrieveMessage( ) is a raw message with SMTP headers containing the Subject, Message-ID, and other important pieces of data associated with a message. The body of a message is separated from a list of headers by a single blank, and if you are creating a mail client for a user, you will need to write a parser that can extract a relevant header—such as Subject and From—from the raw email message.

10.17.4. See Also

This recipe used IOUtils.toString( ) and IOUtils.closeQuietly( ) to copy and close a Reader for each email message. These methods are described in detail in Recipe 10.2 and Recipe 10.3.

For a good overview of SMTP and POP3 from the perspective of a FreeBSD administrator, take a look at Dru Lavigne's article "Understanding E-Mail" from OnLamp.com (http://www.onlamp.com/pub/a/bsd/2000/08/30/FreeBSD_Basics.html).


Creative Commons License
Common Java Cookbook by Tim O'Brien is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 United States License.
Permissions beyond the scope of this license may be available at http://www.discursive.com/books/cjcook/reference/jakartackbk-PREFACE-1.html. Copyright 2009. Common Java Cookbook Chunked HTML Output. Some Rights Reserved.