Sendmail and Fetchmail: A local mail server

ArticleCategory:

System Administration

AuthorImage:

[Photo de l'auteur]

TranslationInfo:

Original in fr John Perr

fr to en:John Perr

AboutTheAuthor:

Linux user since 1994; he is one of the French editors of LinuxFocus.


Abstract:

This article explains how to configure sendmail and fetchmail on your local computer connected to the internet via a PPP link. Such a configuration allows you to use every Unix mail client (not only Netscape). You can send and fetch your messages each time you establish a PPP connection.

ArticleIllustration:

[Illustration]

ArticleBody:

Introduction

In order to manage properly mail on your linux box, you have to configure a Mail Transfer Agent (MTA in short). The most popular (and older) is certainly sendmail but there are others such as qmail which are faster and simpler to configure, or exim which is included in standard Debian configurations. We shall stick to sendmail here and use a configuration kit from Berkley University by Eric Allman.
To retreive your mail stored on the server of your Internet Service Provider (ISP in short), it will also be necessary to configure fetchmail in order to feed sendmail with the content of your mailboxes. fetchmail is for mail retrieval via pop3 or imap. You can also use uucp but that is a more exotic case not covered by this article.

Configuration

It is necessary to install the following packages to configure sendmail (rpm format):

Dependent on your distribution you may have slightly different names. The version numbers could also be different. Only the first two packages are really needed.

To actually configure sendmail, follow these steps:

  1. first we assume that:
  2. first create a file: /usr/lib/sendmail-cf/cf/config.mc which contains:
    # start of config.mc
    include(`../m4/cf.m4')dnl
    OSTYPE(`linux')dnl
    define(`SMTP_MAILER_FLAGS', `e9')dnl
    FEATURE(redirect)dnl
    FEATURE(nocanonify)dnl
    FEATURE(always_add_domain)dnl
    FEATURE(local_procmail)dnl
    GENERICS_DOMAIN(localhost.localdomain localhost localhost)
    FEATURE(genericstable)
    FEATURE(masquerade_envelope)dnl
    define(`confCF_VERSION',`dede's cf - 22/05/98')dnl
    define(`confCON_EXPENSIVE',`True')dnl
    define(`confME_TOO',`True')dnl
    define(`confCOPY_ERRORS_TO',`Postmaster')dnl
    define(`confDEF_CHAR_SET',`ISO-8859-1')dnl
    define(`confMIME_FORMAT_ERRORS',`True')dnl
    define(`SMART_HOST',`smtp8:[smtp.isp.net]')dnl
    define(`confTO_QUEUEWARN',`24h')
    MAILER(local)
    MAILER(smtp)
    # End of config.mc
    

    The line define(`SMART_HOST'.... tells sendmail to send all outgoing external mail via your provider instead of trying to deliver it directly. Your internet service provider will then take care of further distribution.
  3. Also create /etc/genericstable:
    dede:   toto@isp.net
    root:   toto@isp.net
    news:   toto@isp.net
    
  4. Verify that /etc/alias contains at least:
    MAILER-DAEMON:  postmaster
    postmaster:     root
    
  5. Modify or create /etc/nsswitch.conf as follow:
    passwd:     files  
    shadow:     files  
    group:      files  
    hosts:      files   dns
    services:   files
    networks:   files
    protocols:  files
    rpc:        files
    ethers:     files
    netmasks:   files     
    bootparams: files
    netgroup:   
    publickey:  
    automount:  files 
    aliases:    files 
    
    (Each entry should contain "files" alone except host)

  6. Generate /etc/sendmail.cf with:
    m4 config.mc > /etc/sendmail.cf
    and permissions as such:
    -rw------- 1 root root 26468 mai 12 22:52 /etc/sendmail.cf

  7. Generate the address conversion data base:
    /usr/bin/sendmail -bi -oA/etc/genericstable
    A file /etc/genericstable.db should have been created

  8. Re-read the alias table:
    newaliases

  9. The file /etc/hosts should contain a line similar to:
    127.0.0.1 localhost.localdomain localhost localhost

  10. restart sendmail:
    kill `head -1 /var/run/sendmail.pid`
    /usr/bin/sendmail -bd -os

    Test sendmail

    That's all for sendmail.We now have to check that everything works nicely:
    Make a file named test.mail with the following lines:

    Subject: test local
    first line of my message
    (compulsory blank line)


    and do:
    /usr/bin/sendmail -v dede < test.mail

    The following lines should display:

    dede... Connecting to local
    dede... Sent
    

    Run mail or any other mail client (not yet netscape !!) and check that the message has been received

    In order to configure Netscape to read local mail (served by sendmail):


    You can also use chmod 777 but this change can be a security hole if you are not the only one connected to your box. chmod 1777 means only the owner of the file can delete it and not the persons with write permission to the directory.

    From now on, your own PC is serving mail directly to Netscape even if you are not connected to the Internet. You can of course use other mail clients like XFmail, emacs, mutt, pine etc...

    Configuration of fetchmail

    Before we try our new mail server on the Internet, we need to configure fetchmail in order to tranfert messages stored in your mailboxes of your ISP:
    create a file .fetchmailrc in /home/dede:

    poll pop.isp.net protocol POP3
            user toto is dede 
            password XXXXXXX
    

    where toto and XXXXX are the login and password of your mail account at pop.isp.net. If you have more than one mailbox, just duplicate the above lines for each mailbox you have.
    The file .fetchmailrc must have permissions set as follow, otherwise fetchmail will refuse to run:

    -rw-------   1 dede   dede   189 oct  6 21:45 /home/dede/.fetchmailrc
    

    Now, for a test on the Internet:

    It should appear in the mail queue when issuing the command: mailq Next, connect to your ISP (isp.net) and send the message:
    /usr/bin/sendmail -q
    

    sendmail -q flushes the mail queue of sendmail and causes it to send out the mail now. Wait for a while and type fetchmail to get your mail, you should have a message sent back by the mirror. You can now disconnect if all the messages have arrived.

    Automatisation

    Once all is setup, we still have to make it work on its own each time a connection is established.

    With PPP, files /etc/ppp/ip-up and ip-down are executed each time you connect or disconnect. Check that you have a line like this one in these files, otherwise create it:
    [ -x /etc/ppp/ip-down.local ] && /etc/ppp/ip-down.local $*
    In /etc/ppp/ip-up you add:
    [ -x /etc/ppp/ip-up.local ] && /etc/ppp/ip-up.local $*

    Files /etc/ppp/ip-up and ip-down then lauch files ip-up.local and ip-down.local that we wrtite like this:

    #!/bin/bash
    # /etc/ppp/ip-up.local
    
    #Record connection parameters
    echo `date` $4 $5 ppp-on >> /etc/ppp/history
    tail -n 1 connect-errors >> /etc/ppp/history
    
    # Send waiting mail
    echo Sending mail... > /dev/console
    /usr/sbin/sendmail -q
    echo Mail sent.  > /dev/console
    
    # Get mail waiting on the pop server
    echo Getting mail... > /dev/console
    fetchmail  > /dev/console 2>&1
    echo Got mail.  > /dev/console
    
    #End
    exit 0
    # end of /etc/ppp/ip-up.local
    

    In fact, the two important lines are commands sendmail -q and fetchmail. The others are cosmetic and allow:

    #!/bin/bash
    # /etc/ppp/ip-down.local
    
    #Record connection parameters
    echo `date` ppp-off >> /etc/ppp/history
    
    #end
    exit 0
    # end of /etc/ppp/ip-down.local
    

    These files are run as root, so it is necessary to copy the file .fetchmailrc in the /root folder.

    If you have a permanent access to the Internet, sendmail regularly sends mail if it has been started as a daemon with the following command:
    sendmail -bd -q10m
    In order to send your mail every 10 minutes for exemple.
    fetchmail can also be lauched in daemon mode with the command:
    fetchmail -d 600
    In order to retreive your incoming mail every 10 minutes (600 seconds) for instance.

    Usually this type of commands are located in the startup (or init) files in the directory /etc/rc or /etc/rc.d/ (may vary according to your configuration).

    Conclusion

    With such a configuration, the outgoing mail waiting in the queue (mailq) is sent. The incoming mail waiting in your mailbox on the server of your ISP arrives. You can use xbiff or xmailbox or any other similar software to warn you that you have mail. You can also fine tune the way your mail is sorted and filtered with procmail. This last step is explained in the Novembre 1997 article from Angel Lopez.

    Other related articles

    Documentaion on sendmail and fetchmail: