Qmail BSDI Install

It is Wednesday 17 July 2024 - 18:18:10.
Your IP address is

news personal professional computing outdoors reference travel humor



Emoticons Hardware Internet Security







1. Get the following files and place them in /usr/src/qmail:
qmail-1.03.tar.gz ftp://koobera.math.uic.edu
ucspi-tcp-0.88.tar.gz http://pobox.com/~djb/ucspi-tcp.html

2. Install auxiliary programs:

# cd /usr/src/qmail
# gunzip ucspi-tcp-0.80.tar.gz ; tar -xvf ucspi-tcp-0.80.tar.gz
# cd ucspi-tcp-0.80
# make ; make man ; make setup

# gunzip checkpassword-0.81.tar.gz ; tar -xvf checkpassword-0.81.tar
# cd ../checkpassword-0.81
# make ; make setup check

# gunzip rblsmtpd-0.70.tar.gz ; tar -xvf rblsmtpd-0.70.tar
# cd ../rblsmtpd-0.70
# make ; make setup check

3. Create the qmail home directory:
# mkdir /var/qmail

4. Set up the qmail group and the qmail users.
# addgroup nofiles
# adduser -g nofiles -H/var/qmail/alias -G,,, -s/dev/null -P'*' alias
# adduser -g nofiles -H/var/qmail -G,,, -s/dev/null -P'*' qmaild
# adduser -g nofiles -H/var/qmail -G,,, -s/dev/null -P'*' qmaill
# adduser -g nofiles -H/var/qmail -G,,, -s/dev/null -P'*' qmailp
# addgroup qmail
# adduser -g qmail -H/var/qmail -G,,, -s/dev/null -P'*' qmailq
# adduser -g qmail -H/var/qmail -G,,, -s/dev/null -P'*' qmailr
# adduser -g qmail -H/var/qmail -G,,, -s/dev/null -P'*' qmails

5. Compile the qmail program:
# cd /usr/src/qmail
# gunzip qmail-1.03.tar.gz ; tar -xvf qmail-1.03.tar
# cd qmail-1.03
# patch < ../qmail-1.03-rbl.diffs
# patch < ../qmail-1.03-popbull.diffs
# make
# cp qmail-popbull /usr/local/bin/
6. Create the formatted man pages, *.0:
# make man
7. Create the qmail directory tree:
# make setup
8. Run instcheck to make sure it doesn't print any warnings:
# make check
7. You MUST tell qmail your hostname.
# ./config
qmail-config finds your fully-qualified hostname and puts it in control/me.
If you want to learn configuration possibilities, see qmail-control.0.

8. Minimal survival command:
# (cd ~alias; touch .qmail-postmaster .qmail-mailer-daemon .qmail-root)
# chmod 644 ~alias/.qmail*

* root. Under qmail, root never receives mail. Your system may generate
mail messages to root every night. Set up an alias for root
in ~alias/.qmail-root.

9. qmail-local delivers mail by default into ~user/Mailbox.

Put ``setenv MAIL $HOME/Maildir'' in your system-wide .cshrc,
``MAIL=$HOME/Maildir; export MAIL'' in your system-wide .profile,
``inbox-path=$HOME/Maildir'' in your system-wide pine.conf.

10. Enable deliveries of messages injected into qmail:

Copy /var/qmail/boot/home to /var/qmail/rc. Edit to taste.
# /var/qmail/rc &

12. Look for a "qmail: running" line in syslog. qmail-send always prints either
``cannot start'' or ``running''. (The big number is a splogger timestamp.)

13. Do a ps and look for the qmail daemons. There should be four of
them, all idle: qmail-send, running as qmails; qmail-lspawn, running
as root; qmail-rspawn, running as qmailr; and qmail-clean, running
as qmailq. You will also see the splogger process.

14. Local-local test: Send yourself an empty message. (Replace ``me''
with your username. Make sure to include the ``to:'' colon.)
% echo to: me | /var/qmail/bin/qmail-inject
The message will show up immediately in ~/Maildir, and syslog will
show something like this:
qmail: new msg 53
qmail: info msg 53: bytes 246 from <me@domain> qp 20345 uid 666
qmail: starting delivery 1: msg 53 to local me@domain
qmail: delivery 1: success: did_1+0+0/
qmail: end msg 53
(53 is an inode number; 20345 is a process ID; your numbers will
probably be different.)

15. Local-error test: Send a message to a nonexistent local address.
% echo to: nonexistent | /var/qmail/bin/qmail-inject
qmail: new msg 53
qmail: info msg 53: bytes 246 from <me@domain> qp 20351 uid 666
qmail: starting delivery 2: msg 53 to local nonexistent@domain
qmail: delivery 2: failure: No_such_address.__#5.1.1_/
qmail: bounce msg 53 qp 20357
qmail: end msg 53
qmail: new msg 54
qmail: info msg 54: bytes 743 from <> qp 20357 uid 666
qmail: starting delivery 3: msg 54 to local me@domain
qmail: delivery 3: success: did_1+0+0/
qmail: end msg 54
You will now have a bounce message in ~/Maildir.

16. Local-remote test: Send an empty message to your account on another
% echo to: me@wherever | /var/qmail/bin/qmail-inject
qmail: new msg 53
qmail: info msg 53: bytes 246 from <me@domain> qp 20372 uid 666
qmail: starting delivery 4: msg 53 to remote me@wherever
qmail: delivery 4: success:
qmail: end msg 53
There will be a pause between ``starting delivery'' and ``success'';
SMTP is slow. Check that the message is in your mailbox on the other

