An Off-Line Email System

Even if you can read emails online, it is a very good way to waste your money. What can you do to save money?

There are two programs which allow an off-line work at home. The first is sendmail, the second is popclient.

But before we explore sendmail and popclient we have to edit the file /etc/hosts and to insert one entry for the mail server. If you have created i4l.config and called "makeleaf" this is done already. If you did not do it, you must add:

/etc/hosts (cutting)
  <IP address>  <name_of_mail_server>    getmail


I will not explain the low level configuration of sendmail - this is somewhat for masochists ;-) I'm using a Linux distribution (S.u.S.E. aktuell 4.2 June 96; ELF) with a sendmail version R8. It is configurable with some m4 scripts - have a look at the README of sendmail. I prepared a slightly modified configuration of the suggested original (""). Go to /usr/src/sendmail/cf/cf and write a file, e.g.:
/usr/src/sendmail/cf/cf/  # Bernhard's
  include(`../m4/cf.m4')dnl              # must be!!!
  VERSIONID(`asyoulike')dnl       # name it as you like
  OSTYPE(linux)dnl                       # We're doing Linux!
  FEATURE(nodns)dnl                      # No own name server
  FEATURE(nocanonify)dnl                 # Don't lookup DNS while sending
  FEATURE(nouucp)dnl                     # We don't use UUCP
  define(SMART_HOST, relay:<>)dnl   # mail to ...
  define(confCON_EXPENSIVE, True)dnl     # distributing mail is expensive
  MASQUERADE_AS(  # we act as "provider"
  define(confUSERDB_SPEC, /etc/userdb.db)dnl  # Address correction
  FEATURE(notsticky)dnl                  # don't change From: line
  MAILER(local)dnl                       # use mailer:
  MAILER(smtp)dnl                        # local, Simple Mail Transfer Prot.
You just must tell sendmail this now:
  root:# m4 > /etc/
  root:# _
Writing emails you have to tell your address so that a "reply" works properly. This means, the From: line in the email header must contain your account name at your provider. This happens because of the line "MASQUERADE_AS ..." in the m4 script, and because of a user database built in there. This database (/etc/userdb.db) also must be prepared, therefore you must create a file containing two lines per user:
  <login_at_your_pc>:mailname  <provider_login_name>
  <provider_login_name>:maildrop <login_at_your_pc>
It must be changed to a format sendmail can read:
  root:# makemap btree /etc/userdb.db < /etc/userdb
  root:# _
(sendmail-FAQ tells that this only works, if you have the Berkeley db package - the S.u.S.E. 4.2 installs it.)

Now you have after a reboot (or after killing sendmail and restarting it with the option "-bd") a working mail slave.

Sendmail is running as daemon in the background. You can tell him to collect all the email you wrote (it will be stored in /var/spool/mqueue or /var/mqueue), and to send it on demand only.

Therefore you must start sendmail while booting as daemon without the "-q ..." option. In simpleinit environment this happens in the last part of the startup script /etc/rc.d/rc.M; if you have sysvinit it is in an extra file (SuSE 4.2: /sbin/init.d/sendmail. Here you must remove this option; "-bd" must remain, because it is the command for sendmail to go into background as daemon.

Mailer's Will...

Sending mails with the classical UNIX command mail works correctly now. The header is written properly, and the From: line contains the correct email address at your provider.

But there are some mail programs which are something obstinate. Programs like pine or Netscape overwrite the header with some entries, which are not correct.


Jan Berkel <> wrote me this hint: You need to edit .muttrc in your home directory and to add the following line:

my_hdr From: (Foo Name)
With this the header rewriting works.


For Netscape you can edit the file ~/.netscape/preferences. In it you find the line

~/.netscape/preferences (cutting)
  EMAIL_ADDRESS:          <Email@Address>
Type in your correct email address.


Tilo Winkler <> found out how to manage it that pine does not write garbage into the From: line. You must get the pine source code and edit pine/makefile.lnx: add -DALLOW_CHANGING_FROM at the CFLAGS and recompile. Now you can add the following to .pinerc in your home directory:

customized-hdrs=From: My Name <My@email.address>,
                Reply-To: My Name <My@email.address>

(Thanks, Markus Dickebohm <> for sending me these hints!)

You can fake the From: address within XEmacs, if you edit the file ~/.emacs and add the following entries:

        (setq user-mail-address "")
        (setq mail-host-address "")
This is not ideal, like the mailer programs above: this mailer changes the mailer header.

More Mailers

If you have information about other MUAs (Mail User Agents), please send them to me. Thank you!


Popclient is a simple-to-use program. Use it this way:
  ~:#    popclient -3 -u<host-login> -p<host-password> -o/var/spool/mail/<user> getmail
  ~:# _
getmail is the mailhost defined in /etc/hosts. If you give an additional "-k" as option, the emails at the provider will not be erased.

Hint: In the meantime a powerful child of popclient was born: fetchmail. Sorry, but I'm not familiar with fetchmail until now.

A Script

This script manages the fetching and sending of your emails. If you are lucky this takes so few time, that only one telephone tariff unit is lost. Some cosmetics in it create a readable log output of the running transfer. You create this script as root and store it in /sbin. This file is also written now in a way which allows more open applications at one time - it uses the file /sbin/isdn which we discussed in the last chapter.
  # exchanges email with the provider.
  # Author:       Bernhard Hailer <>
  # Version:      4.0 (27-Jan-97)


  . /etc/i4l.provider
  . /etc/i4l.secrets

  cd /                                # against PATH=. effect 

  echo -----------------------------------------------------------------------
  echo -e "Starting mail transfer: \c"; date

  . /sbin/connect on

  echo "Checking mail server..."
  set `ping -qc5 -i1 getmail | grep transmitted`
  if [ $4 -gt 0 ]      
    echo ":-) Mail server online - starting mail exchange"  
    echo "Sending mail..."
    sendmail -q
    echo "Again sleeping 1 sec for PPP handshaking"
    sleep 1
    echo "Fetching mail..."
    popclient -3 -u $MAIL_LOGIN -p $MAIL_PASSWD -o $MAIL_PATH getmail
    echo "Again sleeping 1 sec for PPP handshaking"
    sleep 1
    echo ":-[ Sorry - mail server is down. Try later..." 

  . /sbin/isdn off

  # allow dl4mhk access to mail:
  chown dl4mhk.users /var/spool/mail/dl4mhk

  echo -e "Finished mail transfer: \c"; date
The sleep commands are important: the connection may hang without them.

Let's cron!

If you want to run your computer twentyfour hours a day, you could create an automatic mail transfer using the cron daemon. Therefore do:

1.) modify cron table.

  root:# cd ~
  root:# cp /var/spool/cron/crontabs/root .crontab
  root:# _
Append the following lines to the file .crontab:
  # Transfer mail
  30 04 * * * /sbin/ 1>> /var/log/transmail-log 2>> /var/log/transmail-log
2.) Tell crond these modifications.
  crontab .crontab
Now the clock in the computer automatically handles all the emails. Each night at 4:30 a.m. the mails are fetched and sent. Remark: Of course the system time must be set properly - man date; man clock.

You need to calculate what's more expensive: telephone or electricity. Electricity is expensive. But I use this system because it is so comfortable...

Copyright © (GPL V 2) 1996 Bernhard Hailer
Last modification: 21-Feb-97