Setting Up E-mail

by Jonathan Walther

In my time on IRC (Internet Relay Chat), I found that the number one problem newbies have, after setting up PPP, is e-mail setup. Many people get their e-mail half-working and leave it at that, for fear of breaking it and not knowing how to fix it.

Mail handling is split up between several types of programs, instead of having everything handled by a single program (such as Eudora). Trust me, it is conceptually easy, and once you understand it, very quick and easy to set up. It also gives you a lot of flexibility.

I've included three sidebars which you may wish to read first; in particular, the Glossary for definitions of terms I will be using. Although there are alternative programs, I'll discuss the ones that I use.

Glossary

Prerequisites

First, you need to get an e-mail account set up by your ISP with mail delivered to their machine. Then, you need to know your ISP's domain and your password on the mail server (usually the same as the password you use when you start up PPP). For the examples in this article, we will call the ISP domain foo.com, the user name barney and the password f00bar.

To begin, you need the following programs or their alternatives:

  • pine [or elm]

  • either smail or sendmail

  • fetchpop [or fetchmail]

  • procmail

To find out if these programs are installed on your system, use the command which. If you type which program at the prompt, the pathname of that program, if it exists in your path, will be returned to the screen. For example, which might return the path /usr/bin/program, letting you know that program is in the /usr/bin/ directory. All of the basic distributions (Slackware, Debian and Red Hat) usually include all of these programs except fetchpop, so you should have no problem finding and installing them.

fetchpop sources can be downloaded from http://snakepit.wasteland.org/fetchpop.tgz (special thanks to TheAsp for hosting this prepatched version on his server so downloading it from Sunsite is unnecessary).

Pine

For this example, Pine is your MUA (mail user agent). You use it to read and write mail. Start up pine by typing pine at the prompt. When you see the opening screen, type s to call up the setup menu, then type c to go to the configuration screen. Now do the following steps.

  1. Press enter and type in the personal name you wish to be associated with your actual e-mail address. Mixed case and spaces are allowed (e.g., Barney Fallon). In this case, other people will see your address as Barney Fallon (barney@foo.com).

  2. Set smtp-server to localhost to ensure that mail gets handed to your local MTA (mail transport agent), where you don't have to worry about it. The MTA then sends it off the next time you connect. (See Glossary and Generic Mail Flow sidebars.)

  3. Leave the other options set to the defaults for now.

To send mail from the prompt or in a script, type:

pine person@address.com < message.file
Smail/Sendmail

Use smail or sendmail as the MTA (mail transport agent). You use it to transport mail between machines. People have written 600 page books on setting up these programs. The horror stories are numerous. For this simple application, in most cases, you don't have to do any set up. If you use Slackware, Debian or Red Hat, the default setups for smail and sendmail work fine right out of the box.

Some installation scripts may ask you whether to use a smarthost, which means it will hand mail to your ISP's mail server so it can do the delivery. That decision is up to you. There's not much difference. If you plan to receive mail on your machine, you might want to look at the /etc/aliases file some day.

If your user name at your ISP is barney@foo.com and you wish this name to show up in the From: header, use sendmail to handle it by taking the following steps:

  1. Create a user named barney on your system.

  2. Edit the /etc/sendmail.cf file line that begins with the characters #DM by changing it to masquerade the Domain (DM—Domain Masquerade), e.g., DMfoo.com. If your machine has a hostname, but not a domain name (i.e., it is not networked except via your ISP), you may also need to edit the line #Dj$w.Foo.COM to remove the # and change Foo.COM to your ISP's domain name. Finally, edit the DS line to name the Domain Smart mail host, if you wish your ISP to actually forward all your mail.

  3. Once the changes are made and saved, just execute SIGHUP<\!s>sendmail, so sendmail will re-read the sendmail.cf file.

Sometimes smail or sendmail will die. You will then get a pine error message saying the SMTP connection is not available . If this occurs, log in as root and type smail -bd or sendmail -bd. If this type of failure happens consistently, the first thing to check is your /etc/rc* directories to be sure that your SMTP server is started at boot up.

Checking the Mail

Sendmail and smail include two very handy programs for mail checking:

  • mailq lets you see any mail that is in the queue (i.e., not sent). If you aren't connected, you can use mailq to check the queue and to remove a mail, if you decide not to send it.

  • runq gives smail and sendmail a “kick in the pants” to start sending out the mail that's in the outgoing queue. This command is useful if your sendmail or smail is set up to send the mail at some specified interval, and you want to send it earlier. Many installations have the default interval set to 60 minutes. Not all distributions include runq. Another way to accomplish the same result is to type sendmail<\!s>-q at the prompt.

Fetchpop

I chose fetchpop because I think it's the easiest program to set up. Download the sources (since it comes with none of the major distributions), compile it and install it as root. If you are brave, you can download it from Sunsite and apply the patch yourself, but the source at the URL given earlier has the patch already applied, so it will work for everyone. Without the patch, it will fail to connect to certain POP (Post Office Protocol) servers, with no damage.

Now, run fetchpop without parameters. (Substitute your personal information in the place of the example names used below.) Fetchpop will prompt you for your POP server. Enter foo.com. Then, it will ask for your user name and password. Enter barney, then f00bar. Fetchpop will then write the information to the ~/.fetchhost file. Then, to get your mail, type:

