Reading E-mail Via the Web

How to write your own program to read and send mail to any server on the Internet.

E-mail is one of the unsung heroes of the
Internet. The Web makes the Internet fun and interesting and allows
me to keep up with most newspapers and magazines from the comfort
of my Haifa apartment. E-mail allows me to keep in touch with
friends, family and clients, as well as receive electronic
newsletters in a convenient format.

I usually travel with my trusty Linux laptop, which means
that with the help of a telephone line, I can dial in to my
Internet provider and download the latest mail. However, on some
occasions I cannot dial in to check my mail, even though I have
full Internet access and a web browser. I could get an account at
Hotmail, but Hotmail allows you to read mail sent to its server
only, not to any mail server on the Internet.

This month, I will show you how to develop a set of CGI
programs to read e-mail from any POP server. These programs do not
provide a full-fledged e-mail client, but they do fill a niche and
are useful in certain circumstances. The software described this
month should demonstrate how relatively simple it is to create such
applications and will have the added bonus of providing basic
functionality for the times when you are away from the
office.

What is POP?

Traditionally, e-mail on UNIX systems is stored on the user's
computer. If you have an account on a UNIX system, e-mail sent to
you is placed in a file on your computer. I receive mail on my
Linux system in the file /var/spool/mail/reuven.

However, this system became inadequate over time for a
variety of reasons. As users began to have their own full-fledged
UNIX workstations rather than terminals connected to a central
computer, system administrators wanted to centralize incoming mail
on a single server.

The answer was POP, “post office protocol”. Rather than
retrieving mail from a file on their own system, users would
download it from the POP server, with a single POP server per work
group cluster. A POP server typically stores incoming mail in a
traditional UNIX-style file, but allows retrieval and deletion of
individual messages via the network. Just as some cities and towns
require their residents go to a central post office in order to
retrieve letters and packages, POP requires users to retrieve their
mail from a central server.

POP has gone through a number of updates over the years, with
the most recent update named POP3. Over time, additional
functionality has been added, but the basic commands have remained
the same. POP allows users to check if they have mail, retrieve one
or more messages and delete one or more messages.

Users are generally shielded from the underlying mechanics of
POP3. Most modern e-mail programs support POP3. Indeed, e-mail
programs on non-UNIX systems depend on the existence of POP3
servers, since they are rarely able to run mail servers known as
“mail transport agents” or “MTAs”. Sendmail and qmail are two
examples of MTAs.

Net::POP3

Before writing a CGI program to read our mail, we must
understand how the program can accomplish this feat. We could write
our own software to talk to a POP3 server, but as is often the case
with Perl, a module already exists to handle this for us. In this
particular case, the module is
Net::POP3, part of the “libnet”
package of network modules available on CPAN. (For more information
on CPAN and its mirrors, go to http://www.cpan.org/.)

Net::POP3 provides an object-oriented interface to POP,
making it possible to connect to a POP server with only a basic
understanding of how the protocol works. Import the module
with

use Net::POP3;

then create a new object with

my $pop = new Net::POP3($mailserver);

where $mailserver is a scalar containing the
name of our POP3 server. If the connection is successful,
$pop will be an object with methods allowing us
to read and delete messages on the mail server. If the connection
is unsuccessful, $pop will be undefined. Now all
methods in Net::POP3 work this way, returning
undef if the call was unsuccessful. The
following code checks for this condition:

die "Error connecting to $mailserver."
unless (defined $pop);

In order to ensure e-mail remains private, POP3 servers require
users to log in with a user name and password. The
login method accomplishes that,
returning the number of messages waiting for the user:

Again, notice the test to see whether
$num_messages is defined. If it is undefined,
then a mistake probably occurred in either the user name or
password.

Each message on the POP server is identified with an index
number, ranging from 1 to $num_messages. The
index number should stay constant during a single POP session, but
will change during future sessions. You can use the index number to
read or delete a message:

my $message_ref = $pop->read($index);

If message number $index exists, the
message headers and body are put into an array reference. Thus, if
$index points to a message on our POP server,
$message_ref is an array reference. Each element
of the array contains a single line of text from the message. We
can print the contents of the message by dereferencing
$message_ref:

Trending Topics

Upcoming Webinar

Getting Started with DevOps - Including New Data on IT Performance from Puppet Labs 2015 State of DevOps Report

August 27, 2015
12:00 PM CDT

DevOps represents a profound change from the way most IT departments have traditionally worked: from siloed teams and high-anxiety releases to everyone collaborating on uneventful and more frequent releases of higher-quality code. It doesn't matter how large or small an organization is, or even whether it's historically slow moving or risk averse — there are ways to adopt DevOps sanely, and get measurable results in just weeks.