17. Local-postmaster test: Send mail to postmaster, any capitalization.
% echo to: POSTmaster | /var/qmail/bin/qmail-inject
Look for the message in ~alias/Maildir.

18. Double-bounce test: Send a message with a completely bad envelope.
% /var/qmail/bin/qmail-inject -f nonexistent
To: unknownuser
Subject: testing

This is a test. This is only a test.
(Use end-of-file, not dot, to end the message.) Look for the double
bounce in ~alias/Maildir.

19. Group membership test:
% cat > ~me/.qmail-groups |groups >> MYGROUPS; exit 0
% /var/qmail/bin/qmail-inject me-groups < /dev/null
% cat ~me/MYGROUPS
MYGROUPS will show your normal gid and nothing else. (Under Solaris,
make sure to use /usr/ucb/groups; /usr/bin/groups is broken.)

20. You must replace the sendmail invocation in your
boot scripts with an appropriate qmail invocation.

Find sendmail in your boot scripts. It's in /etc/rc.
sendmail -bd -q15m
Comment out this line, and add this to /etc/rc.local:

csh -cf '/var/qmail/rc &'

22. Replace sendmail with a link to qmail's ``sendmail'' wrapper:
# mv /usr/sbin/sendmail /usr/sbin/sendmail.bak
# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail

23. Add the following to /etc/rc.local.
/usr/local/bin/tcpserver -x/etc/tcp.smtp.cdb -u1009 -g101 0 smtp \
/usr/local/bin/rblsmtpd -b -t2 -r dul.maps.vix.com \
/usr/local/bin/rblsmtpd -b -t2 /var/qmail/bin/qmail-smtpd &
Comment out comsat in /etc/inetd.conf.
The -uXXX is the UID of qmaild and -g is the GID of nofiles.

24. Create the /etc/tcp.smtp file.,RELAYCLIENT=""

Compile it with the /etc/tcpmakectl you are about to create:
/usr/local/bin/tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp \
< /etc/tcp.smtp
chmod 644 /etc/tcp.*
echo "Reloaded /etc/tcp.smtp..."

25. Configure your DNS server(s) for the domains rbl.maps.vix.com,
dul.maps.vix.com, and any other anti-spam lists you subscribe to.

26. Reboot.

27. Disable all the sendmail and binmail programs in your system. The
safest approach is to chmod 0 everything. Some locations to check:
/usr/sbin/sendmail, /usr/lib/sendmail.bak, /usr/lib/sendmail.mx,
/bin/mail, /usr/libexec/mail.local.

28. Make sure that ``mail'' still invokes a reasonable mailer. Under
SVR4 you may want to link mail to mailx.

Post-upgrade tests (can be done immediately after step 24):

29. SMTP server test: Forge some mail locally via SMTP.
% telnet 25
Connected to
Escape character is '^]'.
220 domain ESMTP
helo dude
mail <me@domain>
250 ok
rcpt <me@domain>
250 ok
354 go ahead
Subject: testing

This is a test.
250 ok 812345679 qp 12345
221 domain
Connection closed by foreign host.
Look for the message in your mailbox.
30. Remote-local test: Send yourself some mail from another machine.
31. Remote-error test: I think you can figure this one out.
32. UA test: Try sending mail, first to a local account, then to a
remote account, with your normal user agent.
33. Remote-postmaster test: Send mail from another machine to
PoStMaStEr@domain. Look for the message in ~alias/Maildir.

If you have questions about qmail, contact qmail@pobox.com.


34. Edit /etc/services and make sure port 110 is open.
pop3 110/tcp
Comment out the default popper in /etc/inetd.conf.

35. Start the qpop3d server at boot time but adding the following
to /etc/rc.local:

/usr/local/bin/tcpserver 0 pop3 /var/qmail/bin/qmail-popup \
HOSTNAME /usr/local/bin/checkpassword /var/qmail/bin/qmail-pop3d \
Maildir &

RCPTHOSTS file should include all virtual domains and any that you secondary MX for.

maildir2smtp is designed to pass messages along a SLIP or
PPP link. To set this up on the disconnected end, create
a new maildir in ~alias:

# maildirmake ~alias/pppdir
# chown -R alias ~alias/pppdir



into control/virtualdomains and


into ~alias/.qmail-ppp-default. Don't forget the extra
slash in pppdir/. Then, in the PPP startup script, do

maildir2smtp ~alias/pppdir alias-ppp- $IP `hostname`

replacing $IP with the remote IP address.

My /etc/ppp/ip-up script, for example, looks like this:


# qmail controlfiles are in

# our mailhandling host
SMARTHOST=`cat $QCD/SMARTHOST | sed '/^#/d'`

# find smarthost's ip-address
SMARTIP=`host $SMARTHOST | cut -d" " -f4`

# find own hostname; dynamically assigned!
# $4 is the assigned ipaddress, passed along by pppd
ME=`host $4|head -1|cut -d" " -f2`
echo "$ME" > $QCD/HOSTNAME

# send batched mail to smarthost
/var/qmail/bin/maildirsmtp ~alias/pppdir alias-ppp- $SMARTIP $ME

# fetch mail from POP/IMAP servers for users specified in
for user in `cat $QCD/POPPERS | sed '/^#/d'`
do su - $user -c /usr/local/bin/fetchmail -s

I don't know if this is the most elegant way, but it works well for me. Note that SMARTHOST and POPPERS are not part of qmail. I just put them in that directory to have all the mail stuff in one place. Maybe /etc would be more appropriate.

© Matt Simerson 1999-2004 - Email suggestions or updates.