fetchpop -arbp

In the testing stages, to reassure yourself that it works, use only the -a option. If you use the -r option, any messages you fetch are removed. The -p option causes fetchpop to filter the mail through procmail. Without the -p option, the mail is dumped in your default mailbox (see Mailboxes sidebar), /var/spool/mail/barney.

For more information on fetchpop, read the man page—it explains a lot of other details.

Procmail

Procmail is an MDA (mail delivery agent) and is used for “sorting” e-mail. The standard method is for the MTA to pass mail to procmail one message at a time, where it then checks its configuration file and decides what to do based on what's in the mail. Normally, it puts it in an appropriate mailbox. If you are a concerned parent, you could use procmail to direct all mail containing swear words to /dev/null. If you do a lot of hacking, you can set procmail up so a special “trigger” e-mail would encrypt your hard drive—a quick e-mail containing the code word will lock the box up tight. Or suppose you receive an e-mail from someone important; mail from a particular address could invoke a script to beep you on your pager.

To ensure that your incoming mail is filtered through procmail, create a file called ~/.forward containing the following line:

|exec /usr/bin/procmail

Then, change permissions on this file using the command:

chmod 644 ~/.forward
Check the sendmail man page for the particulars on other uses of the ~/.forward file.

Edit ~/.procmailrc by adding the following lines at the beginning:

MAILDIR=$HOME/mail
DEFAULT=misc

The default misc folder is the mailbox that receives all mail not put in another box. Generally, this will be personal mail.

Let's put our first “filter” in the file. Here is your basic “recipe” in all its glory:

:0
* ^.*linux-kernel@vger.rutgers.edu
linux-kernel

Let's break it down line by line.

:0 indicates the start of a new recipe. You have to use it whenever you put in a new rule for sorting mail.

Each rule line must begin with an * (asterisk) followed by a space. What does ^.*linux-kernel@vger.rutgers.edu mean? The ^ (caret) means “at the beginning of a line”. The . (period) means “match any character”. The * means match any number of the preceding character(s). So, .* means match any number of characters that don't match the following characters. linux-kernel@vger.rutgers.edu is the name of the Linux Kernel mailing list. Altogether, that rule matches any line in the e-mail header that contains linux-kernel@vger.rutgers.edu—if a match is found, it's a safe bet the e-mail came from that mailing list. That rule has worked fine for me for several months now.

Now, the final line, linux-kernel, tells procmail that if the rule above was matched, to store that piece of mail in the mailbox named linux-kernel.

That was easy, eh? Let's do another example.

:0
* ^Reply-To:.*mindanao-l@MINDANAO.COM
mindanao-list

Much like before, except to pick out mail from this mailing list, I only need to look for lines that have the mindanao address in the Reply-To: field of the header. If I put * ^.*mindanao-l@MINDANAO.COM, I might find that personal e-mail that were carbon copied to that mailing list would also get sent to the mailing list mailbox instead of my private one.

Here's one final example. Sometimes, two separate rules are needed to sort all the mail from one mailing list. If I were more knowledgeable about regular expressions, I could easily condense these two rules into one. But I'm not, so here they are:

:0
* ^To:.*wmaker@eosys.com
WindowMaker
:0
* ^Cc:.*wmaker@eosys.com
WindowMaker

Can you see what these rules do? They ensure that all mail, having lines that begin with To: or Cc: and contain wmaker@eosys.com elsewhere in the line, is put into the WindowMaker mailbox. Look at the man pages for procmailrc and procmailex to get more information.

If you already have mail and want to filter it through procmail for resorting, use the commands cat and formail as follows:

cat mailbox | formail -s procmail

This command is handy if you discover mail has been sorted into the wrong folder. Tighten up the “rules” in your ~/.procmailrc file (in the same manner as shown above) and run it through again. For instance, if I find mail in my mailbox which should have gone into the debian-list folder, I type:

mv misc temp; cat temp|formail -s procmail
I can then check the misc file to see if I tightened the rules enough to result in the proper sorting.

To do thorough filtering, I recommend that you learn to use regular expressions effectively. An excellent resource is the book from O'Reilly & Associates, Mastering Regular Expressions, Jeffrey E. F. Friedl, 1997. The man page for egrep can provide a quick reference for regular expressions.

Conclusion

You should now be able to send, receive, sort, read and reply to e-mail on your very own Linux machine. From here, I would recommend you read the EMAIL-HOWTO, the various man pages and documentation for each program.

Once your setup is working, try experimenting with different programs. There are several alternatives to procmail, e.g., deliver and mailagent. Instead of fetchpop, you could use the popular programs fetchmail or popclient. Many other MUAs, such as mail and elm, work quite well. As a substitute for sendmail or smail, install qmail, which is quite popular due to its speed, reliability and simplicity compared to sendmail.

Generic Mail Flow

Mailboxes

Credits

Jonathan Walther enjoys hanging out on MOOs and coding various little programs. Currently, he's looking for any Unix sysadmin/coding related work at an entry level, hopefully somewhere in western Canada where he lives. He just LOOOOOOVES getting e-mail at krooger@kurgo.ml.org. Look for SirDibos on IRC and the various MOOs.
Load Disqus comments