Some documentation stolen from the qmail-dk patch itself This document assumes example.com is the domain in the From: field that you'll be dk_signing for. Text in bold are unique to each installation. (although you can choose to keep the keyword 'default').
1. install qmail as per www.lifewithqmail.org (skip this if you have an existing/compatible qmail installation). any qmail install based off LWQ should be compatible - including netqmail, qmail-isp, and even qmail-aio.
2. install OpenSSL as per the INSTALL file of the latest stable tarball (skip if you already have an existing/compatible OpenSSL)
3. Set it all up
cd /usr/local/src/
wget http://cr.yp.to/software/qmail-1.03.tar.gz
wget http://superb-east.dl.sourceforge.net/sourceforge/domainkeys/libdomainkeys-0.68.tar.gz
wget http://www.qmail.org/qmail-1.03-dk-0.54.patch
wget http://jeremy.kister.net/code/qmail-dk-0.54-auth.patch # optional, for smtp-auth
tar -zxvf libdomainkeys-0.68.tar.gz
cd libdomainkeys-0.68
make
tar -zxvf /usr/local/src/qmail-1.03.tar.gz
echo 'gcc -O2 -include /usr/include/errno.h' > qmail-1.03/conf-cc
patch -d qmail-1.03/ < ../qmail-1.03-dk-0.54.patch
patch -d qmail-1.03/ < ../qmail-dk-0.54-auth.patch # optional, for smtp-auth
cd qmail-1.03
make qmail-dk
cp qmail-dk /var/qmail/bin/
cp qmail-dk.8 /var/qmail/man/man8/
chown qmailq /var/qmail/bin/qmail-dk
chmod 4711 /var/qmail/bin/qmail-dk
For tinydns (djbdns):
'_domainkey.example.com.:k=rsa; t=y; o=-;
'default._domainkey.example.com.:DomainKey_from_step_5
or for BIND:
_domainkey.example.com. IN TXT "k=rsa; t=y; o=-;"
default._domainkey.example.com. IN TXT "DomainKey_from_step_5"
7. Next, modify your /etc/tcp.smtp:
If you control who relays through your machine via RELAYCLIENT:
Or, if you use SMTP AUTH to control who relays through your machine, and you've patched with the above qmail-0.54-dk-auth.patch, you don't have to worry about setting DKSIGN:
9. Be sure to watch your /var/log/qmail/smtpd/current for problems involving not having enough memory. You may need to increase the softlimit memory size in /service/qmail-smtpd/run.
10. If you want qmail-dk to sign messages that you send from the command line, you have to set up some environment variables.
You can choose to modify your .profile: QMAILQUEUE=/var/qmail/bin/qmail-dk DKSIGN=/etc/domainkeys/example.com/default export QMAILQUEUE DKSIGN
Or, as Kyle Wheeler suggested, you can put a wrapper around sendmail: #!/bin/sh export QMAILQUEUE=/var/qmail/bin/qmail-dk export DKSIGN=/etc/domainkeys/example.com/default exec /var/qmail/bin/sendmail "$@"
11. And finally, test your installation: send mail to dktest@temporary.com. You should get a reply within a few minutes.
When you're satisfied with your installation: change the "t=y" in your DNS TXT RRs to "t=n": this takes your DomainKey out of "test mode". To be a bit more aggressive, add a "B" to your DKVERIFY string. man qmail-dk for more info.
Portability Notes
On Solaris 2.7 and 2.9, before the make in libdomainkeys-0.68, I had to:
rblsmtpd blocks mail from RBL-listed sites. It works with any SMTP server that can run under tcpserver.
Interface
rblsmtpd optsprog
opts is a series of getopt-style options. prog consists of one or more arguments.
Normally rblsmtpd runs prog. prog is expected to carry out an SMTP conversation to receive incoming mail messages.
However, rblsmtpd does not invoke prog if it is told to block mail from this client. Instead it carries out its own limited SMTP conversation, temporarily rejecting all attempts to send a message. Meanwhile it prints one line on descriptor 2 to log its activity.
rblsmtpd drops the limited SMTP conversation after 60 seconds, even if the client has not quit by then.
Options:
-t n: Change the 60-second timeout to n seconds.
Blocked clients
If the $RBLSMTPD environment variable is set and is nonempty, rblsmtpd blocks mail. It uses $RBLSMTPD as an error message for the client. Normally rblsmtpd runs under tcpserver; you can use tcprules to set $RBLSMTPD for selected clients.
If $RBLSMTPD is set and is empty, rblsmtpd does not block mail.
If $RBLSMTPD is not set, rblsmtpd looks up $TCPREMOTEIP in the RBL, and blocks mail if $TCPREMOTEIP is listed. tcpserver sets up $TCPREMOTEIP as the IP address of the remote host.
Options:
-r base: Use base as an RBL source. An IP address a.b.c.d is listed by that source if d.c.b.a.base has a TXT record. rblsmtpd uses the contents of the TXT record as an error message for the client.
-a base: Use base as an anti-RBL source. An IP address a.b.c.d is anti-listed by that source if d.c.b.a.base has an A record. In this case rblsmtpd does not block mail.
You may supply any number of -r and -a options. rblsmtpd tries each source in turn until it finds one that lists or anti-lists $TCPREMOTEIP.
If you do not supply any -r options, rblsmtpd tries an RBL source of rbl.maps.vix.com. This will be changed in subsequent versions.
RBL sources
If you want to run your own RBL source or anti-RBL source for rblsmtpd, you can use rbldns from the djbdns package.
I've heard about the following public RBL sources:
dev.null.dk
list.dsbl.org, using rbldns as of 2002-03
multihop.dsbl.org, using rbldns as of 2002-03
orbs.dorkslayers.com
orbz.gst-group.co.uk
relays.osirusoft.com
unconfirmed.dsbl.org, using rbldns as of 2002-03
dnsbl.sorbs.net
cbl.abuseat.org
I've given up on the following RBL sources for various reasons:
blackholes.mail-abuse.org, demanding money for access as of 2001-07
dialups.mail-abuse.org, demanding money for access as of 2001-07
relays.mail-abuse.org, TXT records eliminated in 2000-08, demanding money for access as of 2001-07
relays.msci.memphis.edu, a copy of relays.mail-abuse.org with TXT records, disabled in 2001-01 because mail-abuse.org started demanding money
rss.maps.vix.com, renamed relays.mail-abuse.org
or.orbl.org, down as of 2001-10
relays.ordb.org, no longer in operation
bl.spamcop.net, fails to interoperate with deferred-delivery ISPs
relays.mail-abuse.org stopped working with rblsmtpd in August 2000, because all the TXT records were removed. ``They were eliminated because the zone file is growing rather large,'' the maintainers said. This problem wouldn't occur with rbldns, because rbldnsdatabases are much smaller than zone files. However, the people who run MAPS also have financial interests in BIND, and they refuse to use rbldns.
Temporary errors
Normally, if $RBLSMTPD is set, rblsmtpd uses a 451 error code in its limited SMTP conversation. This tells legitimate clients to try again later. It gives innocent relay operators a chance to see the problem, prohibit relaying, get off the RBL, and get the mail delivered.
However, if $RBLSMTPD begins with a hyphen, rblsmtpd removes the hyphen and uses a 553 error code. This tells legitimate clients to bounce the message immediately.
There are several error-handling options for RBL lookups:
-B: (Default.) Use a 451 error code for IP addresses listed in the RBL.
-b: Use a 553 error code for IP addresses listed in the RBL.
-C: (Default.) Handle RBL lookups in a ``fail-open'' mode. If an RBL lookup fails temporarily, assume that the address is not listed; if an anti-RBL lookup fails temporarily, assume that the address is anti-listed. Unfortunately, a knowledgeable attacker can force an RBL lookup or an anti-RBL lookup to fail temporarily, so that his mail is not blocked.
-c: Handle RBL lookups in a ``fail-closed'' mode. If an RBL lookup fails temporarily, assume that the address is listed (but use a 451 error code even with -b). If an anti-RBL lookup fails temporarily, assume that the address is not anti-listed (but use a 451 error code even if a subsequent RBL lookup succeeds with -b). Unfortunately, this sometimes delays legitimate mail.
Acknowledgments
Thanks to Andrew Richards for his comments on this documentation.
[Howto 관련글]
What is this document?
I wrote this HOWTO so that others can have one place to stop and see how to setup their own private RBL list. The information is out there, but scattered all over the place.
The color convention I use is to have the headlines in gray and the code / shell scripts in yellow
What is rbldns?
Rbldns is a suite of programs in conjunction with dnscache to provide RBL service. In a nutshell IPs put into the rbldns data file show up as 127.0.0.1 responses to a specially crafted DNS query.
The IP address go into the file in the normal readable way, ie 192.168.0.1, and you query for them by reversing the address, like 1.0.168.192.example.com
How do I use rbldns?
Normally you don't use it directly, you have a program query an RBL server and based on the result of the query it either runs or doesn't run the program following it.
For example with Qmail you'll change your qmail-smtpd/run file from tcpserver 0 smtp /var/qmail/bin/qmail-smtpd to tcpserver 0 smtp /usr/local/bin/rblsmtpd -a whitelist.example.com -r blacklist.example.com -r relays.ordb.org /var/qmail/bin/qmail-smtpd
According to the rblsmtpd man page, the -r and -a switches mean:
Switch
If successful, do this
-r
Quit
-a
Don't do other lookups, and continue on
In this case the steps are: 1. Do a lookup against whitelist.example.com, if sucessful then skip the other lookups and go on to accepting the smtp request 2. Do a lookup against blacklist.example.com, if that's successful then quit out printing a "RBL denied" message to the client. 3. Same as #2 but against relays.ordb.org
How do I make my own RBL?
You should know how to setup Dnscache before trying to do this. The steps are pretty easy, but its helpful if you know your way around
Setting up the rbldns is pretty easy, just follow the directions on the RBLdns-conf page:
This says to setup a RBL on 127.0.0.2 that answers queries for *.rbl.example.com, and and RBL on 127.0.0.3 that answers for *.whitelist.example.com
Note: the 'rbl' and 'whitelist' names are arbitrary. RBLdns doesn't know if this is a 'good' or a 'bad' list of addresses -- it just knows that if someone asks for 1.0.168.192.bad.example.com on IP 127.0.0.2 it should answer with a 127.0.0.1 if it has it, or nothing if it doesn't.
Start these services up like all of DJB's other daemons:
And you should see listeners on 127.0.0.2 and 127.0.0.3
Why would I want to use a local RBL?
Why shouldn't you just relay on publically available RBLs? For a couple of reasons: 1. You know a couple of IPs are good and you don't want to waste bandwith by checking them against an RBL on the internet 2. Same thing for bad ones 3. You know your friend has a DSL line at home and an RBL blocks all home DSL users, you want to continue using the service but want to accept his mail. 4. You want to keep a 2nd source of information about who is sending mail to your server
So part of this is being a good netizen. If you know you're getting a lot of email from a handful of IPs, you should put those in your own whitelist so that you're not continously asking the public RBLs if they are okay
How to resolve *.(whitelist|rbl).example.com -- DNScache way
Now that we have the RBL service ready to go we have to be able to query it. Like we told dnscache to send all queries for *.example.com to the local tinydns IP address, we're going to do that for the RBL service.
This is the part that took me a while to think about: how do I serve both *.example.com and *.rbl.example.com? Well the same way you've already done it: through a dnscache setting.
Add two entries to your dnscache "forwarding" information:
This tells dnscache that when it gets a query for *.whitelist.example.com to send it off to the server on 127.0.0.3, *.rbl.example.com queries should go to 127.0.0.2. If you're setup TinyDns this should be familiar
How to resolve *.(whitelist|rbl).example.com -- TinyDns way
This might be a little cleaner if you're already serving up *.example.com results. You put in your tinydns file pointers to the (rbl|whitelist) lists:
cd /service/tinydns/root/
echo "&rbl.example.com:127.0.0.2:a" >> data
echo "&whitelist.example.com:127.0.0.3:a" >> data
make
svc -h /service/tinydns
So now when your tinydns server is queried for 1.0.168.192.rbl.example.com it will look at its file and say "That's handled by 127.0.0.2 and I'll ask it"
How do I add entries to my RBL?
Scenerio: a spammer is continously sending us email from 192.168.5.100 while our friend is sending from 192.168.6.56. We would like to avoid using public RBL servers for these two addresses.
Step 1: add the spammer to your spam list:
cd /service/rbl/black/root
echo 192.168.5.100 >> data
make
Step 2: Add your friend to your good list:
cd /service/rbl/white/root
echo 192.168.6.56 >> data
make
This is what your implementation will probably look like: an initial test against your goodlist, if that passes the continue on to the qmail-smtpd part. If that fails, then test against your local bad list. If that is sucessful then quit out. If not, continue on to your 2nd and 3rd RBLs.
How do I test my RBL?
You test an RBL by sending it a query. If it is in the database then it should return with a 127.0.0.x (1 or 2) answer. If it isn't in there, then nothing comes back.
The trick is to remember to reverse your IP address, so that 192.168.0.1 becomes 1.0.168.192.myrbldomain.com
Here's a simple program to check names fed on stdin:
#!/usr/bin/perl
use Net::DNS;
use strict;
my ($res, @rbls);
@rbls = qw (rbl.example.com whitelist.example.com);
$res = Net::DNS::Resolver->new;
while (<>) {
my ($rev, $ip);
chomp;
$ip = $_;
$rev = (join ".", reverse (split /\./, $ip) ); # ie 4.3.2.1.
foreach my $rbl (@rbls) {
my $query = $res->search("$rev.$rbl");
next unless ($query);
my $hit;
foreach my $rr ($query->answer) {
next unless $rr->type eq "A";
$hit = $rr->address;
last;
}
next unless $hit;
printf "%-20s %-20s $hit\n", $ip, $rbl;
}
}
How do I contact you?
If you have any questions or comments, or just want to say thanks, drop me a line at Chris Wilkes.
cdb is a fast, reliable, simple package for creating and reading constant databases. Its database structure provides several features:
Fast lookups: A successful lookup in a large database normally takes just two disk accesses. An unsuccessful lookup takes only one.
Low overhead: A database uses 2048 bytes, plus 24 bytes per record, plus the space for keys and data.
No random limits: cdb can handle any database up to 4 gigabytes. There are no other restrictions; records don't even have to fit into memory. Databases are stored in a machine-independent format.
Fast atomic database replacement: cdbmake can rewrite an entire database two orders of magnitude faster than other hashing packages.
Fast database dumps: cdbdump prints the contents of a database in cdbmake-compatible format.
cdb is designed to be used in mission-critical applications like e-mail. Database replacement is safe against system crashes. Readers don't have to pause during a rewrite.
Information for distributors
You may distribute unmodified copies of the cdb package.
Packages that need to read cdb files should incorporate the necessary portions of the cdb library rather than relying on an external cdb library.
Related packages
Tim Goodwin's CDB_File is a Perl interface to cdb.
M. J. Pomraning's python-cdb is a Python interface to cdb.
Kazuteru Okahashi's ruby-cdb is a Ruby interface to cdb.
Michael Alyn Miller's sg-cdb is a Java library to read cdb files.
Beware that, starting with version 0.75, rts takes some time to run: e.g., 155 seconds on a Pentium II-350. (It writes three 4GB databases to /dev/null.)
The bad length and not found tallies should be 0. The different record tally should be 0 unless you have the same service listed on several lines in /etc/services.
Try retrieving particular records from the database:
For more information see the README files
README
README.mysql
README.quotas
README.ldap
README.sybase
README.oracle
README.vqmaillocal
For information on upgrading please see the UPGRADE files
UPGRADE
UPGRADE.tren
Note: If you are using any of the BSD distro's you should probably use gmake
and not make.
VPopMail 5.0 Upgrade Instructions are in the UPGRADE File
Hints on converting an old system to a new vpopmail system
are also in the UPGRADE file
1. check for diskspace
# df
or
# df -k
Determine which disk partition you want to place the pop email.
2. add groups and users and home directory
# groupadd -g 89 vchkpw
# useradd -g vchkpw -u 89 vpopmail
We recommend you use the user and group id's of 89. The FreeBSD folks
have reserved 89 for the group and 89 for the user for vpopmail.
if you want to place the vpopmail home dir in a different disk partition
than the default home dir location try:
# useradd -g vchkpw -u 89 -d /path/to/where/you/want vpopmail
RedHat and other linux systems place useradd and groupadd in
the /usr/sbin directory.
NOTE: the home directory of vpopmail must exist before you contiue with
the installation.
3. FAST default install
$ su
# ./configure
# make
# make install-strip
If you are making vpopmail for roaming users to be able to relay
through your smtp server after the authenticate with pop do:
$ su
# ./configure --enable-roaming-users=y
# make
# make install-strip
NOTE: To get a complete list of configure options type: ./configure --help
MySQL NOTE: if you are using --enable-mysql=y make sure you are running
the lasted stable version (Currently 3.23 as of March 5th 2001). Older
versions of mysql, such as 3.22 do not support the "unique index (domain)"
syntax when creating the dir_control table.
3.a configure option recommendations for New Sites
If you are installing a brand new email server please make
use of the new vpopmail-5.0 features. We recommend adding
the following options to your ./configure line:
--enable-clear-passwd=y ( store a clear text copy of users password )
This option helps sysadmins and help desk people. They find it
helpful to be able to see the pasword the user should be using.
--enable-valias=y (Turn on vpopmail alias processing)
This is mainly for the mysql module. It allows aliases/forwards to
be stored in the mysql database. It also turns on the valias
command line program to maintain alias/forwards
--enable-mysql-replication=y ( requires advanced sys admin skills )
If you have a running mysql replicated site, multiple machines with
a central update mysql server and a farm of machines running read-only
mysql servers, THEN, you can make use of this feature. It allows
vpopmail to do read-only queries to a local mysql server, and send
all update transactions (add user, change password, delete domain)
to a central mysql database. A must use for clustered sites
vpopmail to lo
4. Check your ~vpopmail/etc/tcp.smtp file
This file should list all the static IP's of your machines
you want to allow to relay out to the internet.
For example: If you have a whole C class named 10.1.1.X
either edit /etc/tcp.smtp file, or use the following to appened:
# echo "10.1.1.:allow,RELAYCLIENT=\"\"" >> ~vpopmail/etc/tcp.smtp
you can add other ip's later, when ever you want.
5. Setup crontab for --enable-roaming-users=y (default is disabled)
Add a line to roots crontab
$ su
# crontab -e
add a line like the following:
40 * * * * /home-dir-of-vpopmail/bin/clearopensmtp 2>&1 > /dev/null
replace "home-dir-of-vpopmail" with the home directory of vpopmail user.
To find the home dir of vpopmail:
grep vpopmail /etc/passwd
pick out the entry for the home dir
vpopmail:x:502:502::/home/vpopmail:/bin/bash
^^^^^^^^^^^^^^
Done!
You can go on to add a virtual domain and users if you wish
6. Add a virtual domain
For this example, we will add a domain "test.com"
# cd /home-dir-of-vpopmail/bin
# ./vadddomain test.com
or
# ./vadddomain test.com password-for-postmaster
vadddomain will modify the following qmail files
(default locations used)
/var/qmail/control/locals
/var/qmail/control/rcpthosts
/var/qmail/control/morercpthosts (if rcpthosts > than 50 lines)
/var/qmail/control/virtualdomains
/var/qmail/users/assign
/var/qmail/users/cdb
It will also create a domains directory
~vpopmail/domains/test.com
~vpopmail/domains/test.com/postmaster/Maildir ...
~vpopmail/domains/test.com/vpasswd
~vpopmail/domains/test.com/vpasswd.cdb
If you do not specify a password on the command line, it
will prompt for a password for the postmaster.
Then it will send a kill -HUP signal to qmail-send telling it
to re-read the control files.
Note: setting up DNS MX records for the virtual domain is not
covered in this INSTALL file.
7. Add a new pop user.
You can install qmailadmin and administer your new pop mail
system via a web interface. Or you can use the command line
interface.
# cd /home-dir-of-vpopmail/bin
# ./vadduser newuser@test.com
or
# ./vadduser newuser@test.com <password-for-newuser>
In the case where the domain is specified (user@domain.com),
the user is added to the ~vpopmail/domains/domain.com directory.
If you don't enter a password on the command line, it will
prompt for a password.
8. Delete a pop user
# cd /home-dir-of-vpopmail/bin
# ./vdeluser newuser@test.com (for the test.com virtualdomain example)
9. Delete a virtual domain
# cd /home-dir-of-vpopmail/bin
# ./vdeldomain test.com
10. Changing a pop users password (new in 3.4.3)
# cd /home-dir-of-vpopmail/bin
# ./vpasswd user@domain.com
or
# ./vpasswd user@domain.com <password-for-user@domain.com>
11. Information details hiding
Alot of the underlying qmail details are not covered in this
file. This is on purpose. If you want to find out the internal
workings of vchkpw and qmail look into /var/qmail/control files
and /var/qmail/users/assign file.
12. How to use vchkpw with qmail-pop3d server
Here is a sample startup line for qmail-pop3d and vchkpw
env - PATH="/var/qmail/bin:/usr/local/bin" \
tcpserver -H -R 0 pop-3 \
/var/qmail/bin/qmail-popup your.domain.com \
/home-dir-of-vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir &
If you want to authenticate against /etc/passwd do not use the -u -g
options, since it would need to run as root.
Notice where the vchkpw program goes.
Some sites use pop3 instead of pop-3. /etc/services has the
master list. grep pop /etc/services to find out.
If you want to use inetd style startup use this:
pop3 stream tcp nowait root \
/var/qmail/bin/qmail-popup \
qmail-popup mail.stilen.com \
/home/vpopmail/bin/vchkpw \
/var/qmail/bin/qmail-pop3d \
Maildir
If you want to use xinetd style use this:
service pop3
{
disable = no
socket_type = stream
protocol = tcp
wait = no
user = root
server = /var/qmail/bin/qmail-popup
server_args = foo.bar.com /home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir
log_type = FILE /var/log/xinetd.log
log_on_success = HOST
log_on_failure = HOST RECORD
}
13. For sites using the mysql module and --enable-roaming-users=y it
is highly suggested to use Matt Simersons tcpserver-mysql patch.
This removes the need for vpopmail to compile a tcp.smtp.cdb file
for each pop authentication. Instead, tcpserver looks directly
into the vpopmail mysql table of IP's.
14. Good luck
Please report any bugs to kbo@inter7.com.
Also visit http://www.inter7.com/vchkpw/ home page and join the
mailing list vchkpw@inter7.com by sending an email
to vchkpw-subscribe@inter7.com
About
vpopmail is a set of API that manages virtual user accounts on a qmail system, and handles delivery for these virtual users. The command-line utilities, and Qmailadmin all use the vpopmail API, provided by the vpopmail library to manage the system.
Please note that this document does not yet cover the 5.5 branch of vpopmail.
Features
Roaming Users
Roaming users provides a non-SMTP_AUTH authentication system for allowing users with dynamic IPs to send mail through the server without allowing relay from non-authenticated users. After a user has authenticated via POP3, IMAP, etc, their IP is set allowed to relay for the next three hours. This provides them plenty of time to read and respond to all their email. Successive authentications during this time extend the time limit.
SMTP authentication is preferred over roaming users.
This documentation assumes qmail is already installed. If you know what you're doing, you can install vpopmail before qmail, which can be useful when patching qmail with patches that require vpopmail. Run these commands only if you do not have qmail installed:
Before you can configure and install vpopmail, you must create a vpopmail user, and a vpopmail group. An old practice, that most people still follow today, is to name the group vchkpw, and the user vpopmail. The vpopmail tarball will recognize any group name, however, the username must bevpopmail unless you specify an alternative username while configuring.
groupadd vchkpw
useradd -g vchkpw vpopmail
If you plan to use roaming users (POP-before-SMTP), you will need to create a tcpserver rules file that vpopmail can update.
vpopmail comes packaged with a configure script which will enable the package with the features you want, and disable the ones you don't. To configure vpopmail, while in the vpopmail source directory, run the following command:
./configure <options>
Configure options
--enable-qmaildir=DIR Directory where qmail control and user directories are installed /var/qmail.
--enable-qmail-newu=PATH Full path to qmail-newu program.
--enable-qmail-inject=PATH Full path to qmail-inject program.
--enable-qmail-newmrh=PATH Full path to qmail-newmrh program.
--enable-vpopuser=USER User name allocated to vpopmail vpopmail.
--enable-vpopgroup=GROUP Group name allocated to vpopmail vchkpw.
--enable-roaming-users Enable POP-before-SMTP functionality.
--enable-tcprules-prog=PATH Full path to tcprules program /usr/{local/}bin/tcprules.
--enable-tcpserver-file=PATH File where tcpserver -x relay information is stored /home/vpopmail/etc/tcp.smtp.
--disable-rebuild-tcpserver-file Disable rebuilding of tcpserver relay control file.
--enable-relay-clear-minutes=# Expire time for roaming users after pop authentication [180].
--enable-learn-passwords If no password is stored for a user, learn it the first time they authenticate.
--disable-md5-passwords Use DES crypt() instead of MD5 encryption for passwords.
--disable-file-locking Don't use file locking.
--enable-file-sync Enable file sync after each message is delivered.
--disable-make-seekable Don't try to make input to vdelivermail seekable.
--disable-clear-passwd Don't store a cleartext version of the password in addition to the encrypted version.
--disable-users-big-dir Disable hashing of user directories.
--enable-sqwebmail-pass Store a copy of the user's password in the the user's maildir for use by pre-v3 sqwebmail.
--enable-qmail-ext Enable qmail email address extension support.
--enable-ip-alias-domains Enable mapping of default domain via reverse ip lookup table.
--enable-spamassassin Enable spamassassin. See README.spamassassin for more info.
--enable-spamc-prog=PATH Full path to spamc program /usr/{local/}bin/tcprules.
--enable-domains-dir=TEXT Set domains directory name for ~vpopmail/domains/user/.
--enable-incdir=DIR Your MySQL/Oracle 'include' directory.
--enable-libdir=DIR Your MySQL/Oracle 'lib' directory.
--enable-auth-module=MOD Nominate how to store the vpopmail account information (cdb (default), mysql, pgsql,
ldap, oracle, sybase, or activedir).
--enable-passwd Enable /etc/passwd (or shadow) accounts in addition to virtual domains.
--enable-logging=OPT Log to syslog: n=nothing, e=errors only (default), y=all attempts,
p=errors with passwords, v=verbose (all attempts, withpasswords).
--enable-log-name=TEXT Set syslog name vpopmail.
--disable-auth-logging Don't record time and ip of last auth attempt.
Valid only for CDB, MySQL, PGSQL, LDAP, ActiveDir.
--enable-sql-logging Enable authentication logging to MySQL/Postgres.
--enable-mysql-limits Use MySQL to store limits instead of .qmailadmin-limits files.
--enable-mysql-replication Enable support for replicated MySQL auth servers.
--enable-valias Store email aliases in MySQL.
--disable-many-domains Creates a table for each virtual domain instead of storing all users in a single table.
Only valid for MySQL and PostgreSQL
qmail extensions
This configuration allows users to receive mail to addresses in the format username-anything@example.com qmail extensions is enabled by adding --enable-qmail-ext to the configure line. Don't let the name fool you, this feature is maintained by vpopmail, and not qmail. Once this feature is enabled, it automatically works globally for all domains. If you want this feature to be enabled on a per-user, or per-domain basis, you will need to create dotqmail files under the domain directory to support this.
Compiling
Once the configure process has been completed, and there are no errors, you will see a table displaying enabled and disabled features. From here, compile:
make
If all goes well, and no errors occur:
make install-strip
vpopmail is now installed.
Command-line utilities
All binaries for user management are, by default, under /home/vpopmail/bin. Almost all the binaries in this directory can be executed, without arguments, to display a usage.
vadddomain
Adds a new domain to the mailserver
vadddomain: usage: vadddomain [options] virtual_domain [postmaster password]
options: -v prints the version
-q quota_in_bytes (sets the quota for postmaster account)
-b (bounces all mail that doesn't match a user, default)
-e email_address (forwards all non matching user to this address [*])
-u user (sets the uid/gid based on a user in /etc/passwd)
-d dir (sets the dir to use for this domain)
-i uid (sets the uid to use for this domain)
-g gid (sets the gid to use for this domain)
-O optimize adding, for bulk adds set this for all
except the last one
-r[len] (generate a len (default 8) char random postmaster password)
[*] omit @-sign to deliver directly into user's Maildir: '-e postmaster'
vaddaliasdomain
Aliases one domain to another. All users, forwards, autoresponders, etc are the same across the real domain, and the aliased domain.
vaddaliasdomain: usage: [options] real_domain alias_domain
options: -v (print version number)
note: for backward compatability, you can swap real_domain and alias_domain.
Notes
This command creates an entry in the qmail/users/assign file directing all transactions for the new, alias domain name, to the current, real domain. This eliminates needing symlinks, and other harddrive intensive operations.
vdeldomain
Deletes a domain from the mailserver, all users, and all mail under this domain
vdeldomain: usage: [options] domain_name
options: -v (print version number)
-f (force delete of virtual domains)
vadduser
Adds a mailbox to a domain
vadduser: usage: [options] email_address [passwd]
options: -v (print the version)
-q quota_in_bytes (sets the users quota, use NOQUOTA for unlimited)
-c comment (sets the gecos comment field)
-e standard_encrypted_password
-n no_password
-r[len] (generate a len (default 8) char random password)
vdeluser
Deletes a mailbox from a domain, including all mail for that user
vdeluser: usage: [options] email_address
options: -v (print version number)
vdominfo
Return basic information about one or all domains hosted on the server
vdominfo: usage: [options] [domain]
options: -v (print version number)
-a (display all fields, this is the default)
-n (display domain name)
-u (display uid field)
-g (display gid field)
-d (display domain directory)
-t (display total users)
Note that to return the usage with vdominfo, you must type
vdominfo -h
vuserinfo
Return information about user accounts
vuserinfo: usage: [options] email_address
options: -v (print version number)
-a (display all fields, this is the default)
-n (display name field)
-p (display crypted password)
-u (display uid field)
-g (display gid field)
-c (display comment field)
-d (display directory)
-q (display quota field)
-Q (display quota usage)
-C (display clear text password)
-l (display last authentication time)
-D domainname (show all users on this domain)
vmoduser
Modify user settings and flags
vmoduser: usage: [options] email_addr or domain (for each user in domain)
options: -v ( display the vpopmail version number )
-n ( don't rebuild the vpasswd.cdb file )
-q quota ( set quota )
-c comment (set the comment/gecos field )
-e encrypted_passwd (set the password field )
-C clear_text_passwd (set the password field )
the following options are bit flags in the gid int field
-x ( clear all flags )
-d ( don't allow user to change password )
-p ( disable POP access )
-s ( disable SMTP AUTH access )
-w ( disable webmail [IMAP from localhost*] access )
( * full list of webmail server IPs in vchkpw.c )
-i ( disable non-webmail IMAP access )
-b ( bounce all mail )
-o ( user is not subject to domain limits )
-r ( disable roaming user/pop-before-smtp )
-a ( grant qmailadmin administrator privileges )
-S ( grant system administrator privileges - access all domains )
-E ( grant expert privileges - edit .qmail files )
-f ( disable spamassassin)
-F ( delete spam)
[The following flags aren't used directly by vpopmail but are]
[included for other programs that share the user database.]
-u ( set no dialup flag )
-0 ( set V_USER0 flag )
-1 ( set V_USER1 flag )
-2 ( set V_USER2 flag )
-3 ( set V_USER3 flag )
Notes
The vmoduser command is very useful for more advanced user options. Each user has a set of flags that can be set on them. For instance, 'No webmail' will disallow them to use a webmail interface, and 'No POP3' will not allow them to download mail via POP. Generally people use these flags to nudge customers who haven't paid, or to provide specific services to users who are paying for specific services (ie: webmail or pop3, etc). You can also set a flag which disallows them to send mail. Other than user flags, one can also set quotas with this command.
-s ( no smtp access ) if you have qmail-smtpd patched to support smtp authentication using the vchkpw program, then this option will cause the smtp connection to be dropped. Which in effect makes it impossible for the user to send email.
-r ( no external relay flag ) With this option turned on, the user will be able to only send email to local accounts. They will not be able to send email out to the internet. For example: A company can create internal email only accounts.
vpopbull
Short for vpopmail bulletin, vpopbull mass-mails local users an email.
usage: vpopbull [options] -f [email_file] [virtual_domain] [...]
-v (print version number)
-V (verbose)
-f email_file (file with message contents)
-e exclude_email_addr_file (list of addresses to exclude)
-n (don't mail. Use with -V to list accounts)
-c (default, copy file)
-h (use hard links)
-s (use symbolic links)
Notes
The vpopbull command solves a number of problems with trying to mail all your users. Firstly, you dont need to maintain a list of all your user accounts to email to. Secondly, emailing users through the actual qmail server would be inefficient. vpopbull drops messages directly into their Maildir directories where they can be picked up by POP3, webmail, etc, making the operation a simple copy operation instead of an actual mailing operation.
The email sent must be a fully valid email message, including From, and Subject headers, followed by a blank line, followed by the message. The one exception is that a To header should not be included.
From: <example@example.com>
Subject: Server maintenance
Dear example.com users,
We will be performing maintenance on the mail server tomorrow morning.
The maintence window will be between 3am and 5am, and the server will be
down turning this time.
Thank you for your patience,
The example.com Staff
More complicated messages, including ones with attachments, etc, can also be made, however the specifics of generating a multipart message is out of the scope of this document.
vpasswd
vpasswd is used to change passwords for users on the system.
vpasswd: usage: [options] email_address [password]
options: -v (print version number)
-r generate a random password
vchangepw
vchangepw allows changing of passwords for email addresses hosted on the system. This differs from vpasswd in that it requires you to know the current password for the email address. Note that there is no usage for this binary.
Tom Collins submitted a patch to the vpopmail tree including this binary
vsetuserquota
vsetuserquota is used to modify quotas for a single user, or on all users on a domain. See Vpopmail#Quotas for details on quotas.
vsetuserquota: [options] email_address|domain_name quota
options:
-v (print version number)
If you specify a domain name rather than an email address,
the quota will be applied to all users in that domain
Other binaries
You will probably notice that there are binaries in the bin directory that aren't listed above. These binaries are either used by vpopmail to handle delivery or other aspects of the mail system management, or they are used by more advanced users or users who are migrating data between databases.
clearopensmtp
When vpopmail has been compiled with the --enable-roaming-users=y flag enabled, this binary is run out of the crontab every 5 minutes to update the list of IPs that are no longer allowed to send mail. This is a binary used by the Roaming Users feature of vpopmail.
dotqmail2valias
When vpopmail has been compiled with the --enable-valias=y flag, this binary will find all dotqmail files under vpopmail and convert them to valias entries in the database.
valias
When configured with --enable-valias=y, the valias command can be used to add, edit, and delete valiases from the database.
vchkpw
vchkpw is the authentication mechanism used by qmail to check passwords required for downloading mail, and in the case of SMTP_AUTH, sending mail.
vconvert
vconvert is used during conversions and migrations between different database methods. Specifically, vconvert can convert to and from several databases, all information about the users on a vpopmail system.
vconvert: usage
The first option sets which format to convert FROM,
the second option sets which format to convert TO.
-e = etc format
-c = cdb format
-m = sql format
-S = set sqwebmail passwords
-v = version
-d = debug info
vdelivermail
vdelivermail is vpopmail's delivery agent. It handles delivery of messages, bouncing, catch-alls, etc. You will find calls to vdelivermail in the .qmail-default file under each domain.
As this is a binary internal to vpopmail's operation, there is no usage provided by the binary. vdelivermail can be called with the following syntax:
vdelivermail <default action>
The 'default action' may be one of the following:
bounce-no-mailbox
All mail to non-existing recipients on this domain will be bounced. Additionally,
if the chkuser patch is installed, the recipient will be rejected during the SMTP
session as a failed RCPT TO response message.
delete
All mail to non-existing recipients will be accepted and silently dropped for this
domain
/path/to/Maildir/
All mail to non-existing recipients will be accepted and delivered into the Maildir
It should be noted that in the current climate of mail abuse via spammers and viruses, that all settings other than bounce-no-mailbox with the chkuser patch installed, are considered a potential problem. Dictionary attacks can take a server to its knees.
vdeloldusers
vdeloldusers compares the last authentication time for all users against an age in days provided on the command-line, and removes all users which match.
vdeloldusers: usage: [options]
options: -a age_in_days (will delete accounts older than this date)
(default is 6 months or 180 days)
-v (print version number and exit)
-d [domain] (process only [domain])
-e (process every domain)
-D (actually delete users. no users are deleted without this option)
-V (verbose -- print old users that will be deleted)
vipmap
vipmap stands for Vpopmail IP Map. It maps connections on specific IPs, to a particular domain, enabling users to provide just their username for authentication as opposed to the standard user@domain syntax, providing they have connected to a mapped IP.
vipmap: usage: [options] ip domain
options: -d delete mapping
-a add mapping
-p print mapping
-v show version
vkill
vkill is used internally by vpopmail to kill its own processes.
vmkpasswd
vmkpasswd generates the vpasswd.cdb files seen under each of your domain directories. The CDB format allows for faster lookups of information by providing a disk-based hashtable database.
This could be handful for people who are copying one domain to another server. Here is a list of things you have to finish to make it all work again: - Find directory of domain with vuserinfo on server A - Add this domain to server B, with the same password as it was on server A - Find out where the domain is located at server B and change to this directory - Use rsync to download the entire directory from server A like this, make sure you are in the example.com at server B: rsync -avz serverA:/dirofvpopmail/domains/example.com/ . - Make also sure that all the files have vpopmail as its user and vchkpw as its group - Now check vpasswd in the domain directory. It could have happened that your domain directory has been changed, if so, edit the directory value and run vmkpasswd example.com.
vmoddomlimits
vmoddomlimits provides a command-line interface for modifying the .qmailadmin-limits files that may appear under your domains' directories. This file specifies how many users, forwards, mailing lists, etc that a user with the postmaster password may create with Qmailadmin.
vmoddomlimits: usage: [options] domain
options: -v ( display the vpopmail version number )
-d ( use the vlimits.default file, instead of domain )
-S ( show current settings )
-D ( delete limits for this domain, i.e. switch to default limits)
-Q quota-in-megabytes ( set domain disk quota, '100' = 100 MB )
-q quota-in-bytes ( set default user quota, '10M' = 10 MB )
-M count ( set domain max msg count )
-m count ( set default user max msg count )
-P count ( set max amount of pop accounts )
-A count ( set max amount of aliases )
-F count ( set max amount of forwards )
-R count ( set max amount of autoresponders )
-L count ( set max amount of mailing lists )
the following options are bit flags in the gid int field
-g "flags" (set flags, see below)
gid flags:
u ( set no dialup flag )
d ( set no password changing flag )
p ( set no pop access flag )
s ( set no smtp access flag )
w ( set no web mail access flag )
i ( set no imap access flag )
r ( set no external relay flag )
c ( set no spamassasssin flag )
x ( set delete spam flag )
the following options are bit flags for non postmaster admins
-p "flags" (set pop account flags)
-a "flags" (set alias flags)
-f "flags" (set forward flags)
-r "flags" (set autoresponder flags)
-l "flags" (set mailinglist flags)
-u "flags" (set mailinglist users flags)
-o "flags" (set mailinglist moderators flags)
-x "flags" (set quota flags)
-z "flags" (set default quota flags)
perm flags:
a ( set deny all flag )
c ( set deny create flag )
m ( set deny modify flag )
d ( set deny delete flag )
vpopmaild
vpopmaild is a daemon, still under development, which provides a network-based interface to the vpopmail API. There is no further support yet available for this part of vpopmail.
vqmaillocal is a development testing program, and has no impact on a vpopmail system.
Other Features
Here is a list of features that are not so commonly used, but definately have their place.
valias
valias provides use of special delivery instructions normally found in dotqmail, from a database. Depending upon systems, this may or may not increase efficiency. Careful thought as to system size, and scalability must be taken into account when enabling and using this feature.
API
The vpopmail API gives developers access to vpopmail functions such as adding domains, adding users, and updating user passwords. vpopmail, in general, does not make any of its API private, but this document will cover high-level functions; the functions command-line utilities call. vpopmail has a set of standard error codes that all functions can return. To properly utilize vpopmail's API, return code checking should be done after all calls. High-level function calls, as they are refered to as in this document, are prefixed with a v. Care, and a good understanding of vpopmail's API should be used when calling other functions.
This documentation is current as of vpopmail version 5.4.15
Return codes
vpopmail's return codes are for the most part self-explanitory. Further documentation is not really needed. This list is taken from vpopmail.h. All high-level vpopmail API functions return VA_SUCCESS on successful calls, and one of the below error codes on failure.
The domain argument is the domain to be added to the system. Your qmail control/rcpthosts, control/virtualdomains, and users/assign will be updated, and the vpopmail authentication module will be updated with the proper details. The dir parameter sets the directory where the domain will be added under. In most cases, this will be the vpopmail/domains directory.
Notes
This API function does not add a postmaster account.
Delete domain - vdeldomain()
Remove a domain from the vpopmail+qmail system.
Declaration
int vdeldomain( char *domain )
Usage
Passing the domain option will update the qmail control/rcpthosts, control/virtualdomains, users/assign, as well as updating the authentication module.
Notes
All mail storage, and user authentication information will be removed for this domain. When in doubt, make backups.
Add user - vadduser()
Add a user to a domain on a vpopmail system.
Declaration
int vadduser( char *username, char *domain, char *password, char *gecos, int apop )
Usage
The username will be added under domain with a password of password, and a GECOS of gecos via the authentication module. Any directory hashing will be handled by vpopmail internally. If apop is set to 1, the apop secrets file will be updated.
Delete user - vdeluser()
Remove a user from the vpopmail system.
Declaration
int vdeluser( char *user, char *domain )
Usage
Removes an entry from the authentication module's database, and removes all user data.
Notes
All user authentication information, and mailstore data associated with this user will be deleted. Make backups where appropriate.
Change user password - vpasswd()
Update a user's password.
Declaration
int vpasswd( char *username, char *domain, char *password, int apop )
Usage
vpasswd updates a user authentication entry in the authentication module's database where username is the user portion of the email address, domain is the domain portion of the email address, and password is a clear-text version of the user's password. The apop flag is not used.
Set user quota - vsetuserquota()
Declare a user's mailstore quota.
Declaration
int vsetuserquota( char *username, char *domain, char *quota )
Usage
Updates the authentication module's database with a Maildir-quota-style quota as defined by quota for username@domain. The user's mailstore usage is also re-calculated.
Troubleshooting
How to troubleshoot vpopmail
vpopmail is relatively easy to troubleshoot, given a little background knowledge on how it processes authentication information, and message delivery information. Before you head down below for specific information about a problem you might be having, get aquainted with how vpopmail handles your day-to-day mail activities.
Authentication
In order to authenticate users, there's a series of steps that is taken. We will be examining vchkpw, the standard binary used for authentication with POP3.
Firstly, vchkpw expects a valid username.
Because vpopmail is a virtual domain package, it also needs to know what domain they're on. Depending upon the system configuration, the username will sometimes be simply 'username', with a domain mapped either to an IP, or as a default domain, but generally the username will be 'user@domain'. Does the username contain entirely valid characters? Does the domain contain valid characters?
Next vpopmail opens the qmail/users/cdb
file to determine if the domain is valid. Here is where permissions errors come in. Can the process trying to authenticate access the cdb file? Does the cdb file exist? Is it updated with the latest information from the qmail/users/assign file? Is there an issue with the contents of the assign file causing the cdb file not to be updated? As you can see, each step can have a number of actual causes, but generally they all cause a similar symptom, which can make determining the actual cause a little difficult.
The next step is to determine if the username provided exists on that domain.
Depending upon the authentication storage scheme, yet more issues can arise here. For the sake of this document, we will assume CDB, however, those of you using MySQL, or another network-based DB may wish to make sure your authentication information is correct. Can the process wishing to authenticate access the vpasswd.cdb file? All processes accessing authentication information for vpopmail must be at least SUID/SGID vpopmail. Note that files under the vpopmail directory should NEVER have their permissions changed to be read by users other than the vpopmail user. Does the vpasswd.cdb file exist? Has it been updated with the latest information from the vpasswd file? Does the vpasswd file contain entirely valid syntax?
Next it compares their password.
Obviously the question here is, do they have the correct password?
Now user flags are checked.
Are they allowed to access the POP server? At this point, other flags are checked for other services as well. SMTP, IMAP, etc.
Now we set up the environment to deal with their mailbox files.
Are the permissions on the user's home directory and Maildir correct?
The next, and final step is to execute the POP handler.
If this part fails, make sure your POP binary is there, and that it can be executed by the process.
Specific Issues
One of my users can't authenticate via POP3
Is the user using the correct login name?
Sometimes users are simply using the wrong login name. Try verifying their login information yourself before going any further.
Is the user using the correct login syntax?
Depending upon the configuration of the system, one may need to log in with different username formats. user@domain is the most common. Be sure your users know that this is the correct format for authenticating for mail.
Is the user using the correct password?
Systems with clear-text passwords enabled can allow administrators and technical staff to quickly diagnose this issue.
Is the POP3 server running as root?
The POP3 server must run as root so that it may change the proper UID/GID after it determines what that UID/GID is.
Does the qmail/users/assign file contain the domain?
Does the qmail/users/assign file contain proper syntax?
Is the qmail/users/cdb file up to date?
Are permissions correct on the vpopmail home directory and sub-directories?
When using MySQL for authentication, I get the error vmysql: sql error[3] MySQL server has gone away
This is almost always caused by permissions, or authentication problems. First, using the information from ~vpopmail/etc/vpopmail.mysql, try to access the MySQL database via the mysql client as the vpopmail system user. (Depending upon your system, you may need to use sudo)
# su vpopmail
$ mysql -u vpopmail -p vpopmail
Enter password:
At this point, you may have received any number of errors. If you get to a MySQL prompt, try the following:
mysql> show tables;
Pick a table. vpopmail is a good one to use
mysql> select count(*) from vpopmail;
The most common problem here is that vpopmail cant access the MySQL socket. Check the location where your MySQL server is creating the socket file, and be sure the vpopmail user can read and write to it.
This problem can also be caused, under certian circumstances on FreeBSD 4.x and 5.x systems when MySQL is compiled with the following options:
WITH_LINUXTHREADS=YES
This is the default compile for many FreeBSD ports distrobutions as it solves several 'spin-locking' and other performance and latency issues. However when a system is under high load it may cause a problem with vpopmail showing the "vmysql: sql error[3] MySQL server has gone away" or no error at all. re-compiling MySQL WITH_LINUXTHREADS=NO will solve this problem.
I've lost all my qmail control files
This can occur because of disk corruption, or administrative mistakes. Either way this is actually solved rather easily. This will recover your domain hosting information, but not any of your other control files.
To use this script, copy the below contents to ~vpopmail/domains/gen-hashed.sh It *must* be called gen-hashed.sh, and it must reside in ~vpopmail/domains. Then just run it. There is no output except three files are created, controls.rcpthosts, controls.virtualdomains, users.assign. These three files should be copied or moved into their respective locations inside the qmail directory.
#!/bin/sh
#
# Generate control files from hashed
# vpopmail domain tree. Should be run
# from ~vpopmail/domains directory,
# and script should be named gen-hashed.sh
#
# <matt@inter7.com>
#
SUB=""
rm -f users.assign control.rcpthosts control.virtualdomains
if [ $# -eq 1 ]; then
CPWD=$PWD
SUB=$1/
cd $1
fi
for i in *; do
if [ ! -d $i ]; then
continue
fi
if [ ${#i} -eq 1 ]; then
/home/vpopmail/domains/gen-hashed.sh $i
continue
fi
if [ "$CPWD" != "" ]; then
CPWD="${CPWD}/"
fi
echo "+$i-:$i:89:89:$PWD/$i:-::" >> ${CPWD}users.assign
echo "$i:$i" >> ${CPWD}control.virtualdomains
echo "$i" >> ${CPWD}control.rcpthosts
done
if [ "$SUB" != "" ]; then
cd $CPWD
fi
if [ $# -eq 0 ]; then
echo "." >> ${CPWD}users.assign
fi
Qmail Conflicts
If the program qmail-pw2u is run, it will delete the existing contents of /var/qmail/users/assign. If this happens, run the gen-hashed.sh script in the previous section. The qmail RPM by Bruce Guenter includes a cron job that runs qmail-pw2u hourly, you need to disable the cron job.
SAVE COPIES OF YOUR OUTGOING MAIL! Like any other piece of software (and
information generally), the qmail system comes with NO WARRANTY. It's
much more secure and reliable than sendmail, but that's not saying much.
Things you have to decide before starting:
* The qmail home directory, normally /var/qmail. To change this
directory, edit conf-qmail now.
* The names of the qmail users and the qmail groups. To change these
names, edit conf-users and conf-groups now.
To create /var/qmail and configure qmail (won't interfere with sendmail):
1. Create the qmail home directory:
# mkdir /var/qmail
2. Read INSTALL.ids. You must set up the qmail group and the qmail
users before compiling the programs.
3. Compile the programs and create the qmail directory tree:
# make setup check
4. Read INSTALL.ctl and FAQ. Minimal survival command:
# ./config
5. Read INSTALL.alias. Minimal survival command:
# (cd ~alias; touch .qmail-postmaster .qmail-mailer-daemon .qmail-root)
# chmod 644 ~alias/.qmail*
6. Read INSTALL.mbox and INSTALL.vsm.
7. Read INSTALL.maildir.
8. Copy /var/qmail/boot/home (or proc) to /var/qmail/rc.
To test qmail deliveries (won't interfere with sendmail):
9. Enable deliveries of messages injected into qmail:
# csh -cf '/var/qmail/rc &'
10. Read TEST.deliver.
To upgrade from sendmail to qmail:
11. Read SENDMAIL. This is what your users will want to know about the
switch from sendmail to qmail.
12. Read REMOVE.sendmail. You must remove sendmail before installing
qmail.
13. Read REMOVE.binmail.
14. Add
csh -cf '/var/qmail/rc &'
to your boot scripts, so that the qmail daemons are restarted
whenever your system reboots. Make sure you include the &.
15. Make qmail's ``sendmail'' wrapper available to MUAs:
# ln -s /var/qmail/bin/sendmail /usr/lib/sendmail
# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail
/usr/sbin might not exist on your system.
16. Set up qmail-smtpd in /etc/inetd.conf (all on one line):
smtp stream tcp nowait qmaild /var/qmail/bin/tcp-env
tcp-env /var/qmail/bin/qmail-smtpd
17. Reboot. (Or kill -HUP your inetd and make sure the qmail daemons
are running.)
18. Read TEST.receive.
That's it! To report success:
% ( echo 'First M. Last'; cat `cat SYSDEPS` ) | mail djb-qst@cr.yp.to
Replace First M. Last with your name.
If you have questions about qmail, join the qmail mailing list; see
The logging utilities in daemontools are discussed on the log mailing list.
What is it?
daemontools is a collection of tools for managing UNIX services.
supervise monitors a service. It starts the service and restarts the service if it dies. Setting up a new service is easy: all supervise needs is a directory with a run script that runs the service.
multilog saves error messages to one or more logs. It optionally timestamps each line and, for each log, includes or excludes lines matching specified patterns. It automatically rotates logs to limit the amount of disk space used. If the disk fills up, it pauses and tries again, without losing any data.
tcpserver and tcpclient are easy-to-use command-line tools for building TCP client-server applications.
tcpserver waits for incoming connections and, for each connection, runs a program of your choice. Your program receives environment variables showing the local and remote host names, IP addresses, and port numbers.
tcpserver offers a concurrency limit to protect you from running out of processes and memory. When you are handling 40 (by default) simultaneous connections, tcpserver smoothly defers acceptance of new connections.
tcpserver also provides TCP access control features, similar to tcp-wrappers/tcpd's hosts.allow but much faster. Its access control rules are compiled into a hashed format with cdb, so it can easily deal with thousands of different hosts.
This package includes a recordio tool that monitors all the input and output of a server.
tcpclient makes a TCP connection and runs a program of your choice. It sets up the same environment variables as tcpserver.
This package includes several sample clients built on top of tcpclient: who@, date@, finger@, http@, tcpcat, and mconnect.
tcpserver and tcpclient conform to UCSPI, the UNIX Client-Server Program Interface, using the TCP protocol. UCSPI tools are available for several different networks.
Other command-line TCP tools
The current ucspi-tcp interface is a refinement of the tcpserver/tcpclient interface in my 1991 clientserver package, which replaced the attachport/authtcp interface in my 1989 auth package.
ucspi-tcp now competes with several other programs:
inetd, a root-only TCP server supplied by all UNIX vendors;
MTA : SMTP 지원 서버 sendmail , qmail 등 ... MUA : outlook 등 MDA : MTA 가 메일을
수신받아 메일함에 저장하는 agent ex) vpopmail , qmail-local.... MRA : 리모트 서버에 있는 우편함으로부터
사용자의 MUA로 메시지를 가져오는 프로그램 ex) dovecot , courier-imap , qmail-pop3d ....
기본적인 릴레이 방식은 모두 같겠지만 가상호스트 설정 부분은 qmail- mysql을 이용한 가상호스트 구현
위주로 설명하였다 주요 차이점은 qmail-mysql은 virtualdomains 설정파일을 사용하지 않는 다, 그것은 qmail
데이터베이스의 users 테이블의 mbox_host 필드와 locals 설정파일이 그것을 대신해 주기 때문이다 개인적으로
qmail-mysql 가상호스트메일을 선호하는 가장 큰 이유는 시 스템계정과 mysql 메일계정이 중복될 경 우 mysql 메일계정을
먼저 처 리하도록 qmail-getpw.c를 패치함으로서 더 이상 그것으로 고민할 필요가 없어졌 기 때문이다 예를들면,
master 라는 시스템계정이 존재하더라도 master@xexx.net master@test1.xexx.net master@test2.xexx.net 등과 같이 가상 메일
계정을 같은 아이디로 얼마든지 사용가능하기 때문 이다. 그리고 이것은 별 관계가 없지만 또 한가지 이유는
qmail-smtp-auth 의 출현으로 vpopmail의 로밍서비스를 대 신 할수 있기 때문이다..
편의상 qmail에서
기본적인 릴레이 설정을 각 설정 파일별로 구분하여 설명하였으며 일단 smtp-auth 인증은 제 외하고 언급한후 마지막 부분 에서
smtp-auth 인증방식이 추가됨으로서 편리해진점과 같이 비교하여 설 명하였다 원래 작문실력이 없어서 횡설수설하는 부분도
있겠지만 나름대로는 최대 한 알아듣기 쉽게 설명한 것입니다 10-1)/etc/tcp.smtp 여기에 등록하는 아이피에
대해서 smtp 접속 허용/불허/rcpthosts참고 등을 결정하며 기본적인 사용법은 아래와 같다 IP:deny <-- 해당
IP로 부터는 smtp 접속을 아예 거부하겠다는 뜻이다 따라서 여기에 지정된 IP는 smtp 접속자체가 거부 되므로 아무것도 할
수 가 없게 된다 IP:allow,RELAYCLIENT="" <-- 해당 IP로 부터는 smtp 접속을 허용하며 모든
릴레이를 허용한다는 뜻이다 따라서 여기에 지정된 IP는 smtp 로 접속하여 아무런 제약없이 어디던 지 메일을 보낼수 있게 된다
:allow <-- 그외 모든 IP로 부터는 smtp 접속은 허용하되 릴레이는 rcpthosts 에 등록된 서버에 대해서만
허용 한다는 뜻이다 따라서 그밖의 모든 IP는 일단 smtp 로 접속은 할수 있지만 rcpthosts 에 등록된 호스트로만 메일을
보낼수 있으며 다른 곳으로 는 메일을 보낼수가 없게 된다 그리고 주의할 것은 이 설정파일을 수정한후 적용시키기 위해서는 반드
시 DB를 업데이트 해 주어야 한다 #tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp <
/etc/tcp.smtp 또는 #qmail cdb <-- DB 업데이트 방법
일반적인 설정예>>
#vi /etc/tcp.smtp 127.0.0.1:allow,RELAYCLIENT=""
192.168.:allow,RELAYCLIENT="" :allow 위의 설정을 쉽게 설명하면...., 먼저 로컬과
192.168.xxx.xxx 범위에 속하는 내부사설IP들은 smtp 에 접 속하여 어디든지 메일을 보낼수 있다. 그밖의 모든
IP들은 일단 smtp 에 접속은 허용하지만 rcpthosts 에 등록 된 호스트로만 메일을 보낼수 있다 일단은 위의 설정만으로
충분하며 스펨메일이 자주들어오는 IP 나 특정 한 곳에서의 접근을 차단하고 싶다면 아 래처럼 추가해주면 된다 #vi
/etc/tcp.smtp 127.0.0.1:allow,RELAYCLIENT=""
192.168.:allow,RELAYCLIENT="" 61.255.223.:deny <-- 이런식으로 접근 거부할 곳을
지정해 주면 된다 :allow
10-2)/var/qmail/control/rcpthosts 이 파일은
tcp.smtp 에서 RELAYCLIENT="" 옵션이 없을 경우에만 동작하 며 릴레이를 허용할 호스트들을 등록 하는데 일반적으로
localhost 와 메인호스트 및 내부 가상호스트들을 모두 등록한다 그리고 여기서 중요한 것이 rcpthosts 파일을 지워
버리게 되면 tcp.smtp에서 :allow 로 설정한 부분 이 :allow,RELAYCLIENT="" 로 설정한것처럼 처리가
된다, 쉽 게 말하면 smtp 에 접속하여 rcpthosts 파일을 참고 하려는데 이파일 이 없으니까 그냥 아무제약없이 어디로든
메일을 보낼수가 있게 돼 버리 는 것이다, 이렇게 되면 오픈릴레이가 돼기 때문에 절대로 rcpthosts 파일을 삭제해서는 안된다
또한 이 설정파일을 수정한후 적용시키기 위해서는 반드시 qmail 데몬 을 재시작 해야한다
일반적인
설정예>> #vi /var/qmail/control/rcpthosts localhost <-- 로컬호스트
xexx.net <-- 메인호스트 test1.xexx.net <-- 가상호스트1 test2.xexx.net
<-- 가상호스트2 위의 10-1) 과 연결하여 설명하면..., 먼저 로컬과 192.168.xxx.xxx 범위에 속하는
내부사설IP들은 smtp 에 접 속하여 어디든지 메일을 보낼수 있다. 그밖의 모든 IP들은 일단 smtp 에 접속은 허용하지만
rcpthosts 에 등록 된 호스트로만 메일을 보낼수 있다 여기에서 그밖의 모든 IP들은 smtp로 접속하여 locathost,
xexx.net, test1.xexx.net, test2.xexx.net 로만 메일을 보낼수 있게된다 만일 관리자의 실수? 로
내부가상호스트등록이 누락이 된다면 쉽게 예를 들면 test2.xexx.net을 rcpthosts에 등록 하지 않았다면 외부메일계정
(rcpthosts를 참고해야 하는곳에 한함)에서 test2.xexx.net 으로 릴레이 가 허용이 되 지않기 때문에 결과적으로
test2.xexx.net 메일계정 사 용자들은 메일 보내기는 잘되는데 외부메일계정(rcpthosts 를 참고해 야 하는곳에
한함)으로 부터오는 메일은 받을수 없게 된다
10-3)/var/qmail/control/locals 이 설정파일은 릴레이
문제를 다룰 때 잘 언급이 않되었는데, mysql로 가상호스트를 설정하여 메일계정을 관리 한다면 반드시 수정이 필요하 다
이 설정파일의 특징은 mysql로 가상호스트메일을 구현시 내부 가상호스 트간의 릴레이를 설정한다, 쉽게 말하면 rcpthosts가
외부에서 접근하 는 IP들을 대상으로 릴레이를 설정한다면 locals 는 내부 가상호스트간의 릴레이를 설정한다고 생각하면 되며
일반적으로 localhost 와 메인호스 트 및 내부 가상호스트들을 모두 등록한다 그리고 주의할 것은 이 설정파일을 수정한후
적용시키기 위해서는 반드 시 qmail 데몬을 재시작 해야 한다
일반적인 설정예>> #vi
/var/qmail/control/locals localhost <-- 로컬호스트 xexx.net <-- 메인호스트
test1.xexx.net <-- 가상호스트1 test2.xexx.net <-- 가상호스트2 위의 설정을 쉽게
설명하면, locals 는 내부 가상호스트간의 릴레이 즉, locathost, xexx.net, test1.xexx.net,
test2.xexx.net 상호간의 릴레이에 관여한다 쉽게 설명하면 위 설정에서 관리자의 실수? 로 test2.xexx.net 이라는
내부가상호스트를 locals 에 등록하지 않았 다면, xexx.net 이나 test1.xexx.net에서
test2.xexx.net 으로 메일을 보내면 아래와 같은 오 류 메시지와 함께 메 일이 리턴될 것이다 Sorry.
Although I'm listed as a best-preference MX or A for that host, it isn't
in my control/locals file, so I don't treat it as local. (#5.4.6) 결과적으로
test2.xexx.net 메일계정 사용자들은 메일 보내기는 잘되는 데 내부 가상호스트로 부터오는 메일은 받 을수 없게 된다
10-4)smtp-auth 인증방식 출현으로 달라진점들.. 새롭게 추가된 smtp-auth 인증 방식은 위와 같은 기존의
릴레이 방식에 융통성을 둔것이라 할수 있다 smtp-auth 인증 방식은 rcpthosts 파일과 함께 작동되므로 반드시
rcpthosts 파일이 있어야 한다 동작원리는 일단 rcpthosts 에 등록된 서버에 대해서는 smtp-auth 인증
절차 없이 바로 릴레이를 허용시키며, rcpthosts 에 없는 곳으로의 릴레이는 smtp-auth 인증을 통해서 이루어
진다. 만일 rcpthosts 파일을 삭제해 버린다면 이것 역시 오픈릴레이가 되기 때문에 절대로 삭제해서는 안된다
사실상 릴레이 설정은 기존의 방법으로도 충분했다, 하지만 메일계정을 아웃룩에 설정하고 싶을 때, 고정IP라면 간단하게
tcp.smtp 에 한줄 더 추가해 줌으로서 해결 할수 있지만 유동 IP라면 어떻게 할것인가? 이제 더 이상 이런 걱정을 할
필요가 없다
위의 10-1)과 10-2)의 설정예를 smtp-auth 인증방식을 사용했을때에 적 용시켜보면...,
먼저 로컬과 192.168.xxx.xxx 범위에 속하는 내부사설IP들은 smtp 에 접 속하여 어디든지 메일을 보낼수 있다.
그밖의 모든 IP들은 일단 smtp 에 접속은 한 후 rcpthosts 에 등록된 호스트로는 smtp-auth 인증 과정 없이 메
일을 보낼수 있지만 그밖의 곳으로 메일은 smtp-auth 인증을 거친 후 발송되게 된다.
위의 릴레이설정을
정리해보면, 먼저 로컬과 192.168.xxx.xxx 범위에 속하는 내부사설IP들은 smtp 에 접 속하여 어디든지 메일을 보낼수
있다. 그밖의 모든 IP들은 일단 smtp 에 접속은 한 후 rcpthosts 에 등록된 호스트로는 smtp-auth 인증 과정
없이 메 일을 보낼수 있지만 그밖의 곳으로 메일은 smtp-auth 인증을 거친 후 발송되게 된다. 주의사항>>
rcpthosts 파일이 삭제되었다면 오픈릴레이다 rcpthosts 에서 test2.xexx.net 이 등록이 않되었다면
메일보내기 : test2.xexx.net->내부메일계정(o), test2.xexx.net->외부 메일계정(o)
메일받기 : 내부메일계정->test2.xexx.net(o), 외부메일계정- >test2.xexx.net(x,
rcpthosts를참고해야하는곳에한함) locals 에서 test2.xexx.net 이 등록이 않되었다면 메일보내기 :
test2.xexx.net->내부메일계정(o), test2.xexx.net->외부 메일계정(o) 메일받기 :
내부메일계정->test2.xexx.net(x), 외부메일계정- >test2.xexx.net(o)
단순히 위의
설정만으로도, 스펨방지 효과는 상당히 있으나 스펨메일이 차단이 그렇게 쉬운것만은 아닌 것 같 다.. 항상 주의 깊게 메일서버 를
채크해야 할 것이다
메일을 전달하기 위해서 메일 클라이언트(접속을 시도하는 프로그램이 메일 클라이언트이든, 다른 메일 서버이든, 클라이언트라고
하겠습니다.)가 는 일단 qmail 이 돌아가고 있는 서버의 25번 포트로 접속을 합니다.
그러면, 서버의
tcpserver 가 그 요청을 받습니다. 그리고 tcpserver 는 /etc/tcp.smtp 파일을 체크해서 (정확히는
/etc/tcp.smtp.cdb 입니다) 접속을 해 온 클라이언트의 ip 주소를 체크합니다. 만약, ip 주소가
/etc/tcp.smtp 에서 allow 로 되어 있는 ip 주소라면, 릴레이를 허용합니다. (해당 엔트리에 RELAYCLIENT
옵션이 있다면, /var/qmail/control/rcpthosts 파일도 무시합니다.)
그리고, tcpserver 는
qmail-smtpd 에게 연결을 넘겨줍니다. qmail-smtpd 는 접속해 들어온 클라이언트와
helo
servername.domain.com
으로 인사(?)를 나눕니다. 그리고,
mail
from:id@domain.com rcpt to:id@destdomain.com message..
등의 일반적인
smtp 처리를 합니다.
그런데,
rcpt to:
명령(?)이 클라이언트로부터 들어오게 되면,
만약 /var/qmail/control/rcpthosts 파일을 참조합니다. (클라이언트의 ip 가 /etc/tcp.smtp
파일에서 RELAYCLIENT 옵션을 주지 않은 ip 일 경우)
그리고, rcpt to: 뒤의 메일을 받을 사람의 도메인
네임(서버 이름)을 /var/qmail/control/rcpthosts 파일을 검색해서 찾을 수 없다면,
sorry,
릴레이를 허용하지 않습니다....
류의 메세지를 클라이언트에게 보내주고, 해당 메일을 전송해 주지 않습니다.
그러나, /etc/tcp.smtp 에서 allow 로 되어 있고, RELAYCLIENT 옵션을 부여한 ip 를 가진
클라이언트에서 25 번 포트로 접속해 들어오면, qmail-smtpd 는 /var/qmail/control/rcpthosts 파일을
체크하지 않고, rcpt to: 가 지정하는 도메인(메일주소)으로 메일을 보내(릴레이 하여)줍니다.
아웃룩, balsa
등의 메일 클라이언트를 이용하여 메일을 보낼때에도 이와 똑같은 일이 일어납니다. 메일 클라이언트는 지정된 메일 서버의 25번
포트로 접속해 들어가서, 메일을 보냅니다.
따라서, /etc/tcp.smtp 파일에, (회사내에서) 메일 클라이언트를
사용하는 사용자들의 ip 주소를 모두 적어주어야 아웃록 등의 클라이언트에서 메일을 보내 줄 수 있습니다.
그리고,
/etc/tcp.smtp 파일을 갱신했다면, tcprules 를 이용해서 반드시 /etc/tcp.smtp.cdb 도 갱신해 주어야
한다는 것을 잊지 않도록 합니다.
설정 파일들의 형식(문법)에 대한 자세한 것들은 기존의 문서를 참조하면 쉽게 알
수 있습니다. 전 단지, qmail 서버에 접속 요청이 들어왔을 때 서버가 어떻게 작동하는지에 대해 설명했을 따름입니다.
(제대로 맞게 했는지 불안하지만.. -_-a)
Life with qmail (줄여서: lwq)
Dave Sill
16 November 1999
윤주영 YOON, Joo-Yung
20 March 2000
지금까지 MTA로는 sendmail이 거의 독보위치이고, 사실상의 표준입니다만,
덩치가 매우 크고, 단일프로그램이며, 설치, 설정이 어렵습니다. 큐메일은
모듈구성방식이고, 설치와 설정이 쉬우며, 특히 보안에 많은 강점을 지니고
있습니다. 큐메일과 삶은 원제가 Life with qmail이고, 이메일 MTA중
하나인 qmail을 설치하고 운영하는 방법을 설명합니다. 큐메일에는 여러
사람이 공헌한 모듈이 매우 많지만, 꼭 필요한 프로그램들만 설명하므로
큐메일을 시작하는 분들께는 편하고 쉬운 안내서입니다.
______________________________________________________________________
목차
1. 소개
1.1 대상독자
1.2 큐메일이란?
1.3 qmail의 장점?
1.3.1 안전성
1.3.2 성능
1.3.3 신뢰성
1.3.4 간편성
1.4 경력
1.5 특징
1.5.1 설치
1.5.2 안전
1.5.3 메세지구조
1.5.4 SMTP 서비스
1.5.5 큐관리
1.5.6 되돌리기 (Bounces)
1.5.7 도메인으로 라우팅하기
1.5.8 SMTP 전달
1.5.9 포워딩과 멜링리스트
1.5.10 로컬전달
1.5.11 POP3 서비스
1.6 관련 팩키지
1.7 구성
1.8 면허
1.9 여타 MTA와 비교
1.10 문서
1.10.1 man page
1.10.2 Docs
1.10.3 FAQ
1.10.4 책
1.10.5 멜링리스트 고문서
1.10.6 기타 웹사이트
1.11 지원
1.11.1 멜링리스트
1.11.1.1 큐메일
1.11.1.2 qmailannounce
1.11.1.3 serialmail
1.11.1.4 ezmlm
1.11.2 상담역
1.12 Y2K
2. 설치
2.1 설치 논의
2.1.1 바이너리 대 소스코드
2.1.2 Tarball과 운영체제별 페키지
2.2 준비
2.3 시스템 필요사항
2.4 소스를 받으십시오.
2.5 소스를 컴파일하세요.
2.5.1 컴파일환경을 검증하세요.
2.5.2 배포판을 풉니다.
2.5.3 디렉토리를 만듭니다.
2.5.4 사용자와 그룹을 만듭니다.
2.5.5 컴파일을 하세요.
2.6 ucspi-tcp를 설치합니다.
2.7 daemontools를 설치합니다.
2.8 큐메일을 가동합니다.
2.8.1 /var/qmail/rc
2.8.2 시스템 기동 파일
2.8.3 기존에 설치된 MTA를 멈추고 무력하게 합니다.
2.8.4 시스템앨리어스를 만듭니다.
2.8.5 큐메일을 가동합니다.
2.9 설치를 시험합니다.
3. 설정
3.1 설정파일
3.2 릴레이
3.2.1 소개서
3.2.2 릴레이 금지
3.2.3 릴레이선택을 허용하기
3.3 다중 호스트네임
3.4 버츄얼도메인
3.5 앨리어스
3.6 qmail-users
3.6.1 간단한 할당
3.6.2 와일드카드 할당
3.6.3 qmail-user 프로그램들
4. 사용법
4.1 .qmail파일
4.1.1 프로그램전달
4.1.2 mbox 전달
4.1.3 maildir 전달
4.1.4 포워드 전달
4.1.5 연장주소
4.2 메세지 보내기
4.2.1 SMTP
4.2.2 /var/qmail/bin/sendmail
4.2.3 qmail-inject
4.3 환경변수
5. 고급토픽
5.1 procmail
5.2 POP 그리고 IMAP 서버
5.2.1 qmail-pop3d
5.2.1.1 qmail-pop3d의 구조
5.2.1.2 qmail-pop3d의 설치
5.2.2 qpopper
5.2.3 Cyrus
5.2.4 imap-maildir
5.3 POP와 IMAP 클라이언트
5.3.1 fetchmail
5.4 다중 RCPT 대 단일 RCPT 전달
5.5 VERP
5.6 문제해결
5.6.1 과정
5.6.2 로그
5.6.2.1 splogger
5.6.2.2 cyclog
5.6.2.3 록메세지
5.7 대형 서버
5.7.1 Scalable parallelism
5.8 Sendmail에서 큐메일로 옮기기
5.9 멜링리스트매니저 (Mailing List Managers: MLM's)
5.9.1 ezmlm
5.9.2 메이저도모
5.10 패치
5.10.1 DNS
5.10.1.1 패킷버퍼사이즈를 65536까지 밀어올리기
5.10.1.2 Christopher K. Davis의 패치 (AURL CDATA http://www.ckdhr.com/ckd/qmail-103.patchANAME CDATA (URL)URL)
5.10.2 qmail-ldap
5.11 QMTP (Quick Mail Transfer Protocol)
6. 부록
6.1 사례
6.2 관련 패키지
6.2.1 dot-forward
6.2.2 fastforward
6.2.3 ucspi-tcp
6.2.4 daemontools
6.2.5 qmailanalog
6.2.6 rblsmtpd
6.2.7 AID CDATA serial(LABEL)LABEL serialmail
6.2.8 mess822
6.2.9 ezmlm
6.2.10 safecat
6.2.11 maildrop
6.3 인터넷멜의 동작방법
6.3.1 메세지가 A지점에서 B지점으로 가는 방법
6.3.2 더많은정보
6.3.2.1 인터넷 RFC들
6.4 구조 AID CDATA architecture(LABEL)LABEL
6.4.1 모듈시스템구조
6.4.2 파일구조
6.4.3 큐구조
6.4.4 사진
6.5 어쩌다 한번씩 묻는 질문들 AID CDATA iFAQ(LABEL)LABEL
6.5.1 큐메일은 지연메세지를 어느 정도 자주 보냅니까?
6.5.2 저는 MX가 많은 대형사이트에 매일을 보내지 못하는데 왜그렇죠?
6.5.3 QUEUE_EXTRA?
6.6 에러메세지
6.7 의외의 실수
6.7.1 큐메일은 수퍼유저에게 멜을 전달하지 않습니다.
6.7.2 큐메일은 홈디렉토리가 없는 사용자에게 멜을 전달하지 않습니다.
6.7.3 큐메일은 사용자이름에 대문자를 쓰는 사용자에게 멜을 전달하지 않습니다.
6.7.4 큐메일은 홈디렉토리에 그룹이나 기타사용자에게 쓰기를 허락하는 사용자에게 멜을 전달하지 않습니다.
6.7.5 큐메일은 확장주소의 점(.)을 콜론(:)으로 바꿉니다.
6.7.6 큐메일은 확장주소의 대문자를 소문자로 바꿉니다.
6.7.7 큐메일은 /etc/hosts를 사용하지 않습니다.
6.7.8 큐메일은 SMTP활동을 록하지 않습니다.
6.7.9 큐메일은 지연통지를 만들지 않습니다.
6.7.10 큐메일은 /var/qmail/queue/lock/trigger가 틀린접근권한이거나 보통파일이면 늦어집니다.
6.8 lwq에 대한 FAQ
6.8.1 lwq의 소유자는?
6.8.2 lwq의 라이센스는?
6.8.3 lwq의 새판을 구할 수 있다는 것은 어떻게 통지받을 수 있습니까?
6.8.4 lwq공헌자와 팬은 어디서 이야기할 수 있습니까?
6.8.5 lwq는 다른 언어로 번역되었습니까?
6.8.6 lwq는 HTML이외에 포스트스크립트, PDF, 평범한글, 또는 다른형태로도 구할 수 있습니까?
6.8.7 lwq를 사용했더니, 시스템파괴, 하드디스크삭제, 백발을 했습니다.
______________________________________________________________________
1. 소개
1.1. 대상독자
「큐메일과 삶」 (Life with qmail, 이하 lwq라고 줄여서 부름)은 여유PC에
Linux를 이제막 설치한 일반 아마추어 (신참자)부터 경험 많은 시스템
관리자 또는 메일 서버 관리자에 이르기까지 큐메일을 운영하고자 하는
누구든지 그 대상입니다.
큐메일에 대한 풍부한 정보가 다양한 소스에 있습니다. 어떤것은
신참자들을 대상으로 하고, 어떠것은 독자가 경험있다고 여깁니다. lwq는
틈새들좀 메우고, 독자가 다음의 기술들만 있다고 여기는 방법으로 이러한
정보를 붙여서 단일소스로 만들고자 합니다.
o 유닉스에서 파일과 디렉토리를 다루기
o 웹브라우저나 FTP 클라이언트를 움직이기
o 지시를 따르기
1.2. 큐메일이란?
큐메일은 유닉스류 운영체제의 인터넷 Mail Transfer Agent (MTA)입니다.
대부분의 UNIX운영체제가 제공하고 있는 Sendmail시스템을 대체합니다.
Simple Mail Transfer Protocol (SMTP)을 이용해서 다른 시스템의 MTA와
메세지를 교환합니다.
--------------------------------------------------------------
유의점: 바른이름은 Qmail이 아니고 qmail입니다.
--------------------------------------------------------------
1.3. qmail의 장점?
당신의 운영체제도 Sendmail이라는 MTA를 제공하고 있으리라고 여기므로,
당신이 이문서를 읽고 계신다면, 당신은 아마 더 좋은 것을 찾고 있다고
생각합니다. 큐메일이 다른 vendor가 제공하는 MTA보다 더 좋은 이유는
다음과 같습니다.
1.3.1. 안전성
안전성이 높도록 설계되었습니다. Sendmail의 안전성은 오랫동안 심각한
문제였습니다. Sendmail이 처음 만들어졌을때는 Net계가 훨씬 더
우호있었습니다. 누구나 서로 알았고, 안전성을 제고하려고 설계하거나
코딩할 필요가 없었습니다. 오늘날 인터넷은 넷웍서버에게는 너무나 적들이
많은 환경입니다. Sendmail을 만든 Eric Allman께서도 많은 보안을
하셨지만, 진짜로 안전하게 만들려면 다시 설계하는 수 밖에 없었습니다.
1.3.2. 성능
멜보내기를 병행처리합니다. (20개가 default입니다.)
1.3.3. 신뢰성
한번 받은 메세지는 결코 놓치지 않습니다. 새 멜복스형태도 제공하는데,
NFS에서 locking하지 않고도 잘 작동합니다.
1.3.4. 간편성
다른 동급의 MTA보다 작습니다.
------------------------------------------------------------------------------------
유의점: 공식 홈페지인 <url url="http://pobox.com/~djb/qmail.html">에 장점을 더 넓게
올려놓았습니다.
------------------------------------------------------------------------------------
1.4. 경력
큐메일은 지금 시카고의 일리노잇대학에 수학교수로 계시는 Dan Bernstein
(DJB)께서 만드셨습니다 (홈페지: <http://pobox.com/~djb/djb.html>).
번스타인박사께서는 암호분야에서의 업적과, 미국정부를 상대로
암호화소스코드공개에 대한 소송으로도 잘 알려지셨습니다. 소송에
대해서는 <http://www.news.com/News/Item/0,4,36217,00.html?owv>를
참조하십시오.
큐메일의 시초공개판은 1996년 1월 24일에 나온 0.70 베타판입니다.
시초가마판은 1996년 8월 1일의 0.90입니다.
일반판으로 처음 처음나온것은 1997년 2월 20일의 1.0입니다. 지금의
버전인 1.03은 1998년 6월 15일에 나왔습니다.
1.5. 특징
큐메일홈페지 <http://pobox.com/~djb/qmail.html>에 큐메일특징을
종합해놓았습니다. 이번 단락은 그것을 많이 참고합니다.
1.5.1. 설치
o 당신의 유닉스기종에 자동적응하므로 이식 (porting)할 필요가
없습니다.
o 호스트별 자동설정
o 빠르게 설치되므로 결정할 사항이 많지 않습니다.
1.5.2. 안전
o 주소, 파일, 프로그램 등을 서로 깨끗하게 떼어놓았습니다.
o setuid 코드를 최소화했습니다.
o 룻(root) 코드를 최소화했습니다.
o Five-way trust partitioning--심도 있는 안전
o one-way 메세지 단편들, 또는 메세지내용전체 등을 골라서 할 수
있습니다. (``드문질문부록''에 있는 QUEUE_EXTRA는 무엇인가?를
보십시오.)
1.5.3. 메세지구조
o RFC 822과 RFC 1123을 따릅니다.
o address group을 전부 지원합니다.
o 구식 주소리스트를 RFC 822 형식으로 자동변환합니다.
o 지금의 sendmail user agent와 호환하기 위해서 sendmail 명령을
지원합니다.
o header줄길이의 한계는 메모리가 허용하는 데까지입니다.
o host masquerading (defaulthost를 보십시오.)
o user masquerading (MAILUSER와 MAILHOST를 보십시오.)
o Mail-Followup-To를 자동생성합니다. (QMAILMFTFILE을 보십시오.)
1.5.4. SMTP 서비스
o RFC 821, RFC 1123, RFC 1651, RFC 1652, RFC 1854 등의 준수
o 8-bit도 장애무
o RFC 931/1413/ident/TAP callbak등으로 스팸멜과 위조자 등의 추적방조
o relay 통제기능으로 외부의 권한이 없는 중계저지
o relay 통제와 alias간의 불간섭
o local IP주소 자동인식
o 버퍼별 timeout
o hop counting
o 병렬처리 한도 (ucspi-tcp를 이용)
o (ucspi-tcp를 이용해서) 악용자들로부터의 접속거부
o 권한인정된 client에 대한 중계와 메세지 재작성
o (rblsmtpd를 통한) RBL/ORBS지원 선택
1.5.5. 큐관리
o 큐에 더해진 메세지의 즉각처리
o 병렬처리한계
o 큐디렉토리의 분열로 비대한 큐의 속도저하 방지
o 2차방정식에 의한 재시도 스케쥴로 오래된 메세지의 처리회수 저하
(``드문질문부록''를 보세요)
o 메세지 재시도의 독립 스케쥴
o 자동 안전 큐하기로 시스템이 무너져도 멜을 잃지 않음
o 수신자별 자동 첵포인트하기
o 자동 큐청소
o 큐보기 (qmail-qread를 보세요)
o (qmailanalog를 이용한) 자세한 전달통계
1.5.6. 되돌리기 (Bounces)
o 기계와 사람이 읽을 수 있는 QSBMF 되돌림 메세지
o 언어에 상관없는 RFC 1893 에러코드인 HCMSSC 지원
o 이중 되돌림으로 postmaster에게도 보냄
1.5.7. 도메인으로 라우팅하기
o 로컬호스트에 대해서는 여러 이름이 가능함 (로컬을 참조하세요.)
o 여러 버추얼도메인 (버추얼도메인을 보세요.)
o 도메인 와일드카드 (버추얼도메인을 보세요.)
o 설정가능한 "percent hack" 지원 (percenthack을 보세요.)
o UUCP hook
1.5.8. SMTP 전달
o RFC 821, RFC 974, RFC 1123을 따름
o 8빗을 처리
o 다운된 호스트를 자동 backoff
o smarthost, localnet, mailertable등의 인공지능 라우팅 (smtproutes를
보세요.)
o 버퍼별 타임아웃
o SLIP/PPP에 가장 알맞은 (serialmail을 통한) 수동 SMTP 큐
o (serialmail을 통한) autoTURN
1.5.9. 포워딩과 멜링리스트
o sendmal의 .forward를 (dot-forward를 이용해서) 따름
o (fastforward를 통한) hashed forwarding 데이터베이스
o sendmail의 /etc/aliases를 (fastforward를 이용해서) 따름
o 어드레스 와일드카드 (.qmail-default를 보세요.)
o 바운스와 휴가메세지를 자동전환하는 멜링리스트소유자
o 멜링리스트바운스를 위한 자동 수신자 인식인 VERP
o Delivered-To의 룹을 자동차단을 호스트간에도 지원
1.5.10. 로컬전달
o 어드레스계층을 사용자가 통제하므로 fred는 fred-anything mbox 전달을
통제함
o 믿을수있는 NFS 전달 (maildir를 보세요.)
o procmail 등 사용자가 통제하는 프로그램 전달 (qmail-command를
보세요)
o 새멜통지 선택 (qbiff를 보세요)
o NRUDT 반송 증표의 선택 (qreceipt를 보세요.)
o 조건 필터링 (condredirect와 bouncesaying을 보세요.)
1.5.11. POP3 서비스
o RFC 1939를 따름
o UIDL 지원
o TOP 지원
o APOP hook
o (checkpassword를 이용해서) 패스워드검사의 모듈화
1.6. 관련 팩키지
큐메일에서 한 툴은 단일의 잘 정의된 함수로 작동하고, 복합함수는 여러
간단한 툴들을 파입라인으로 연결하여 만들어야 한다는 유닉스의
전통철학을 따릅니다. 다른 방법으로는 더욱더 복합된 툴들을 만들어서
간단한 툴들의 많은 기능을 재구성하는 것입니다.
그렇다면, 여러분은 큐메일 하나로 모든것을 다하기를 바랄지도
모르겠지만, 큐메일이 모든 것을 혼자하지 않는다는 것은 놀라운 일이
아닙니다. 이제, 큐메일을 위해 만든 가장 인기있는 add-on들중 몇개가
여기에 있습니다.
o dot-forward: sendmail의 .forward 파일 호환 앳온
o fastforward: sendmail의 alias 데이터베이스 호환 앳온
o ucspi-tcp : inetd 대체
o daemontools: 데몬과 그 로그를 관리하는 툴집합
o qmailanalog: 큐메일 로그파일 분석툴집합
o rblsmtpd : anti-spam 툴
o serialmail : 저속넷웍상의 mailing을 위한 툴
o mess822 : 인터넷멜메세지의 해석기 툴
o ezmlm : 큐메일을 위한 멜링리스트 관리자
1.7. 구성
``구조부록''에 큐메일의 기능구조와 실제구조를 다루었습니다. 한마디로,
큐메일은 서로다른 일을 하는 프로그램(모듈)들로 이어져 있습니다.
1.8. 면허
큐메일의 복사권리는 저자인 Dan Bernstein에 있고, 사용자권리진술로
배포하지 않습니다. <http://pobox.com/~djb/softwarelaw.html>에 보시면,
미국 복사권리법에서 당신의 권리라고 저자가 생각하는것을
적어놓았습니다. <http://pobox.com/~djb/qmail/dist.html>에서 그는
큐메일의 소스코드의 배포권리를 허가했습니다. 바이너리배포는 그곳과
<http://pobox.com/~djb/qmail/var-qmail.html>에 설명된대로 하면
용인됩니다만, 현재 누구도 실제로 하지않고 있습니다.
쉽게 예기해서 당신은 어떤 목적이든지 큐메일을 사용할 수 있고, 고치지
않은 큐메일소스코드배포판과 var-qmail 바이너리 배포판을 다시배포할 수
있고, 큐메일에 대한 패치를 배포할 수 있습니다. 수정된 큐메일소스코드나
비 var-qmail바이너리배포판을 배포할 수 없습니다.
1.9. 여타 MTA와 비교
이 주제로 책을 쓸 수도 있지만, 읽기에 지루할 것입니다. 가장 많이 쓰는
유닉스 MTA들 몇개를 큐메일과 간단히 비교했습니다.
MTA 성숙 안전 특징 성능 Sendmail성 모듈화
qmail 중간 높음 높음 높음 add-on 되있슴
Sendmail 높음 낮음 높음 낮음 없슴 안됨
Postfix 낮음 높음 중간 높음 맞음 되있슴
exim medium low high medium yes no exim
중간 낮음 높음 중간 맞음 안됨
Sendmail성이란 해당 MTA가 여러면에서 Sendmail같아서, .forward 파일이나
/etc/aliases나 /var/spool/mail 등의 사용을 Sendmail에서 다른 MTA로
전환할 때 사용자들이 고려할 점이 없도록 하는 것입니다.
Cameron Laird가
<http://starbase.neosoft.com/~claird/comp.mail.misc/MTA_comparison.html>에
이것들과 다른 무료, 유료 MTA를 비교한 웹페지를 만들었습니다.
1.10. 문서
1.10.1. man page
큐메일배포판은 man page를 완비했습니다. 설치하면 /var/qmail/man에
놓입니다. MANPATH환경변수에 그 디렉토리를 추가하시기 바랍니다.
그러면, "man qmail항목"이라고 하시면 해당 man page를 보여줍니다.
다음의 주소에 HTML형식으로 온라인상에서도 man page를 참고하실 수
있습니다.
---------------------------------------------------------------------------------------
유의점: 큐메일의 man page에는 정보가 있지만, 함축되고 학술형식으로
썼으므로 꼼꼼하게 읽으셔야 합니다. 한부를 인쇄하여 쭉 읽으셔서 무엇이
어디에 있는지 파악해놓아야 편합니다. 여러 장이지만 정보가 되풀이되지
않으므로, 어디에 무엇이 있는지 알지 못하면 찾기에 힘듭니다.
---------------------------------------------------------------------------------------
1.10.2. Docs
큐메일 배포판은 /var/qmail/doc에 설치하는 다음의 서류들을 제공합니다.
o FAQ : Frequently Asked Questions (답과 함께)
o INSTALL*: 설치문서
o PIC.* : 큐메일의 핵심기능방법을 설명. 더 이상의 설명은 부록의
``구조항목''을 보십시오.
o 다양한 기타 설치관련 문서
다음의 주소에서 온라인으로 참고하실 수 있습니다.
o <http://www.qmail.org/man/index.html>
1.10.3. FAQ
다음에 공식 FAQ가 두개 있습니다.
o /var/qmail/doc/FAQ: 일반 텍스트판,
o <http://pobox.com/~djb/qmail/faq.html>: web FAQ
web FAQ가 더 충실합니다.
1.10.4. 책
John Levine과 Russel Nelson이 O'Reilly & Associates
<http://www.oreilly.com>에서 큐메일책을 썼는데, 금년말에 구입 가능할
것입니다. Russel과 John은 qmail 멜링리스트에 자주 기고하시고,
큐메일에 관한 지식과 능력을 통해서 큐메일을 효과있고 품위있게
의사소통하는 것을 보여주셨습니다. O'Reilly는 컴퓨팅관련출판에서 명성이
탁월합니다. 이 책은 의심의 여지없이 큐메일의 "bible"이 될겁니다.
1.10.5. 멜링리스트 고문서
Dan Bernstein이 유지하는 큐메일의 이메일 멜링리스트는 귀중한
정보소스입니다. 멜링리스트메세지의 고문서는 다음에 보관됩니다.
o <http://www.ornl.gov/cts/archives/mailing-lists/qmail/>
그 고문서에 대한 서치엔진은 다음에 있습니다.
o <http://www-archive.ornl.gov:8000/>
기타 web 고문서는 다음에서 얻을 수 있습니다.
o <http://www.egroups.com/list/djb-qmail/?refstop=1 >
o <http://msgs.securepoint.com/qmail/>
큐메일에 관한 대부분의 질문은 먼저 멜링리스트 고문서를 뒤지면 답을
얻을 수 있습니다.
1.10.6. 기타 웹사이트
o <http://pobox.com/~djb/qmail.html>: 큐메일 공식 홈페지
o <http://www.qmail.org>: 큐메일 비공식 홈페지로서 add-on과 패치에
관한 정보와 다른 사이트에 있는 좋은 큐메일 웹페지에 대한 링크가
많습니다.
1.11. 지원
1.11.1. 멜링리스트
다음의 멜링리스트는 cr.yp.to에 있습니다. 스패머가 이메일주소를 걷지
못하게 하려고 완전하고 유효한 주소와 "mailto" URL을 쓰지 않습니다.
멜링리스트는 ezmlm으로 관리하는데, 주소별로 고유기능을 담당합니다.
o listname@list.cr.yp.to: 메세지송부주소로서 이리로 메세지를 보내시면
모든 가입자에게 보내집니다. 가입/가입해제 신청을 이리로 하지면
안되는데, 그러면 가입(해제)가 되지도 않을 뿐만 아니라, 가입자들을
성가시게 하기 때문입니다.
o listname-help@list.cr.yp.to: "help"주소입니다. 명령주소와
일반사용정보를 보내드립니다.
o listname-subscribe: 빈 메세지를 이리로 보내면 가입됩니다.
o listname-unsubscribe: 빈 메세지를 이리로 보내면 가입해제됩니다.
예를 들면 joe@example.com와 같이 가입(해제)주소를 적으시려면 다음의
주소로 메세지를 보내십시오.
o listname-subscribe-joe=example.com@list.cr.yp.to
1.11.1.1. 큐메일
주요 큐메일 멜링리스트. serialmail을 빼고는 큐메일에 관련된 모든것에
관한 토론과 질문과 대답. 질문을 보내시기 전에 FAQ를 읽으시고,
멜링리스트 고문서를 뒤지시기 바랍니다. 질문을 하실때에는 다른 사람이
답해줄 수 있도록 다음과 같은 충분한 내역을 포함하시기 바랍니다.
o 무엇을 하셨습니까? 설정을 어떻게 하셨습니까? 무엇이 중요한 지
모르시면 qmail-showctl명령의 결과물을 포함하십시오. 무엇을 얻으려
하셨습니까? 무슨 행동을 하셨습니까?
o 무엇이 일어나길 바라셨습니까? 무슨 결과를 얻으려고 하셨습니까? 읽는
분이 추측해서 알것이라고는 생각지 마십시오.
o 무슨일이 일어났습니까? 실제 결과를 설명하십시오. 로그파일을 잘라서
포함하시고, 메세지사본을 헤더와 함께 포함하십시오.
1.11.1.2. qmailannounce
새로운 발행은 여기에 공표됩니다. 가입신청주소는 없고, 읽기전용입니다.
1.11.1.3. serialmail
serialmail 패케지관련 토론입니다.
1.11.1.4. ezmlm
ezmlm 멜링리스트 관리에 대한 토론입니다.
1.11.2. 상담역
<http://www.qmail.org/top.html#paidsup>를 보시면 상용 지원
제공자명단이 있습니다.
1.12. Y2K
큐메일은 Y2K문제가 없습니다. <http://www.qmail.org/qmaily2k.html>를
보십시오.
2. 설치
큐메일을 설치하는 것을 설명합니다. 경험있는 시스템애드민은
소스배포판에 있는 INSTALL의 지시사항을 따라서 큐메일을 설치할 수
있습니다. INSTALL지시사항은 공식 설치지시사항입니다. 그것은 본문서인
lwq의 지시사항보다 복잡하고, 읽는 사람이 경험있는 시스템애드민과
멜애드민이라고 여깁니다.
-----------------------------------------------------------------------------
유의점: 다음의 지시사항을 읽으신다면 전체항목을 읽어서 전체과정을 익히시기
바랍니다.
-----------------------------------------------------------------------------
2.1. 설치 논의
2.1.1. 바이너리 대 소스코드
미리컴파일된 배포판관련 라이센싱제약때문에, 큐메일은 보통
소스코드배포판으로 설치합니다.
소스코드와 바이너리를 구분하시기 어렵다면, 집으로 피지를 배달한다고
가정하십시오. 바이너리버전피자는 즉시 먹을 수 있게 배달됩니다.
소스코드피자는 밀가루, 효모, 치즈, 토핑, 그리고 요리방법 등을 포함한
장비일체로 배달됩니다. 소스코드설치는 일을 좀더 많이 해야 하지만,
지시사항을 철저하게 따르면, 그 결과는 같거나 더 좋습니다. 직접 만들어
먹는 피자는 더 신선하고, 좋아하는 토핑을 맞춰먹을 수 있으며, 자신이
만든 피자에 대해, 그것이 어떻게 만들어졌는 지에 대해 더 많이 알게
됩니다.
2.1.2. Tarball과 운영체제별 페키지
소스코드설치를 자동으로 하는 방법을 제공하는 운영체제도 있습니다.
피자로 다시 비유하자면, 단추만 누르면 피자가 저절로 구워지도록 재료와
지시사항을 패키지하는 것입니다.
훌륭하지 않습니까?
실제로는 그렇게 좋지만은 아닌 방법입니다. 패키지로 묶기가 매우 힘들고,
생각대로 움직이지 않을 수가 있습니다. 또한 그것도 소프트웨어이므로,
다른것들처럼, 벅이 있을 수도 있습니다. 벅이 없더라도, 그 편리함은 그
만한 대가를 치루게 됩니다. 스스로 만들어보는 피자의 이점인 자신의
기호에 맞춰서 토핑을 조정하고, 피자가 어떻게 만들어지고, 어떻게
작용하는 지 등을 잃게 됩니다.
큐메일이 피자라면, 스스로 컴파일해볼 수도 있을지 모릅니다. 그런데,
피자가 아닙니다. 복잡한 시스템이 되어놔서 잘 운영하려면 설치자와
유지자는 잘 이해해야 합니다. 자동설치 큐메일이 수동설치판보다
설치하기에 쉽습니다만, 수동설치판이 설정하고 문제점을 해결하는 데
쉽습니다. 시스템에 큐메일을 한번만 설치하면 되지만, 때때로
재설정해야할 수도 있고, 생각대로 멜이 흐르지 않는 이유를 파악해야 할
수도 있습니다.
이래서, 저는 큐메일을 RedHat이나 기타 자동설치번들이 아닌 소스크드
tarball로 설치하시기를 권고합니다.
2.2. 준비
큐메일을 시스템에 설치하기 전에, 큐메일설치를 처음으로 한다면, 몇가지
고려사항이 있습니다.
o 가능하면 큐메일을 연습시스템에 설치하십시오. 이래야 중요멜을 잃지
않고, 또는 사용자들에게 멜서비스를 단절하지 않고도 실수해볼 기회가
생깁니다.
o 여분시스템이 없거나 시스템에 이미 sendmail이나 smail이나 기타 MTA
등을 운영하여 멜이 처리되고 있어도, 기존서비스와 충돌하지 않으면서
큐메일의 대부분을 시험할 수 있습니다.
o 다른 MTA를 큐메일로 대체할 때, 큐메일의 경험이 많더라도, 계획을
세워야 좋습니다.
2.3. 시스템 필요사항
큐메일은 대부분의 유닉스와 유닉스류 시스템에 설치되고 운영됩니다만
몇가지 필요사항이 있습니다.
o 컴파일동안 컴파일부분에 약 10메가바잇의 여유공간. 컴파일후
옵젝트파일을 제거하면 4메가만 남습니다.
o 컴파일러, 시스템헤더파일, 그리고 라입러리 등을 포함하는 완전한 C
개발시스템. 컴파일지시사항은 필요한 부분이 있으면 알려줍니다.
o 바이너리, 문서, 그리고 설정 등의 파일에 대해 2-3메가바잇.
o 큐에 대한 충분한 디스크공간. 소규모 단일사용자 시스템은
2-3메가바잇만 있으면 됩니다. 대용량 서버는 2-3 기가바잇이 있어야
될지도 모릅니다.
o 호환 운영 시스템. 대부분의 유닉스종은 됩니다. 소스트리의 README를
보면 호환판의 리스트가 있습니다.
o DNS로의 접근을 강력히 권장합니다. 그렇지 않으면 큐메일은
smtproutes의 config 파일에 설정된 원격시스템으로만 보냅니다.
o 적절한 넷웍 연결. 큐메일은 잘 연결된 시스템에 대해 설계되어서 28.8k
다이얼업에서 멜링리스트를 사용하고 싶지 않을지도 모릅니다. 큐메일을
연결이 나쁜 시스템에서 사용할 수 있도록 하려고 serialmail 패키지가
설계되었습니다. 더 많은 정보는 관련패키지 부록의 ``시리얼항목''을
보시면 됩니다.
2.4. 소스를 받으십시오.
오우케이, 이제 큐메일을 설치할 수 있도록 필요사항에 맞는 시스템을
준비하셨군요. 첫번째 단계는 큐메일과 다른 애드온의 소스코드를
다운로드하는 것입니다. 큐메일은 당연히 필요하고요, ucspi-tcp와
daemontools도 필요할 것입니다.
o qmail, <ftp://koobera.math.uic.edu/www/software/qmail-1.03.tar.gz>
o ucspi-tcp, <http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz>
o daemontools,
<ftp://koobera.math.uic.edu/www/daemontools/daemontools-0.61.tar.gz>
웹브라우저나 FTP 클라이언트를 이용해서 이 파일들을 가져오세요.
2.5. 소스를 컴파일하세요.
2.5.1. 컴파일환경을 검증하세요.
첫번째 할일은 프로그램을 컴파일하기에 필요한 툴을 갖추었는 지의
확인입니다. 이것을 결정하는 것은 사용중인 유닉스종류에 따릅니다.
말씀드릴 수 있는 가장 쉬운 방법은, 보장되지는 않지만, 해보는 겁니다.
-----------------------------------------------------------------------------
유의점: 이것들중 하나라도 통과하면, 다음 항목으로 넘어가셔도 됩니다.
-----------------------------------------------------------------------------
명령행프롬트에서, cc라 쓰고, 엔터를 누르세요:
$ cc cc: No input files specified $
답이 비슷하게 나오면, C 컴파일러가 경로에 있는 것입니다. 그렇지
않더라도, 설치되어
있지 않다는 것은 아닙니다. 설치되어 있을 지 모르지만, 경로에
포함되어 있지 않을 수도 있습니다. 물론, 설치되어 있지 않을 수도
있습니다. 이렇게 해보세요. "
o /usr/bin/cc
o /usr/bin/gcc
o /usr/local/bin/cc
o /usr/local/bin/gcc
o /usr/ccs/bin/cc
소용이 없으면, 플랫폼 특성에 맞는 방법으로 하셔야 합니다.
프롬트에서 다음 중 하나를 하시는데, 사용중인 OS에 따르셔야
합니다.
o Red Hat Linux: rpm -qa | grep gcc or rpm -qa | grep egcs
o FreeBSD: GCC가 디폴트로 포함됩니다.
이번 항목에서는 큐메일을 실제로 컴파일하는 단계를 거칩니다.
오려붙이기가 간편하지만, 그렇게 필요하지는 않습니다.
2.5.2. 배포판을 풉니다.
여기까지 오셨으면, 이미 C 컴파일러와 tarball을 준비하신 겁니다. 타볼을
작업하실 디렉토리로 복사하거나 옮기세요. /usr/local/src가 좋은데, 이
경우에는 /usr/local/src/qmail를 세 패케지 모두에 사용할 수 있습니다.
mkdir -p /usr/local/src/qmail
mv *.tar.gz /usr/local/src/qmail
/usr/local/src/qmail에 세 패케지가 전부 있으므로, 그것들을 푸십시오.
룻이 아니라면 여기에서는 룻이 되셔야 합니다. 프롬트에서 다음과 같이
하세요:
su -
cd /usr/local/src/qmail
gunzip qmail-1.03.tar.gz
tar xvf qmail-1.03.tar
gunzip ucspi-tcp-0.84.tar.gz
tar xvf ucspi-tcp-0.84.tar
gunzip daemontools-0.61.tar.gz
tar xvf daemontools-0.61.tar
rm *.tar # 여유공간이 없을 때 하는 선택사항
qmail-1.03, ucspi-tcp-0.84, daemontools-0.61 등의 섭디렉토리가
생깁니다. qmail-1.03 디렉토리로 가시면 시작하겠습니다.
cd qmail-1.03
2.5.3. 디렉토리를 만듭니다.
필요한 섭디렉토리는 큐메일 설치 프로그램이 만들므로, 큐메일
홈디렉토리만 만들어 주면 됩니다.
mkdir /var/qmail
그러면 다음 항목으로 갑니다.
------------------------------------------------------------------------------
유의점: 큐메일파일들을 /var가 아닌 다른 곳에 놓고 싶으시면, /var/qmail디렉토리에
그곳을 가리키는 심볼릭 링크를 만드시면 됩니다.
예를 들면, 다음과 같이 하시면 됩니다.
mkdir /var/qmail
ln -s /usr/man /var/qmail/man
mkdir /etc/qmail
ln -s /etc/qmail /var/qmail/control
ln -s /usr/sbin /var/qmail/bin
--------------------------------------------------------------------------------
2.5.4. 사용자와 그룹을 만듭니다.
필요한 사용자와 그룹을 만드는 가장 쉬운 방법은 작은 스크립트를
만들어서 하는 것입니다. 소스디렉토리에 INSTALL.ids 파일이 있습니다.
거기에는 여러 프랫폼에 해당하는 명령행이 있는데, 그 파일을 다른
이름으로 복사해서 편집하면 빠르고 쉽습니다.
cp INSTALL.ids IDS
좋아하시는 에디터로 필요한 행을 빼고 다 지웁니다. 예를 들면, 편집후에
FreeBSD에 대한 IDS는 다음과 같습니다.
pw groupadd nofiles
pw useradd alias -g nofiles -d /var/qmail/alias -s /nonexistent
pw useradd qmaild -g nofiles -d /var/qmail -s /nonexistent
pw useradd qmaill -g nofiles -d /var/qmail -s /nonexistent
pw useradd qmailp -g nofiles -d /var/qmail -s /nonexistent
pw groupadd qmail
pw useradd qmailq -g qmail -d /var/qmail -s /nonexistent
pw useradd qmailr -g qmail -d /var/qmail -s /nonexistent
pw useradd qmails -g qmail -d /var/qmail -s /nonexistent
실행하려면, chmod를 써서 실행파일로 만드시거나 sh로 실행하십시오.
첫번째 방법:
chmod 700 IDS
./IDS
두번째 방법:
/bin/sh IDS
스크립트의 실행이 완료되어 사용자와 그룹이 생기면 다음항목으로 갑니다.
그러나, INSTALL.ids에 해당 시스템이 없으면 어쩝니까? 수동으로 그것들을
만들어야 합니다. 좋아하는 에디터를 사용해서 /etc/group을 편집하세요.
다음 두 줄을 그 파일끝에 첨가하십시오.
qmail:*:2107:
nofiles:*:2108:
-------------------------------------------------------------------------
유의점: 2107과 2108이 사용중인 것이 아님을 확인하셔야 합니다.
-------------------------------------------------------------------------
다음으로는, vipw를 이용해서 다음 줄들을 그 파일의 끝에 붙이십시오.
(대부분의 시스템에 vipw가 있지만, 없으면 에디터로 /etc/passwd를
편집합니다.)
alias:*:7790:2108::/var/qmail/alias:/bin/true
qmaild:*:7791:2108::/var/qmail:/bin/true
qmaill:*:7792:2108::/var/qmail:/bin/true
qmailp:*:7793:2108::/var/qmail:/bin/true
qmailq:*:7794:2107::/var/qmail:/bin/true
qmailr:*:7795:2107::/var/qmail:/bin/true
qmails:*:7796:2107::/var/qmail:/bin/true
------------------------------------------------------------------------------------
유의점: 7790-7796이 사용중이지 않는다는 것과 2107과 2108이 위에서 만든 그룹아이디와
같다는 것을 확인하십시오.
------------------------------------------------------------------------------------
이런 것들을 해당파일의 끝에만 첨가해야 하는 것은 아니지만, 그래야
설명하기가 제일 쉽습니다.
다음 항목으로 가실 준비가 되셨군요.
2.5.5. 컴파일을 하세요.
이제 큐메일을 컴파일하실 준비가 되었습니다.
디렉토리가 PATH환경변수에 있지 않으면 conf-cc와 conf-ld를
편집하십시오. 컴파일러가 gcc이고, PATH에 있다고 하면, conf-cc와 conf-
ld를 가볍게 편집하고, cc를 gcc로 바꾸십시오.
그렇게 하셨으면 명령행 프롬트에 다음과 같이 하세요.
make setup check
컴파일이 끝나면, 설치후설정을 하셔야 합니다. 이 일을 쉽게 해주는
스크립트가 두어개 있습니다.
DNS가 제대로 설정되었다면, 다음 스크립트를 실행하기만 하면 됩니다.
./config
어떤 이유로 config가 DNS에서 hostname을 찾지 못하면, config-fast
script를 실행하셔야 합니다.
./config-fast 호스트네임.완전.경로
예를 들면, 도메인이 example.com이고, 당신컴퓨터의 호스트네임이
dolphin이라면, config-fast를 다음과 같이 실행합니다.
./config-fast dolphin.example.com
큐메일이 시스템에 설치되어서 가동될 준비가 되었습니다! 다음항목은
큐메일을 가동하고 시험하는 단계를 안내합니다.
2.6. ucspi-tcp를 설치합니다.
먼저번에 qmail, ucpsi-tcp, daemontools 타볼을 풀었습니다. 예제에서
그것들을 /usr/local/src/qmail에 풀었습니다. 자 ucpsi-tcp디렉토리로
옮깁시다.
cd /usr/local/src/qmail/ucspi-tcp-0.84
똑같이 해줍니다.
그런뒤에 다음과 같이 하십시오.
make
make setup check
2.7. daemontools를 설치합니다.
daemontools 컴파일디렉토리로 이통합니다.
cd /usr/local/src/qmail/daemontools-0.61
또 한번, conf-cc와 conf-ld를 qmail과 ucspi-tcp 컴파일시 고쳤으면, 이
디렉토리에서도 똑같이 합니다.
그리고 다음과 같이 합니다.
make
make setup check
2.8. 큐메일을 가동합니다.
2.8.1. /var/qmail/rc
/var/qmail/boot디렉토리에는 여러가지 설정에 대한 본보기 큐메일 붓
스크립트가 있습니다. /var/spool/mail 대 $HOME/Mailbox, procmail 또는
dot-forward를 이용하기, 그리고 이것들의 다양한 결합. 한번 부담없이
검토해보시기 바랍니다. 우리는 설치를 위해서 다음을 이용하겠습니다.:
#!/bin/sh
# Using stdout for logging
# Using control/defaultdelivery from qmail-local to deliver messages by default
exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start "`cat /var/qmail/control/defaultdelivery`"
에디터로 위의 내용을 /var/qmail/rc로 만드시고, 다음과 같이 명령합니다.
chmod 755 /var/qmail/rc
mkdir /var/log/qmail
이쯤에서, .qmail파일이 전달하지 못하는 메세지들에 대한 기본전달모드를
결정해야 합니다. 다음의 테이블에 몇가지 공통선택이 간략히 예시되어
있습니다.
Mailbox
format Name Location defaultdelivery Comments
mbox Mailbox $HOME ./Mailbox most common, works
with most MUA's
maildir Maildir $HOME ./Maildir/ more reliable, less
MUA support
mbox username /var/spool/mail See INSTALL.vsm traditional UNIX
mailbox
정보를 더 원하시면 INSTALL.mbox, INSTALL.maildir, INSTALL.vsm 등을
보십시오.
기본 멜복스 형태를 고르시려면, 위의 테이블의 defaultdelivery 값을
/var/qmail/control/defaultdelivery에 적어넣으십시오. 예) 표준 큐메일
Mailbox 전달을 선택하시려면 다음과 같이 합니다.
echo ./Mailbox >/var/qmail/control/defaultdelivery
----------------------------------------------------------------------------------
유의점: defaultdelivery는 표준 큐메일 통제 파일이 아닙니다. 위의 /var/qmail/rc파일의
특징입니다.
----------------------------------------------------------------------------------
2.8.2. 시스템 기동 파일
/var/qmail/rc 스크립트를 수동으로 실행하셔야 하면, 큐메일은
부분가동합니다. 그러나, 우리는 큐메일이 시스템이 부팅할때마다 자동으로
가동하기를 원하고, 시스템이 정지할 때는 깨끗하게 꺼지기를 원합니다.
이것은 startup/shutdown스크립트를 다음과 같이 작성하면 됩니다.
#!/bin/sh
PATH=/var/qmail/bin:/usr/local/bin:/usr/bin:/bin
export PATH
case "$1" in
start)
echo -n "Starting qmail: svscan"
cd /var/qmail/supervise
env - PATH="$PATH" svscan &
echo $! > /var/run/svscan.pid
echo "."
;;
stop)
echo -n "Stopping qmail: svscan"
kill `cat /var/run/svscan.pid`
echo -n " qmail"
svc -dx /var/qmail/supervise/*
echo -n " logging"
svc -dx /var/qmail/supervise/*/log
echo "."
;;
stat)
cd /var/qmail/supervise
svstat * */log
;;
doqueue|alrm)
echo "Sending ALRM signal to qmail-send."
svc -a /var/qmail/supervise/qmail-send
;;
queue)
qmail-qstat
qmail-qread
;;
reload|hup)
echo "Sending HUP signal to qmail-send."
svc -h /var/qmail/supervise/qmail-send
;;
pause)
echo "Pausing qmail-send"
svc -p /var/qmail/supervise/qmail-send
echo "Pausing qmail-smtpd"
svc -p /var/qmail/supervise/qmail-smtpd
;;
cont)
echo "Continuing qmail-send"
svc -c /var/qmail/supervise/qmail-send
echo "Continuing qmail-smtpd"
svc -c /var/qmail/supervise/qmail-smtpd
;;
restart)
echo "Restarting qmail:"
echo "* Stopping qmail-smtpd."
svc -d /var/qmail/supervise/qmail-smtpd
echo "* Sending qmail-send SIGTERM and restarting."
svc -t /var/qmail/supervise/qmail-send
echo "* Restarting qmail-smtpd."
svc -u /var/qmail/supervise/qmail-smtpd
;;
cdb)
tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
chmod 644 /etc/tcp.smtp*
echo "Reloaded /etc/tcp.smtp."
;;
help)
cat <<HELP
stop -- stops mail service (smtp connections refused, nothing goes out)
start -- starts mail service (smtp connection accepted, mail can go out)
pause -- temporarily stops mail service (connections accepted, nothing leaves)
cont -- continues paused mail service
stat -- displays status of mail service
cdb -- rebuild the tcpserver cdb file for smtp
restart -- stops and restarts smtp, sends qmail-send a TERM & restarts it
doqueue -- sends qmail-send ALRM, scheduling queued messages for delivery
reload -- sends qmail-send HUP, rereading locals and virtualdomains
queue -- shows status of queue
alrm -- same as doqueue
hup -- same as reload
HELP
;;
*)
echo "Usage: $0 {start|stop|restart|doqueue|reload|stat|pause|cont|cdb|queue|help}"
exit 1
;;
esac
exit 0
이 스크립트는 <http://Web.InfoAve.net/~dsill/qmail-script-
dt61.txt>에서도 구할 수 있습니다.
-------------------------------------------------------------------------------------
유의점: 시스템이 재부팅한다음에 큐메일이 곧 없어지면, 스크립트의 "start"항목에 있는
env 명령을 nohup으로 덧붙입니다.
예)
nohup env - PATH="$PATH" svscan &
-------------------------------------------------------------------------------------
에디터로 스크립트를 만들거나 웹브라우저로 다운로드해서 시스템의
init.d디렉토리에 설치하시는데, 다음과 같은 장소가 됩니다.
o /etc/init.d
o /sbin/init.d
o /etc/rc.d/init.d
스크립트를 qmail이라고 이름붙이십시오. 스크립트를 몇개의 rc디렉토리에
링크시키셔야 합니다. 이 데렉토리들은 rcN.d같이 되어있는데, N은 적용
runlevel입니다. 기동디렉토리 구조가 복잡해서 본 문서에는 다루지
않습니다. 그러니 간단한 지시사항이 맘에 차지 않으시면 시스템문서를
참조하십시오. rc 디렉토리는 다음중 하나일 겁니다.
o /etc
o /sbin
o /etc/rc.d
링크를 만드시는데, 다음과 같이 하십시오. RCDIR를 시스템의 rc
디렉토리의 장소로 바꾸십시오.
ln -s ../init.d/qmail RCDIR/rc0.d/K30qmail
ln -s ../init.d/qmail RCDIR/rc1.d/K30qmail
ln -s ../init.d/qmail RCDIR/rc2.d/S80qmail
ln -s ../init.d/qmail RCDIR/rc4.d/S80qmail
ln -s ../init.d/qmail RCDIR/rc5.d/S80qmail
ln -s ../init.d/qmail RCDIR/rc6.d/K80qmail
--------------------------------------------------------------------------------------
유의점: 전단계의 숫자는 매우 시스템에 의존합니다. 그렇지만 다소 유연합니다.
Sendmail이 현재 설치되어 있으면, "find RCDIR -name "*sendmail" -print" 명령을
실행하면 시스템에 적용할 수 있는 숫자를 알려줍니다.
--------------------------------------------------------------------------------------
이제 큐메일서비스를 위해 감독디렉토리를 만드십시오.
mkdir -p /var/qmail/supervise/qmail-send/log
mkdir -p /var/qmail/supervise/qmail-smtpd/log
chmod +t /var/qmail/supervise/qmail-send
chmod +t /var/qmail/supervise/qmail-smtpd
/var/qmail/supervise/qmail-send/run파일을 만드십시오.
#!/bin/sh
exec /var/qmail/rc
/var/qmail/supervise/qmail-send/log/run파일을 만드십시오.
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail
/var/qmail/supervise/qmail-smtpd/run파일을 만드십시오.
#!/bin/sh
QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`
exec /usr/local/bin/softlimit -m 2000000 \
/usr/local/bin/tcpserver -v -p -x /etc/tcp.smtp.cdb \
-u $QMAILDUID -g $NOFILESGID 0 smtp /var/qmail/bin/qmail-smtpd 2>&1
/var/qmail/supervise/qmail-smtpd/log/run파일을 만드십시오.
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail/smtpd
run파일들에 실행가능을 부여합니다.
chmod 755 /var/qmail/supervise/qmail-send/run
chmod 755 /var/qmail/supervise/qmail-send/log/run
chmod 755 /var/qmail/supervise/qmail-smtpd/run
chmod 755 /var/qmail/supervise/qmail-smtpd/log/run
그런 다음에, 로그디렉토리를 만듭니다.
mkdir -p /var/log/qmail/smtpd
chown qmaill /var/log/qmail /var/log/qmail/smtpd
기동스크립트에 실행권한을 부여하고, 실행경로에 있는 디렉토리로
링크합니다.
# substitute the correct location of your rc dir on the next two lines
chmod 755 /etc/init.d/qmail
ln -s /etc/init.d/qmail /usr/local/sbin
로컬호스트가 SMTP를 통해서 멜을 삽입 (inject)하도록 합니다.
echo '127.:allow,RELAYCLIENT=""' >>/etc/tcp.smtp
/usr/local/sbin/qmail cdb
2.8.3. 기존에 설치된 MTA를 멈추고 무력하게 합니다.
큐메일과 현존하는 MTA, 대개 Sendmail, 두개를 사용할 수도 있지만,
그렇게 하지 않을 것을 강력히 권고합니다. 그리고, 솔직히 말해서, 이
글을 읽고 계신다면, 그게 무엇을 뜻하는 지 모르실 겁니다. :-)
현존 MTA가 Sendmail이라면, init.d 스크립트를 stop인수를 주어 실행하여
멈출 수 있습니다. 예) 다음 중 하나가 유효할 겁니다.
/etc/init.d/sendmail stop
/sbin/init.d/sendmail stop
/etc/rc.d/init.d/sendmail stop
init.d/sendmail 스크립트를 찾을 수 없다면, "ps -ef|grep sendmail" 또는
"ps waux|grep sendmail"을 사용해서 sendmail의 PID를 알아낸 뒤에,
다음과 같이 해서 멈춥니다.
kill PID-of-sendmail
MTA가 Sendmail이 아니면, 해당문서에서 바른 멈춤 절차를 참고하십시오.
시스템에서 기존의 MTA를 완전히 제거하는 것도 고려해볼 만합니다. 적어도
init.d 스크립트를 무력하게 하면 시스템이 재부팅할 때 다시는 가동하지
않습니다.
레드햇리눅스에서는 다음과 같이 해서 Sendmail을 제거합니다.
rpm -e --nodeps sendmail
끝으로, 기존의 /usr/lib/sendmail을 큐메일판으로 바꿉니다.
mv /usr/lib/sendmail /usr/lib/sendmail.old # 에러를 무시하세요
mv /usr/sbin/sendmail /usr/sbin/sendmail.old # 에러를 무시하세요
chmod 0 /usr/lib/sendmail.old /usr/sbin/sendmail.old # 에러를 무시하세요
ln -s /var/qmail/bin/sendmail /usr/lib
ln -s /var/qmail/bin/sendmail /usr/sbin
이제는 큐메일가동이 가깝습니다. 끝단계는 시스템앨리어스를 두어개
만드는 것입니다.
2.8.4. 시스템앨리어스를 만듭니다.
모든 큐메일설치에서는 시스템앨리어스를 세개 만들어야 합니다.
앨리어스 목적
postmaster RFC 821 요구사항이며, 멜애드민 (당신)을 가리킵니다.
mailer-daemon 바운스멜에 대한 사실상의 표준수취인
root 특권계정에서 온 멜을 시스템애드민에게 보낸다.
이 앨리어스들을 만들려면, 그것들 하나하나가 어디에 놓여져야 하는 지
(로컬사용자, 또는 원격주소) 결정하고, .qmail파일을 만들어서 갖다놓으면
됩니다. 예를 들어, 로컬사용자 dave는 시스템과 멜의 애드민이라고 하면
다음과 같이 합니다.
echo dave > /var/qmail/alias/.qmail-root
echo dave > /var/qmail/alias/.qmail-postmaster
ln -s .qmail-postmaster > /var/qmail/alias/.qmail-mailer-daemon
chmod 644 /var/qmail/alias/.qmail-root /var/qmail/alias/.qmail-postmaster
2.8.5. 큐메일을 가동합니다.
마지막으로, 큐메일을 가동합니다.
/usr/local/sbin/qmail start
2.9. 설치를 시험합니다.
큐메일이 지금쯤 운행하고 있을겁니다. TEST.deliver, TEST.receive에 있는
지시사항을 따르시면 제대로 작동하고 있는 지 검사할 수 있습니다. 이들
지시사항을 이용하면, 로그는 splogger가 아닌 accustamp와 cyclog가
만든다는 것을 알아두십시오.
3. 설정
권장 소스타볼 방법이나, 자동컴파일 패케지로부터 큐메일을
설치하셨습니다. 이번 항목에는 멜애드민이나 시스템애드민이 자기가
원하는 대로 큐메일을 운영하기 위해 큐메일을 설정하는 데 필요한 정보가
있습니다.
3.1. 설정파일
모든 큐메일 시스템설정파일은 alias에 있는 .qmail파일을 빼고는 모두
/var/qmail/control에 놓여져 있습니다. qmail-control 맨페지에는 다음과
같은 테이블이 있습니다.
Control Default Used by Purpose
badmailfrom none qmail-smtpd blacklisted From addresses
bouncefrom MAILER-DAEMON qmail-send username of bounce sender
bouncehost me qmail-send hostname of bounce sender
concurrencylocal 10 qmail-send max simultaneous local
deliveries
concurrencyremote 20 qmail-send max simultaneous remote
deliveries
defaultdomain me qmail-inject default domain name
defaulthost me qmail-inject default host name
databytes 0 qmail-smtpd max number of bytes in
message (0=no limit)
doublebouncehost me qmail-send host name of double bounce
sender
doublebounceto postmaster qmail-send user to receive double
bounces
envnoathost me qmail-send default domain for
addresses without "@"
helohost me qmail-remote host name used in SMTP
HELO command
idhost me qmail-inject host name for Message-ID's
localiphost me qmail-smtpd name substituted for local
IP address
locals me qmail-send domains that we deliver
locally
me FQDN of system various default for many control
files
morercpthosts none qmail-smtpd secondary rcpthosts
database
percenthack none qmail-send domains that can use
"%"-style relaying
plusdomain me qmail-inject domain substituted for
trailing "+"
qmqpservers none qmail-qmqpc IP addresses of QMQP
servers
queuelifetime 604800 qmail-send seconds a message can
remain in queue
rcpthosts none qmail-smtpd domains that we accept
mail for
smtpgreeting me qmail-smtpd SMTP greeting message
smtproutes none qmail-remote artificial SMTP routes
timeoutconnect 60 qmail-remote how long, in seconds, to
wait for SMTP connection
timeoutremote 1200 qmail-remote how long, in seconds, to
wait for remote server
timeoutsmtpd 1200 qmail-smtpd how long, in seconds, to
wait for SMTP client
virtualdomains none qmail-send virtual domains and users
특정 컨트롤 파일에 대해 정보를 더 원하시면, "Used by"밑에 열거된
모듈에 해당하는 맨페지를 참조하십시오.
3.2. 릴레이
3.2.1. 소개서
릴레이는 무엇일까요? MTA가 SMTP를 통해서 메세지를 받아들이지만,
로컬주소 또는 로컬송신자가 아닐때를 말합니다.
스팸이전시대에는 MTA가 공개릴레이로 설정되는 것이 보통이었습니다.
송신자/수신자가 누구든 지 멜을 수용하는 무차별서버였습니다.
요즘의 MTA는 대개 릴레이를 금지하거나, 일정한 믿을만한 사용자나
시스템에게만 릴레이를 허용하고 있습니다.
3.2.2. 릴레이 금지
공식 큐메일설치지시사항을 따르면 릴레이는 기본이 안되게 되어있습니다.
이것은 locals와 virtualdomains에 있는 도메인 네임들에 있는 도메인
네임들을 /var/qmail/control/rcpthosts파일에 적기 때문입니다.
rcpthosts통제파일이름은 SMTP RCPT (수신자) 명령어에서 유래합니다. SMTP
세션에서 RCPT는 메세지수신인의 주소를 밝히는 데 씁니다. 그러면
rcpthosts는 RCPT 주소에 나타나는 유효한 호스트네임을 리스트합니다.
3.2.3. 릴레이선택을 허용하기
대부분의 단일사용자와 소규모 서버는 릴레이를 완전히 금지할 수 있지만,
분산된 사용자 공동체를 지원하려면 사용자에게만은 릴레이용으로 서버를
이용하게 할 수 있는 방법이 필요합니다. 이것은 qmail-smtpd에게
rcpthosts 파일을 무시하도록 tcpserver를 써서 RELAYCLIENT환경변수를
정하면 됩니다.
본문서의 설치지시사항을 따르면, 릴레이선택은 기본입니다.
클라이언트에게 릴레이접근권한을 주려면 /etc/tcp.smtp에 다음을
첨가하십시오.
IP address of client:allow,RELAYCLIENT=""
그리고나서 SMTP 접근권한 데이터베이스를 재컴파일하십시오.
tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
chmod 644 /etc/tcp.smtp*
공식설치지시사항을 따랐다면, Chris Johnson이 큐메일이 특정호스트에게만
릴레이를 허용하도록 설정하는 방법을 적으셨으니
<http://www.palomine.net/qmail/selectiverelay.html>를 참고하도록
하십시오.
3.3. 다중 호스트네임
호스트가 한 이름이상으로 알려지면, 예를 들어서 user@host1.example을
user@example.com이나 user@mail.example.com 등으로 적을 수 있다면,
큐메일에 이런 내용을 알려서 어떤 주소로 내부에서 전달할 지,
원격시스템에서 어떤 메세지를 받을 즈 등을 알게 합니다.
그렇게 하려면, 통제파일 두 개에 모든 이름을 첨가하기만 하면 됩니다.
o rcpthosts: qmail-smtpd에게 이들 호스트로 주소를 가진 멜을
받아들이게 합니다.
o locals: qmail-send에게 이들 호스트의 주소는 내부에서 전달되게
합니다.
3.4. 버츄얼도메인
버츄얼도메인은 전항목에서 말씀드린 다중호스트네임과 비슷합니다만,
몇가지 중요한 차이점이 있습니다. 첫째로, example.net에
virtual.example.com이라는 버츄얼도메인이 있다면, joe@example.net에게
보낸 메세지는 대개 joe@virturl.example.com으로 보낸 메제지와 같은
멜복스에서 끝나지 않습니다. 버추얼도메인에 대한 이름은 별개입니다.
큐메일에서 버츄얼도메인은 virtualdomains파일에 설정되는데,
다음형식으로 하나 또는 그 이상을 적습니다.
큐메일은 user@domain을 prepend-user@domain으로 변환하고, 그 결과를
도메인이 로컬인 것처럼 취급합니다. user@부분은 선택입니다. 생략하면,
모든 @domain주소와 일치합니다.
위의 example씨나리오를 다시 보면, example.net의 멜애드민이
john사용자의 애드민 통제하에 virtual.example.com이라는 버츄얼도메인을
만들기 위해서는 다음과 같이 virtualdomains에 써넣어야 합니다.
virtual.example.com:john
joe@virtual.example.com로 들어오는 메세지는 john-
joe@virtual.example.com으로 써지고, 내부에서 전달됩니다. john이 어떻게
버츄얼도메인을 관리하는 지 .qmail항목의 주소연장 부항목을 보시기
바랍니다.
다중호스트네임과 같이 모든 버츄얼도메인은 rcpthosts에 리스트되어서
qmail-smtpd가 그곳으로 주소된 메세지들을 받아들이게 합니다. 그렇지만,
다중호스트네임과 틀린점은 버츄얼도메인을 locals에 첨가해서는 안됩니다
--------------------------------------------------------------------------------
유의점: DNS와 MX기록은 버츄얼도메인으로 가는 메세지를 적절한 멜서버로 돌리도록
설치되어야 합니다. 이것은 네임서버애드민이 할일이고, 본 가이드의 범위를
벗어납니다.
--------------------------------------------------------------------------------
3.5. 앨리어스
큐메일의 표준 앨리어스기술은 큐메일의 로컬전달기술이 자연히 발전한
것입니다. qmail-local은 localpart@host을 주소로 하는 메세지를
localpart라는 이름의 로컬사용자에게 전달하려고 합니다. 맞는 사용자가
없으면 메세지는 전체 큐메일시스템에서 /var/qmail/alias가 홈디렉토리인
pseudo-user 앨리어스 사용자에게 전달됩니다.
예를 들어 메세지를 tom사용자에게 회송하는 info@example.com앨리어스를
만들고자 한다고 합시다. example.com에서 룻사용자로서 다음과 같이
합니다.
echo tom > /var/qmail/alias/.qmail-info
.qmail항목과 주소연장부항목에서 어떤 앨리어스가 있는 지 정하는
.qmail파일을 어떻게 만들고, 전달되는 메세지로 무엇을 해야 하는 지
설명합니다.
큐메일에서 앨리어스가 실행되는 방식때문에 앨리어스가 정당한 사용자
전달을 무시할 수는 없다는 것을 유의하십시오.
fastforward패케지에는 Sendmail의 앨리어스 데이터베이스와 호환하는
단일파일에 다중앨리어스를 적는 대체가능 앨리어스기술이 있습니다.
다음 항목인 qmail-users에서 앨리어스를 실행할 수 있는 다른 기술을
설명합니다.
3.6. qmail-users
qmail-users는 사용자에게 주소를 할당하는 시스템입니다. 설정파일들이
/var/qmail/users에 놓입니다. 할당파일은 할당테이블입니다. simple과
wildcard 등 두 종류의 할당이 있습니다.
--------------------------------------------------------------------------------
유의점: assign은 한 줄에 할당들을 갖는데, 다음줄에 마침표를 적어줍니다. assign을
수동으로 만드시면 마침표줄을 잊지 마십시오.
---------------------------------------------------------------------------------
3.6.1. 간단한 할당
간단한 할당은 다음과 같습니다.
=address:user:uid:gid:directory:dash:extension:
address로 받은 메세지는 user사용자로 작동하는데, 특정 uid와 gid로
하며, directory/.qmaildashextension파일에 메세지를 어떻게 전달해야
하는 지를 규정한다는 뜻입니다.
3.6.2. 와일드카드 할당
와일드카드 할당은 다음과 같습니다.
+prefix:user:uid:gid:directory:dash:prepend:
prefix형식의 주소로 수신된 메세지는 user사용자로 작동하는데, 특정
uid와 gid로 하며, directory/.qmaildashprepend파일에 메세지를 어떻게
전달해야 하는 지를 규정한다는 뜻입니다.
3.6.3. qmail-user 프로그램들
qmail-user에는 도우미 프로그램이 두 개 있는데, qmail-newu와 qmail-
pw2u입니다.
qmail-newu는 assign파일을 처리해서 /var/qmail/users에 cdb라는
contstant 데이터베이스(CDB)파일을 만듦니다. CDB는 바이너리 형식이라서
할당이 수천개라도 qmail-lspawn으로 매우 빨리 접근합니다.
qmail-pw2u는 시스템사용자데이터베이스인 /etc/passwd를 assign에 적합한
할당으로 변환합니다. qmail-pw2u는 변환규칙을 고치는 파일 몇개를
사용합니다.
o include: 포함할 사용자
o exclude: 제외할 사용자
o mailnames: 사용자에 대한 대체 mailnames
o subusers: 사용자가 처리하는 가외주소로서 .qmail확장은
선택사항입니다.
o append: 여러가지 할당
---------------------------------------------------------------------------------
유의점: qmail-pw2u를 사용하면, 사용자를 추가, 삭제하거나 UID나 GID를 바꿀 때마다
qmail-pw2u와 qmail-newu를 재가동하셔야 합니다.
---------------------------------------------------------------------------------
4. 사용법
이 항목에서는 보통사용자가 큐메일을 사용하는 법을 다룹니다.
큐메일시스템에서 멜을 읽거나 보낸다면, 여기에서 어떻게 큐메일을
이용하는 지를 알게 될겁니다.
4.1. .qmail파일
사용자멜의 전달은 대개 .qmail파일이 통제하는데, 이것들은 사용자
홈디렉토리에 .qmail로 시작하는 이름으로 되어있습니다. dot-
qmail맨페지에 .qmail파일 사용법을 설명해 놓았습니다.
.qmail파일에는 전달지시사항이 한 줄에 하나씩 들어있습니다. 줄의
처음문자는 전달방법을 결정합니다.
문자 전달형태 값
# 없슴 (코멘트) 무시
| 프로그램 셸이 실행할 명령어
/ 또는 . mbox (마지막글자가 mbox 경로 (/나 .를 포함)
/이 아니면)
/ 또는 . maildir (마지막 mbox 경로 (/나 .를 포함)
글자가 /이면)
& 포워드 메세지를 포워드할 주소
글자 또는 숫자 포워드 메세지를 포워드할 주소
(첫글자를 포함)
4.1.1. 프로그램전달
프로그램전달지시를 만나면 큐메일은 셸(/bin/sh)을 가동해서 명령을
실행하는데, 들어오는 메세지를 복사해서 명령에 표준입력으로 넣습니다.
qmail-command맨페지에 이 절차를 자세히 설명해 놓았습니다.
프로그램전달은 매우 강력하고 매우 넓은 기능을 구현할 수 있는데,
메세지필터링, 메세지에 자동으로 답하기, procmail 등 제3자 전달자를
통해 전달하는 것등입니다.
예)
|preline /usr/ucb/vacation djb
이렇게 하면 큐메일은 preline을 가동해서 /usr/ucb/vacation과 djb를
인수로 주고, 메세지복사본을 표준입력으로 제공합니다.
4.1.2. mbox 전달
Mbox는 큐메일 용어로서 표준 유닉스 멜복스 형태인데, 다중메세지를
단일파일에 저장하고, 메세지에는 "From "줄이 머리에 있습니다. 이 줄은
헤더필드같이 보이지만 아닙니다. 이것은 다만 전달자가 첨가해서 멜을
읽는 사람이 해당메세지가 시작하는 곳을 알게하는 것뿐입니다.
예:
./Mailbox
이렇게 하면 "From "줄을 앞에 붙여서 $HOME/Mailbox에 추가합니다. 단일
메세지를 보유한 간단한 mbox멜복스는 다음과 같습니다.
From user1@example.net Thu May 13 18:34:50 1999
Received: (qmail 1287205 invoked from network); 13 May 1999 18:34:49 -0000
From: user1@example.net
To: user2@example.com
Subject: hey
What's up?
첫줄은 큐메일이 전달하면서 첨가한 것입니다.
4.1.3. maildir 전달
"Maildir"는 Dan Bernstein이 만든 멜복스형태로서 mbox형태의 결점을
말해줍니다. maildir멜복스에는 디렉토리로서 섭디렉토리가 세개 있는데,
new, cur, tmp 등입니다. maildir멜복스에 있는 각 메세지는 상태에 따라
부디렉토리중 하나에 별개파일로 되어있는데, new는 읽지 않은 메세지가,
cur는 읽은 메세지가, tmp는 전달중인 메세지가 들어 있습니다.
maildir맨페지에 maildir형식에 대해 자세히 설명하였습니다.
maildir의 이점중 하나는 다른 전달자가 동시에 업데이트하는 것을
막기위해 하는 록킹을 사용하지 않아도 확실하다는 겁니다. 이것은
maildir멜복스는 NFS를 마운트한 파일시스템에 안전하게 사용할 수 있다는
것을 뜻합니다.
예:
./Maildir/
이것은 메세지를 maildir형태의 멜복스인 $HOME/Maildir에 저장합니다.
------------------------------------------------------------------------------
유의점: maildir멜복스는 큐메일과 같이 제공하는 maildirmake프로그램으로 만듭니다.
예) maildirmake ~/Maildir
------------------------------------------------------------------------------
4.1.4. 포워드 전달
포워드전달은 명시주소로 메세지를 다시보냅니다. .qmail파일에 명시한
주소는 완전자격이어야 하며, 커멘트필드와 여백이 없어야 합니다.
다음은 틀렸습니다.
&<user@example.com>
& user@example.com
&Joe User <user@example.com>
&user
다음과 같이 해야합니다.
&user@example.com
user@example.com
그러면 메세지사본을 user@example.com로 보냅니다.
4.1.5. 연장주소
큐메일에서는 사용자통제 연장주소를 지원합니다. 기본주소인
username@hostname.domain외에 사용자는 username-
extension@hostname.domain으로 멜을 받을 수 있습니다. 우리는 지금
로컬시스템에서 일어나는 행동을 고려하고 있으므로, 앞으로 이번
항목에서는 "@hostname.domain"부분은 적지 않기로 합니다.
username-extension에 대한 전달지시사항은 username/.qmail-extension에
있습니다.
예를 들면, dave-lwq@sparge.example.com은 sparge호스트에 있는
dave/.qmail-lwq가 통제합니다.
연장은 복수필드로 될 수 있습니다. 예를 들면 dave-list-qmail인데,
dave/.qmail-list-qmail이 통제합니다. 이번 예에서 dave-list-qmail은
큐메일 멜링리스트에 가입했고, dave/.qmail-list-qmail은 리스트메세지를
별도의 멜복스에 파일보관합니다.
.qmail파일들은 -default를 와일드카드로 씁니다. 그래서 dave-list-
qmail은 /.qmail-list-default로도 처리할 수 있습니다. 이렇게 하면 모든
dave-list-whatever주소들을 다루는데 있어서 .qmail파일은 하나만 있어도
족합니다. 그러나 dave-list는 dave/.qmail-list-default가 통제하지
못하는데, list다음에 "-"이 없기 때문임을 유의하십시오.
큐메일은 찾는 것중에서 제일 가까운 것을 씁니다. 예를 들어서, dave-
list-qmail의 주소로 메세지가 왔다면, 다음과 같이 찾은 것중에서
첫번째것을 씁니다.
o
o
o
일치하는 .qmail파일이 없으면 전달은 실패하고 메세지는 보낸이에게
되돌려집니다.
4.2. 메세지 보내기
멜사용자는 메세지를 보내는 데 있어서 MTA를 보통 직접 사용하지
않습니다. 대체로 Mail User Agent (MUA)인 pine이나 mutt 등을 써서
메세지를 작성하고 보내는데, MUA는 MTA를 호출해서 메세지를 전달합니다.
MTA로 메세지를 건네주는 처리과정을 injection이라고 합니다.
대부분의 MTA로 메세지를 inject하는 방법에는 두 가지가 있습니다.
Simple Mail Transfer Protocol (SMTP)과 이 목적으로 MTA가 제공하는
프로그램을 이용하는 것입니다.
4.2.1. SMTP
MUA는 로컬호스트나 지정한 멜서버에 있는 표준 SMTP포트인 25번 포트로
TCP 연결을 엽니다. 그 다음, MUA와 MTA는 다음과 같이 끝나는 대화중
하나를 합니다.
o the message being transfered to the MTA, 또는
o a error status being returned to the MUA
SMTP에는 인증장치가 없으므로 메세지를 보내는데 유저네임이나 패스워드가
필요없습니다. 그렇지만 많은 MTA는 로컬사용자가 보내거나 받는 것같지
않은 메세지를 거절합니다. 제대로된 메세지가 reject되면 릴레이제한이 그
원인일 경우가 제일 많습니다. 릴레이설정에 대한 정보는 릴레이항목을
보십시오.
4.2.2. /var/qmail/bin/sendmail
오랜 세월동안 Sendmail이 유닉스 MTA였습니다. 어느 곳에나 그것이
있었기에 많은 프로그래머들은 의례 그것이 MTA라고 여겼습니다. 그 결과,
Sendmail의 로컬 인젝션 장치가 로컬멜인젝션에 대한 표준 Application
Programmer's Interface (API)가 되었습니다. 큐메일과 기타 비Sendmail
MTA는 sendmail프로그램을 공급해서 로컬인젝션에 대해서 진짜 Sendmail의
sendmail가 똑깥이 작동하도록 합니다.
큐메일의 sendmail은 보통 /var/qmail/bin/sendmail에 있는데, 대개
큐메일시스템에서 Sendmail의 sendmail을 대체합니다. 흔히
sendmail프로그램은 다음에 있습니다.
o /usr/lib/sendmail
o /usr/sbin/sendmail
큐메일시스템에서 "ls -l path-to-sendmail"하면 sendmail이
/var/qmail/bin/sendmail로 심볼릭링크되어있슴을 보여줍니다.
$ ls -l /usr/lib/sendmail
lrwxrwxrwx 1 root root 29 Feb 19 11:04 /usr/lib/sendmail \
-> /var/qmail/bin/sendmail
4.2.3. qmail-inject
sendmail API외에 큐메일에는 qmail-inject라는 자체 인젝션프로그램이
있습니다. 사실 sendmail은 qmail-inject의 wrapper입니다.
API이지만 sendmail은 매우 널리 쓰이므로 더 나은 듯합니다. qmail-
inject가 제공하는 큐메일 API는 큐메일을 설치한 시스템이서만
작동하지만, sendmail 인터페스는 거의 어디에나 있습니다.
예를 들면, joe@example.com에게 빈 메세지를 보내려면 다음과 같이 합니다.
echo To: joe@example.com | /var/qmail/bin/qmail-inject
4.3. 환경변수
큐메일프로그램이 환경변수를 정하거나 사용하기도 합니다. 다음의
테이블에 변수를 열거하고 사용법을 적었습니다.
변수명 해당 맨페지 설정 사용목적
DATABYTES qmail-smtpd used Overrides control/databytes
Portion of address matching
DEFAULT qmail-command set "-default" in a .qmail file
name.
DTLINE qmail-command set Delivered-To header field
EXT qmail-command set The address extension
EXT2 qmail-command set Portion of EXT following first
dash
EXT3 qmail-command set Portion of EXT following second
dash
EXT4 qmail-command set Portion of EXT following third
dash
HOME qmail-command set The user's home directory
HOST qmail-command set The domain part of the recipient
address
HOST2 qmail-command set Portion of HOST preceding last
dot.
HOST3 qmail-command set Portion of HOST preceding
second-to-last dot
HOST4 qmail-command set Portion of HOST preceding
third-to-last dot
LOCAL qmail-command set The local part of the recipient
address
LOGNAME qmail-inject used User name in From header field
(4)
MAILHOST qmail-inject used Host name in From header field
(2)
MAILNAME qmail-inject used Personal name in From header
field (2)
MAILUSER qmail-inject used User name in From header field
(2)
NAME qmail-inject used Personal name in From header
field (3)
NEWSENDER qmail-command set Forwarding sender address (see
"man dot-qmail")
QMAILDEFAULTDOMAIN qmail-inject used Overrides control/defaultdomain
QMAILDEFAULTHOST qmail-inject used Overrides control/defaulthost
QMAILHOST qmail-inject used Host name in From header field
(1)
QMAILIDHOST qmail-inject used Overrides control/idhost
QMAILINJECT qmail-inject used Specify various options (see
next table)
File containing list of mailing
QMAILMFTFILE qmail-inject used list addresses for
Mail-Followup-To generation
QMAILNAME qmail-inject used Personal name in From header
field (1)
QMAILPLUSDOMAIN qmail-inject used Overrides control/plusdomain
QMAILSHOST qmail-inject used Host name in envelope sender
address
QMAILSUSER qmail-inject used User name in envelope sender
address
QMAILUSER qmail-inject used User name in From header field
(1)
RECIPIENT qmail-command set Envelope recipient address
Ignore control/rcpthosts and
RELAYCLIENT qmail-smtpd used append value to recipient
address
RPLINE qmail-command set Return-Path header field
SENDER qmail-command set Envelope sender address
UFLINE qmail-command set UUCP-style "From " line
USER qmail-command set The current user
USER qmail-inject used User name in From header field
(3)
QMAILINJECT Flags
Letter Purpose
c Use address-comment style for the From field
s Do not look at any incoming Return-Path field
f Delete any incoming From field
i Delete any incoming Message-ID field
r Use a per-recipient VERP
m Use a per-message VERP
5. 고급토픽
5.1. procmail
procmail은 많이 쓰는 Message Delivery Agent (MDA)이다. MDA가 하는 일은
특정 사용자나 멜복스에 대한 메세지를 MTA로부터 받아서 사용자의
요구대로 전달하는 것입니다. procmail은 다양한 헤더필드내용이나
메세지본문에 따라서 메세지를 필터하는테 쓰이기도 합니다. 예를 들면,
특정인이 보낸 메세지를 그 사람의 멜복스에만 전달하도록 할 수 있습니다.
procmail을 큐메일과 함께 운영하는 방법이 두 가지 있습니다. 첫째는,
procmail은 보통 /var/spool/mail에 있는 mbox멜복스로 전달하도록
컴파일됩니다. procmail을 다시 컴파일해서 $HOME를 기본으로 하도록
하거나, 사용자들에게 알려서 procmail이 mobx를 기본위치로 하지 않도록
합니다. $HOME전달에 대해 패치하지 않으면, 임시파일에 대해서
procmail은 여전히 /var/spool/mail을 씁니다.
문제가 하나 더 있는데, qmail-command와 procmail에는 어떤 엑싯코드가
무엇을 말하는 지에 대한 공통이해가 없습니다. procmail은 표준 유닉스
엑싯코드를 쓰는데, 0은 성공, 그외는 실패이며, 실패의 원인은
/usr/include/sys/errno.h에 정의되어 있습니다. qmail-command에서는
0이외의 일정한 숫자로 영구에러를 일러주고, 그 이외는 임시로
간주합니다. qmail-command에 대한 엑싯코드를 해석하기 위해서 소규모의
셸스크립트 wrapper를 만들 수도 있습니다. 이런 wrapper는
큐메일멜링리스트에 부처졌고, 다음주소의 문서보관에서 얻을 수 있습니다.
<http://www.ornl.gov/its/archives/mailing-
lists/qmail/1998/04/msg00487.html>
또한 procmail은 maildir형식의 멜복스로 직접 전달하지 않습니다.
procmail에서 maildir로 직접전달하는 패치를 얻을 수 있습니다. (
<http://www.qmail.org/top.html#maildir>를 보십시오.) 다른 방법에는
특정 maildir로 향하는 표준입력으로 메세지를 작성하는 프로그램인
safecat입니다. 사용자는 safe가 메세지를 파일처리하도록 procmail 비법
(전달지시사항)을 적을 수 있습니다. procmail을 아예 씨즈 말고
maildrop을 사용할 수 도 있습니다.
끝으로 procmail은 메세지를 받을 때 mbox형식으로 인식합니다. 대개
큐메일프로그램의 전달에는 진짜 멜메세지만 포함하지 "From "줄이
없습니다. preline명령어를 써서 procmail이 인식하는 메세지형식으로
만들 수 있습니다.
예를 들면, dave사용자가 procmail로 멜을 처리하고 싶다고 합시다.
시스애드민이 procmail을 기본으로 $HOME로 전달하도록 컴파일했고,
/usr/local/bin/qmail-procmail이라는 엑싯코드 wrapper를 제공한다고 할
때, .qmail파일은 다음과 같습니다.
|/var/qmail/bin/preline /usr/local/bin/qmail-procmail dave
5.2. POP 그리고 IMAP 서버
큐메일은 POP서버와 qmail-pop3d를 포함하지만, 큐메일설치과정으로
설정하거나 설치하지는 않습니다. 다른 POP나 IMAP 등의 서버를 얻을 수
있으면 그것들을 사용해도 되지만, 대부분이 Sendmail용으로
만들어졌으므로 큐메일과 함께 쓰려면 손을 봐야 합니다.
5.2.1. qmail-pop3d
qmail-pop3d는 큐메일이 포함하는 POP서버입니다. 매우 좋은 POP서버로서
여러 큐메일사이트가 사용합니다. 모듈기능이고, 대체인증모듈을 통해
복합인증구성을 지원합니다.
--------e----------------------------------------------------------------------------
유의점: qmail-pop3d는 maildir형태의 멜복스만 지원하므로, 로컬 사용자들이 POP서버에
로긴해서 MUA를 운영한다면 모두들 maildir를 지원해야 합니다. 사용자들이 POP를
통해서 멜을 읽는다면 서버의 멜복스형태는 문제가 되지 않습니다.
-------------------------------------------------------------------------------------
5.2.1.1. qmail-pop3d의 구조
다음의 세모듈로 구성합니다.
o qmail-popup : 사용자명과 암호를 받습니다.
o checkpassword : 사용자명과 암호를 인증합니다.
o qmail-pop3d : POP데몬입니다.
으례 qmail-popup은 POP3포트인 110번 포트를 듣는 inetd나 tcpserver로
움직입니다. 연결을 하면 사용자명과 암호를 대라고 합니다. 그리고서는
checkpassword를 불러서 사용자명과 암호를 검증하고 맞다면 qmail-pop3d를
부릅니다.
5.2.1.2. qmail-pop3d의 설치
1. 큐메일을 완전히 설치하고 시험사십시오. 모든 사용자가 POP가능한
멜복스를 갖게하려면 defaultdelivery를 ./Maildir/로 설정하세요.
설치항목에 있는 qmail스크립트로 설치하셨다면,
control/defaultdelivery에서 설정할 수 있습니다. 그렇지 않다면,
qmail-start명령행에서 /var/qmail/rc일 것입니다.
2. <http://www.qmail.org/top.html#checkpassword> 에서 checkpassword
프로그램을 받으십시오. 이러저러하게 꾸민 것이 필요없으면
<http://pobox.com/~djb/checkpwd.html>에 있는 표준 checkpassword가
좋습니다.
3. 지시사항을 따라서 checkpassword를 컴파일하고 설치하십시오.
/bin/checkpassword로 설치하셔야 합니다.
4. 조금 사용하는 POP서버라면 /etc/inetd.conf에 다음을 더하십시오.
pop3 stream tcp nowait root /var/qmail/bin/qmail-popup qmail-popup \
hostname.domain /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir
--------------------------------------------------------------------------------------
유의점: 어떤 시스템들, 그중에서도 레드햇리눅스,는 POP3포트를 "pop3"로 부르지
않습니다. /etc/services에서 110번 포트 서비스의 이름을 확인하십시오. 또한
inetd 맨페지를 확인하셔서 기재사항을 형식에 맞추십시오. 잘 보셔야 하는 것이,
어떤 inetd에는 프로그램(본 예제에서는 qmail-popup)에 대한 첫번째 인수가 그
프로그램의 이름이어야 합니다. 다른 inetd들에게는 "사실상의" 인수만 있으면
됩니다.
--------------------------------------------------------------------------------------
1. "kill -HUP PID of inetd"를 실행하시어 inetd가 /etc/inetd.conf를
다시 읽도록 합니다.
2. 많이 사용하는 서비스에 대해서는 그것보다 tcpserver를 사용하십시오.
tctpserver를 쓰려면 다음사항을 큐메일 (inetd.conf가 아니고)
기동스크립트에 더하십시오.
tcpserver -v -R 0 pop3 /var/qmail/bin/qmail-popup FQDN \
/bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir 2>&1 | \
/var/qmail/bin/splogger pop3d &
여기에서 pop3는 /etc/services에 기재된 POP3서비스의 이름이고, FQDN은
지금 설치하시는 POP서버의 완전도메인명으로서, 예를 들면
pop.example.net입니다.
5.2.2. qpopper
mbox형 멜복스와 동작하는 POP데몬이 필요하면 Qualcomm의 qpopper을
쓰십시오. Vince Vielhaber는
<http://www.qmail.org/qpopper2.53.patch.tar.gz>에 사용자홈디렉토리의
멜복스와 동작하는 패치를 갖고 있습니다. qpopper는
<http://www.eudora.com/freeware/qpop.html>에서 구할 수 있습니다.
5.2.3. Cyrus
Jason van Zyl이 qmail/Cyrus 하우투를 썼습니다.
<http://www.compusense.com/qmail-cyrus/>를 보십시오.
LDAP를 Cyrus에 결합하는 정보가 <http://www.linc-dev.com/auth.html>에
있습니다.
5.2.4. imap-maildir
David R. Harris가 Washington대학의 IMAP서버에 대한 maildir지원을
추가하는 패치를 정리했으며 설치과정을 문서화했습니다.
<http://www.davideous.com/imap-maildir/>를 보십시오.
5.3. POP와 IMAP 클라이언트
5.3.1. fetchmail
POP나 IMAP 등의 서버에서 멜을 꺼내서 로컬에 재삽입하는 프로그램입니다.
큐메일에서 멜을 꺼내는 데 문제가 없지만, 큐메일클라이언트에서 잘
동작하게 하는 두세가지 기술이 있습니다.
큐메일시스템상의 사용자를 위한 .fetchmailrc샘플은 다음과 같습니다.
poll mail.example.net proto pop3 nodns
user dsill with password flubgart is dave here
fetchall forcecr to * here
이렇게 하면 fetchmail은 mail.example.net을 POP3를 통해서 접속하고,
dsill 사용자, flubgart암호로 로긴해서, 메세지를 모두 꺼낸다음에
dave@localhost로 전달합니다. forcecr은 각줄에 carriage return을
붙여서 로컬시스템에 메세지를 SMTP를 통해서 삽입합니다. 큐메일에게는
이것이 필요합니다.
----------------------------------------------------------------------------------
유의점: fetchmail은 확실하지 않습니다. (포맷에러로 바운스를 일으키거나 SMTP서버가
동작중이지 않는 등) 이유야 어쨌든 재삽입이 실패하면 메세지가 없어집니다.
-----------------------------------------------------------------------------------
5.4. 다중 RCPT 대 단일 RCPT 전달
예를 들어서, 당신이 MTA이고, 한 사용자가 hostx.example.com의
세사람에게 메세지를 보낸다고 합시다. 이것을 하는데 몇가지 방법이
있습니다.
1. hostx에 SMTP접속을 열고, 첫번째 사용자에게 메세지사본을 보내고,
두번째 사용자에게 사본을 보내고, 세번째 사용자에게 사본을 보낸
다음에 접속을 닫습니다.
2. 세 과정을 시작해서 매과정이 hostx에 SMTP접속을 열고 한 사용자에게
메세지사본을 보낸 다음에 접속을 닫습니다.
3. hostx에 SMTP접속을 열고 세사용자 모두의 주소를 단 메세지사본 한개를
보낸 다음에 접속을 닫습니다.
첫번째 방법은 세번째 방법보다 분명히 뒤집니다. 메세지가 작더라도
적어도 그만큼 시간이 걸립니다. 그리고 메세지가 크다면 더 오래 걸리고,
게다가 넷웍대역을 쓸것입니다.
그러니 그것은 뺍시다.
두번째와 세번째 방법은 좀더 재미있습니다.
세번째 방법은 hostx에 접속을 단 한번 열고서 메세지 사본을 단 하나만
보냅니다. 넷웍대역을 효율사용하는 데 도움이 됩니다.
두번째 방법은 여러번 접속해서 메세지사본을 여러개 보냅니다.
넷웍대역을 "낭비"하지만 SMTP프로토콜의 성질때문에 세번째 방법보다
왕복지연이 더 적고, 더 빠릅니다. 게다가 세번째 방법보다 더 간단하므로
MTA를 더 수월하게 작성할 수 있습니다. 그리고 끝으로, 각 수신인이
그만의 메세지사본을 받으므로 MTA가 VERP를 구현할 수 있습니다.
(다음항목을 보십시오.)
큐메일은 언제나 두번째 방법 (단일 RCPT)을 사용합니다. 세번째방법
(복수 RCPT)를 구현하는 패치는 없습니다. 그것은 많은 작업을 하여야
합니다.
단일 RCPT 전달이 복수 RCPT 전달보다 넷웍대역을 더많이 사용하지만, 그
차이는 종종 과장되었습니다. 메세지 대부분은 기껏해야 두세 수신인에게
보내지는데다가 그들은 보통 서로 다른 호스트에 있기때문에, 복수
RCPT전달은 얻는게 아무것도 없습니다. 복수 RCPT전달이 유효할 수 있는
멜링리스트서버에서조차 이익가능성은 적은데, SMTP는 대부분의 연결에
걸쳐서 넷웍대역의 조금만 쓰고, HTTP가 엄청나게 많이 쓰기 때문입니다.
예를 들어 상향연결의 10퍼센트가 SMTP 대역으로 가고, 그중 25퍼센트를
복수 RCPT를 사용해서 줄여 봐야 SMTP 대역은 7.5%로 될 뿐입니다.
5.5. VERP
메세지를 전달할 수 없으면, MTA는 Envelope Return Path (ERP)로
바운스메세지를 돌려보내야 한다고 결정합니다. 바운스 메세지에는
수신인주소, 메세지부전달사유, 그리고 문제가 임시인지 오래갈 지 등을
포함해야 합니다. 그렇지만 많은 MTA가 제대로 하지 않습니다. 그것들은
바운스를 From 헤더필드에 있는 주소로 보내기도 하지만, 수신인을
파악하지 못하기조차 합니다.
사용자대사용자 메세지의 대부분에서 이런 문제들은 그렇게 나쁘지
않습니다. 대개는 바운스시각과 그 내용에 기초해서 사태를 이해할 수
있습니다. 멜링리스트에서는 잘못된 바운스문제가 더 심각합니다.
가입자들은 새주소로 멜을 옮기고 포워딩합니다. 새주소에 전달문제가
생기기 시작했는데, 바운스메세지에는 오직 새주소만 포함되어 있다면 어느
가입자의 멜이 바운스되는 지 알 수 없습니다.
Dan Bernstein은 VERP (Variable Envelope Return Path)라 불리는 굉장한
것을 제안했습니다. VERP를 사용하면, 각 가입자는 고유리턴경로를
갖습니다. 이렇게 해야 바운스 처리기가 문제가입자를 식별하도록 할 수
있습니다.
예를 들어서, 대개의 비 VERP 멜링리스트에는 리턴주소가 listname-
owner@domain의 형식으로 됩니다. VERP 멜링리스트에서는 리턴주소가
listname-owner-subscriber=sdomain@ldomain으로 되는데, 가입자주소
subscriber@sdomein이 "소유자"와 "@"사이에 묻혀있습니다. (가입자주소의
"@"는 "="로 대체됩니다.)
ezmlm리스트매니저는 바운스를 자동으로 처리하기 위해서 VERP를 씁니다.
가입자에세 빠뜨린 메세지리스트의 임시전달문제를 알려줘서 보관문서에서
꺼낼 수 있게 합니다.
Russell Nelson이 큐메일에서의 메이저도모를 위한 바운스메니저를 썼지만,
더이상 유지하지 않습니다.
<http://www.qmail.org/bounceman-0.4.sha>에서 구할 수 있습니다.
5.6. 문제해결
5.6.1. 과정
제대로 작동하고 완전하지만 최소한의 큐메일설치는 다음의 네과정이면
됩니다.
o qmail-sned : qmails사용자로서 운행
o qmail-clean : qmailq사용자로서 운행
o qmail-rspawn: qmailr사용자로서 운행
o qmail-lspawn: root사용자로서 운행
사용중인 유닉스기종에 따라서 다음명령중 하나로 이 과정들을, 어쩌면
몇개 더, 나열할 수 있습니다.
ps -ef | grep qmail
ps waux | grep qmail
예를 들면 다음과 같습니다.
[dave@sparge dave]$ ps waux|grep qmail
dave 2222 0.0 0.8 836 348 p4 S 10:25 0:00 grep qmail
qmaild 351 0.0 1.0 840 400 ? S N 12:43 0:00 /usr/local/bin/tcpserver -v -x /
qmaild 2220 0.0 1.0 844 420 ? S N 10:25 0:00 /usr/local/bin/tcpserver -v -x /
qmaill 365 0.0 0.8 748 344 ? S N 12:43 0:00 splogger qmail
qmailq 368 0.0 0.7 736 292 ? S N 12:43 0:00 qmail-clean
qmailr 367 0.0 0.6 732 272 ? S N 12:43 0:00 qmail-rspawn
qmails 350 0.0 0.8 776 336 ? S N 12:43 0:00 qmail-send
root 340 0.0 0.6 724 252 ? S N 12:43 0:00 /usr/local/sbin/supervise /var/s
root 341 0.0 0.6 724 252 ? S N 12:43 0:00 /usr/local/sbin/supervise /var/s
root 366 0.0 0.7 736 276 ? S N 12:43 0:00 qmail-lspawn ./Mailbox
[dave@sparge dave]$
위의 예에서와 같이 supervise하에서 qmail이나 qmail-smtpd를 실행하면 그
과정들도 볼 수 있습니다. tcpserver하에서 qmail-smtpd를 실행하면, 부모
tcpserver와 각 활성 입력 SMTP 접속에 대한 추가 tcpserver 과정도 볼 수
있습니다.
로깅을 처리하기 위해 splogger (또는 cyclog)을 사용하면,
qmaill사용자로서 운행하는 splogger (또는 cyclog)과정을 갖습니다.
게다가 큐메일이 로컬이나 원격 메세지전달로 바쁘면 관계되는
로컬수만큼의 qmail-local과정과 관계되는 원격수만큼의 qmail-
remote과정을 볼 수 있습니다.
5.6.2. 로그
5.6.2.1. splogger
메세지에 시간찍기하기 위해서 syslog의 로깅시스템을 사용해서 syslog
데몬으로 보냅니다. syslog은 /etc/syslog.conf에서 설정합니다.
syslog로 보내는 메세지는 장치와 우선순위가 있습니다.
/etc/syslog.conf의 기재사항은 장치와 우선순위에 따라서 필터해서
메세지를 원하는 로그파일, 원격로그호스트, 또는 콘솔에 보냅니다.
splogger는 기본으로 멜장치에 로그하므로, syslog.conf파일에서 "mail"을
grep하면 큐메일의 로그메세지처리를 볼 수 있습니다.
대개 다음장소에 위치합니다.
o /var/log/syslog
o /var/adm/SYSLOG
o /var/log/maillog
대개의 syslog 로그기재사항은 다음과 같습니다.
Jun 3 11:35:23 sparge qmail: 928424123.963558 delivery 153: success: did_1+0+0/
"Jun 3 11:35:23" is the syslog timestamp.
"sparge" is the name of the system that sent the message.
"qmail:" is the tag splogger places on all qmail log entries.
"928424123.963558" is an optional TAI timestamp (see next section).
"delivery 153: success: did_1+0+0/" is the log message itself.
5.6.2.2. cyclog
daemontools 패케지의 일부로서 특정한 디렉토리내의 파일에 메세지를
로그합니다. syslog와는 달리 기재사항을 시간찍기하지 않습니다.
daemontools패케지의 accustamp를 사용하면 됩니다.
로그디렉토리는 cyclog명령행에 명시하므로 큐메일기동스크립트를
살펴보시면 찾을 수 있습니다.
로그디렉토리내의 파일수와 각파일의 최대크기는 cyclog 옵션으로
정합니다. 로그파일명은 파일을 시작한 시간의 TAI (Temps Atomique
International) 시간찍기입니다. daemontools의 tailocal명령은 TAI
시간찍기를 사람이 읽을 수 있는 로컬 시간찍기로 변환합니다.
보통의 cyclog 록기재사항은 다음과 같습니다.
928424123.963558 delivery 153: success: did_1+0+0/
"928424123.963558" is the optional, but recommended, TAI timestamp.
"delivery 153: success: did_1+0+0/" is the log message itself.
5.6.2.3. 록메세지
로컬시스템에서 원격시스템으로 보내는 메세지에 대한 록은 다음과
같습니다.
1 928427555.143178 new msg 94030
2 928427555.145873 info msg 94030: bytes 189 from <dave@sparge.sill> qp 2594 uid 500
3 928427555.210992 starting delivery 158: msg 94030 to remote lwq@w3.to
4 928427555.213816 status: local 0/10 remote 1/20
5 928427572.640642 delivery 158: success: 209.85.127.177_accepted_message.
/Remote_host_said:_250_CAA01516_Message_accepted_for_delivery/
6 928427572.643845 status: local 0/10 remote 0/20
7 928427572.644381 end msg 94030
제1번줄은 큐메일이 새메제지를 받았음을 나타내고, 큐아이디는
94030입니다. 큐아이디는 메세지를 담는 큐파일인
/var/qmail/queue/mess/NN/파일의 아이노드번호입니다. 큐아이디는
메세지가 큐에 있는 동안은 고유합니다.
제2번줄은 메세지가 dave@sparge.sill에서 왔고 189바잇이라고 알려줍니다.
제3번줄은 qmail-remote가 메세지를 lwq@w3.to로 전달하려고 기동한다고
알려주며, 아이디 158을 전달에 부여합니다.
제4번줄은 로컬전달은 0개, 리못전달은 1개가 계류중이라고 알려줍니다.
제5번줄은 158번 전달이 성공으로 끝났고, 원격서버의 반응을 되돌리는데,
때때로 원격멜애드민이 전달을 추적하는데 유용한 정보를 포함합니다.
이번경우에서 "CAA01516"은 원격시스템의 전달아이딥니다.
제6번줄은 로컬전달 0개, 원격전달 0개가 계류중이라고, 즉 전달을
끝마쳤다고, 알려줍니다.
제7번줄은 메세지를 완전히 전달하고 큐에서 지웠다고 알려줍니다.
여기에서 큐아이디인 94030은 다른 전달에 또 사용할 수 있습니다.
5.7. 대형 서버
qmail-ldap도 보십시오.
5.7.1. Scalable parallelism
사용자디렉토리를 저장하려면 빠른 NFS넷웍파일서버를 사용하십시오.
파일서버상의 maildir멜복스에 전달하는 복합 동등선호 SMTP서버를
설치하십시오.
5.8. Sendmail에서 큐메일로 옮기기
먼저, Dan Berstein의 Sendmail->qmail페지를
<http://pobox.com/~djb/qmail/sendmail.html>에서 보시기 바랍니다.
5.9. 멜링리스트매니저 (Mailing List Managers: MLM's)
멜링리스트소유자가 멜링리스트를 운영하는 것을 돕는 시스템입니다. 하는
일은 두 가지입니다. 가입자들의 리스트를 관리하고, 가입자들에게
메세지를 재송부하는 일입니다.
유닉스멜링리스트매니저 대부분이 (또는 전부가) 큐메일과 작동할 수
있습니다.
5.9.1. ezmlm
큐메일의 저자인 Dan Bernstein이 작성했습니다. 큐메일과 사용하도록
썼으며, 큐메일의 몇몇 특징에 의존합니다. 가장 두드러진 점은
바운스메세지를 안정하게 처리하도록 VERP를 사용합니다. MLM중에서
ezmlm이 다소 독특한 점은 중앙 MLM주소로 보내진 명령을 처리하지 않고,
리스트의 이름에 덧붙입니다. 예) "foo@list.example.net"에 가입하려면
"foo-subscribe@list.example.net"으로 메세지를 보냅니다.
더 알고 싶으시면 비공식웹사이트이고, 매우 많은 특징을 포함하는 아주
훌륭한 애드온인 ezmlm-idx의 공식홈페지인 <http://www.ezmlm.org>를
보십시오.
5.9.2. 메이저도모
가장 많이 보급된 유닉스 MLM입니다. 두세가지만 고치면 큐메일과 멋지게
작용합니다. Russ Allbery가 큐메일/메이저도모에 관한 FAQ를 썼는데,
<http://www.eyrie.org/~eagle/faqs/mjqmail.html>에서 구할 수 있습니다.
5.10. 패치
큐메일에 대한 여러 소스코드패치를 구할 수 있습니다. 패치를
설치하려면, 다운로드하고, 큐메일소스트리로 가서 패치명령을 씁니다.
cd /usr/local/src/qmail/qmail-1.03
patch -p0 < /tmp/patchfile
큐메일을 멈춰야 하는데, qmail-send를 끝내거나, 설치항목에 있는
큐메일스크립트를 설치하셨다면 다음과 같이 합니다.
/usr/local/sbin/qmail stop
그리고나서 다시 컴파일하고 바이너리를 설치합니다.
make setup check
5.10.1. DNS
예로부터 DNS응답은 512바잇으로 제한되었다. 몇몇 대형사이트들,
그중에서도 America Online,은 MX응답을 더 길게해서 되돌리기
시작했습니다. 큐메일과 기타 많은 프로그램들은 매우 큰결과를 되돌리는
Domain Name Server (DNS)질의에는 문제가 있습니다. 큐메일에서는 이것을
해결하는데 두가지 방법이 있습니다.
5.10.1.1. 패킷버퍼사이즈를 65536까지 밀어올리기
회답이 절단빗셋과 돌아도면 라입러리코드내에서 TCP질의를 자동으로 하는
최근의 BIND resolver 라입러리와 동작합니다. 가장 간단한 해결이지만,
해당시스템의 페이징처리방법에 따라서 메모리낭비가 가장 클 수 있습니다.
dns.c의 PACKETSZ를 65536으로 바꾸고 큐메일을 다시 컴파일하면 됩니다.
5.10.1.2. Christopher K. Davis의 패치 (urlnam
<http://www.ckdhr.com/ckd/qmail-103.patch>)
아무리 오래되었어도, 그리고 "버퍼에 놓이는 바잇수"라입러리버그를
피하려고 가드(guard)바잇을 사용하는 어떤 리졸버라입러리와도 동작하는
Chuck Foster의 패치를 개조한 것입니다. 필요한 크기로 하기보다는
(원래패치와 같이 응답이 기본 512바잇인 PACKETSZ보다 커야지만
재할당하지만) 65536으로 단 한번만 재할당하므로 Chuck의 패치보다
메모리효율에서는 떨어집니다. 재할당후에, TCP질의를, 리졸버라입러리가
하게하지 않고, (큐메일과 네임서버가 같은 기계 또는 로컬넷웍에 있으면
큰걱정이 아니지만, 그것들간 여분의 왕복을 피하면서) 강제로 합니다.
5.10.2. qmail-ldap
Andre Oppermann 등의 이 패치는 Lightweight Directory Access Protocol
(LDAP)지원을 큐메일에 구현합니다. LDAP는 넷웍전화책과 같습니다.
qmail-ldap를 사용하면 POP서버를 수천명의 사용자에게 편의를 제공할 수
있습니다. <http://www.nrg4u.com/>를 보십시오.
5.11. QMTP (Quick Mail Transfer Protocol)
Dan Bernstein이 설계한 SMTP대체프로토콜입니다. 해당 프로토콜은
<http://pobox.com/~djb/proto/qmtp.txt>에 정의되어 있습니다. SMTP와
유사하지만, 더 간단하고, 더 빠르고, SMTP와는 호환되지 않습니다.
큐메일은 qmail-qmtp라는 QMTP서버를 포함하는데, qmail-smtp와 매우
흡사하게 동작합니다. 대개 209포트를 이용합니다.
큐메일은 QMTP클라이언트를 포함하지 않지만, serialmail패케지는 그것을
포함합니다. maildir2qmtp는 maildir멜복스에 있는 메세지를 QMTP를
통해서 지정한 QMTP서버로 전달합니다.
SMTP에 대한 drop-in 대체품이 아니며, 아직까지는 인터넷상에서 많이
퍼지지 않았습니다.
6. 부록
6.1. 사례
먼저 이런 강력하고 멋들어진 시스템을 설계하고 쓴 Dan Bernstein에게
감사를 표시합니다. 3년간의 사용후에도 큐메일은 저를 감동하게 합니다.
큐메일멜링리스트의 회원들께도 감사하고자 합니다. Russell Nelson은
가장 큰 도움과 인내와 지식과 재미를 공헌한 사람들 중 하나로 특별히
언급할 만 합니다. 큐메일공동체에 대한 그의 공헌은 오직 DJB에게만
뒤질뿐입니다.
본문서에 검토와 기여를 하신 모든 분들께도 사례를 드립니다.
o Vince Vielhaber
o Chris Green
o Christopher K. Davis
o Scott Schwartz
o Fred Lindberg
o Russell P. Sutherland
o Alex Miller
o Tim Hunter
o Frank D. Cringle
o Mahlon Smith
o Rogerio Brito
마컵언어로서 HTML, 평범한 문서, 포스트스크립트, POD, 기타 형식문서
등을 만들어 냅니다. 그것으로 일이 많이 쉬었습니다. 더알고 싶으시면
<http://www.mincom.com/mtr/sdf/>를 보십시오.
6.2. 관련 패키지
6.2.1. dot-forward
Sendmail은 dot forward라고 발음하는 .forward파일을 사용해서 사용자가
수신메세지의 전달을 통제하도록 합니다. 큐메일도 유사한 장치를 쓰는데,
.qmail파일입니다. dot-forward패키지는 큐메일이 .forward파일을 사용할
수 있게 합니다. .forward파일을 사용하는, Sendmail이나 여타 MTA를
운영하는 시스템은 사용해서 기존의 .forward파일을 .qmail에
상응하는것으로 변환하지 않기 위해서, 또는 단순히 큐메일로의 이행을
사용자들에게 덜 눈에 띄게 하기 위해서 dot-forward의 사용을 고려해야 할
지도 모릅니다.
작은 패케지이므로 설치하고 설정하는 데 쉽습니다. 해당 소스는
<ftp://koobera.math.uic.edu/www/software/dot-forward-0.71.tar.gz>에서
구할 수 있습니다.
Dan Bernstein이 썼고, 그는 관련홈페지를 <http://pobox.com/~djb/dot-
forward.html>에 관리합니다.
6.2.2. fastforward
또다른 Sendmail호환 애드온입니다. Sendmail은
중앙앨리어스데이터베이스를 대개 /etc/aliases라는 단일파일에
보관합니다. 큐메일은 /var/qmail/alias에 있는 일련의 dot-qmail파일들을
사용하는데, 한 파일에 한 앨리어스입니다. 큐메일로 옮기시는데 변환하고
싶지 않은 Sendmail형식의 앨리어스파일이 있으시면, fastforward가
큐메일에게 앨리어스파일을 있는 그대로 쓸 수 있게 해줍니다.
해당 소스는
<ftp://koobera.math.uic.edu/www/software/fastforward-0.51.tar.gz> 에서
구할 수 있습니다.
Dan Bernstein이 썼고, 그는 <http://pobox.com/~djb/fastforward.html>에
웹페지를 관리합니다.
6.2.3. ucspi-tcp
큐메일의 SMTP서버는 스탠드얼론데몬으로 작동하지 않습니다.
도우미프로그램인 inetd, xinetd, 또는 tcpserver 등이 데몬으로
작동합니다. SMTP포트인 25포트로 접속을 받으면 qmail-smtpd 사본을
실행합니다.
inetd는 표준넷웍서버인 "수퍼서버"입니다. /etc/inetd를 설정해서 qmail-
smtpd를 작동할 수 있습니다만, ucspi-tcp패케지의 일부인 tcpserver가
권장툴입니다. ucspi-tcp는 UNIX Client-Server Program Interface for
TCP의 두문자이고, ooks-pie tee see pee로 발음합니다.
tcpserver를 선호하는 이유는 다음과 같습니다.
o 서비스로의 동시접속수를 제한할 수 있습니다. inetd는
접속률제한장치를 쓰므로 너무바쁜 서비스를 잠시 무력하게 할 수
있습니다.
o 특정 호스트에게 접근거부하도록 하거나, "로컬"호스트를 인식하고
신호를 부여해서 qmail-smtpd가 다르게 취급하도록 설정할 수 있습니다.
o 큐메일의 저자가 지원하는 유일한 서버입니다.
해당 소스는 <ftp://koobera.math.uic.edu/www/software/ucspi-
tcp-0.84.tar.gz> 에서 구하실 수 있습니다.
Dan Bernstein이 썼고, <http://pobox.com/~djb/ucspi-tcp.html>에
웹페지를 운영합니다.
6.2.4. daemontools
서비스를 통제하고 감시하는 유틸리티군을 담고 있습니다. 필수사항은
아닙니다만, 특히 바쁜시스템에게는 강력히 권장합니다. 포함하는
유틸리티들은 다음과 같습니다.
o supervise: 서비스를 감시하고, 끝나면 다시 시작합니다.
o svc: supervise와 통신해서 서비스를 멈추고, 쉬고, 다시시작하게
합니다.
o cyclog: 서비스에 대한 로그를 유지하고, 설정한 크기이하로 유지할 수
있게 자동으로 교대시킵니다.
o accustamp: 로그기재사항을 정확하게 시간찍기합니다.
o usually, errorsto: 이상한 메세지에 대한 로그를 주시합니다.
o setuser: 일반사용자의 UID와 GID로 수퍼유저의 프로그램을 돌립니다.
해당소스는 <http://cr.yp.to/daemontools/daemontools-0.61.tar.gz>에서
구하실수 있습니다.
Dan Bernstein이 썼고, <http://cr.yp.to/daemontools.html>에 웹페지를
운영합니다.
6.2.5. qmailanalog
큐메일의 로그파일을 처리하고 해당 시스템이 얼마나 그리고 어떤 일을
하고 있는 지 알리는 일련의 보고서를 만듭니다. 얼마나 많은 메세지를
주고 받았는 지, 얼마나 큰 지, 얼마나 빨리 처리되는 지 등에 대한 통계가
필요하면, qmailanalog가 바로 그것입니다.
보너스로 matchup프로그램은 큐메일의 매 전달당 복수로그행을 하나로
만드는데, 이미 익숙한 Sendmail로그와 다르지 않습니다.
해당소스는
<http://pobox.com/~djb/software/qmailanalog-0.70.tar.gz>에서 구하실 수
있습니다.
Dan Bernstein이 썼고, <http://pobox.com/~djb/qmailanalog.html>에
웹페지를 운영합니다.
6.2.6. rblsmtpd
스팸당해보지 않으셨다면 운이 좋았다고 생각하십시오. 이메일사용자들
대부분이 스팸이라고 알려진 원치않는 두툼한 이메일 (Unsolicited Bulk E-
mail: UBE)에 익숙합니다. 그것들 대부분 섹스사이트, 행운의 편지, 기타
신용사기 등에 대한 광고입니다. 1988년 정도 전까지의 예전에는
인터넷상의 MTA들 대부분은 개방중계, 즉 송신자도 수신자도 모두 로컬이
아니라도 누구든지 보내고 누구든지 받는 멜을 받아들였습니다. 스패머는
스팸을 전달하기 위해서 어느것이든 찾기만 하면 개방중계를 이용합니다.
그렇게 되면 행적을 덮어버리고, 반발을 "정직한" 중계사이트로 돌리게
되며, 그들은 CPU시간과 넷웍대역을 많이 아끼게 됩니다.
요즘 이런 개방중계는 심한 불량으로 인식되고, 몇몇 반스팸자경단그룹은
개방중계와 기타 저속한 스팸출처를 확인하는 장치를 만들어서 그들로부터
SMTP접속승락을 피할 수 있습니다. Realtime Blackhole List (RBL), Open
Relay Behavior-modification System (ORBS), Dial-up User List (DUL)
등이 그것입니다.
o <http://maps.vix.com/rbl/>
o <http://www.orbs.org>
o <http://maps.vix.com/dul/>
rblsmtpd는 RBL SMTP 데몬입니다. tcpserver와 qmail-smtpd의 사이에
있으면서 이 리스트상에서 확인된 시스템으로부터의 접속을 거부합니다.
관련소스는 <http://pobox.com/~djb/software/rblsmtpd-0.70.tar.gz>에서
구할 수 있습니다.
Dan Bernstein이 썼고, <http://pobox.com/~djb/rblsmtpd.html>에
웹페지를 유지합니다.
6.2.7. serialmail
큐메일은 전시간, 고속접속의 시스템을 위해 설계되었습니다.
serialmail은 큐메일을 간헐적이고 저속도 접속에 더 잘 맞게 하는
툴군입니다. 그런 시스템상의 serialmail로 큐메일은 모든 원격멜을 단일
maildir로 전달하도록 설정됩니다. serialmail의 maildir2smtp명령은
접속이 되었을 때 ISP의 멜허브로 maildir를 올리는 데 사용됩니다. ISP가
QMTP (고급주제의 QMTP를 보십시오.)를 지원하면, maildir2qmtp도 쓸 수
있습니다.
serialmail은 접속의 ISP측에서 AutoTURN을 구현하는데 사용될 수 있는데,
클라이언트가 하는 SMTP접속은 서버가 접속을 클라이언트로 돌려서 서버에
큐된 메세지를 클라이언트로 보내도록 합니다. 이것은 ETRN SMTP기능과
유사합니다.
해당소스는
<http://pobox.com/~djb/software/serialmail-0.75.tar.gz>에서 구하실 수
있습니다.
Dan Bernstein이 썼고, <http://pobox.com/~djb/serialmail.html>에
웹페지를 유지합니다.
6.2.8. mess822
RFC 822를 따르는 메세지를 해석하는 응용제품군과 라입러리입니다.
응용제품은 다음과 같습니다.
o ofmipd: 클라이언트로부터 메세지를 받아서 From필드를 데이터베이스에
기초해서 재작성하는 데몬
o new-inject: 사용자통제하에 호스트네임을 재작성하는 것을 지원하는
qmail-inject대제품
o iftocc: 메세지가 특정주소로 보내졌는 지를 검사하는 .qmail 유틸리티
o 822header, 822field, 822date, 822received: 메세지에서 정보를 추출
o 822print: 메세지를 예쁘게 프린트
해당 소스는 <http://pobox.com/~djb/software/mess822-0.58.tar.gz>에서
구하실 수 있습니다.
Dan Bernstein이 썼으며 <http://pobox.com/~djb/mess822.html>에
웹페지를 유지합니다.
6.2.9. ezmlm
성능이 우수하고 사용하기 쉬운 큐메일용 멜링리스트매니저입니다.
LISTSERV나 Majordomo에 익숙하시다면 멜링리스트매니저가 무엇을 하는 지
아실겁니다. 큐메일에서의 멜링리스트에 대해 더 알고 싶으시면
고급주제의 멜링리스트매니저항목을 보십시오.
해당소스는 <http://pobox.com/~djb/software/ezmlm-0.53.tar.gz>에서
구하실 수 있습니다.
Dan Bernstein이 썼고, <http://pobox.com/~djb/ezmlm.html>에
관련웹페지가 있습니다.
6.2.10. safecat
파일을 maildir멜복스에 확실히 씁니다. 특별히 procmail 방법으로
메세지를 보관하는 데 유용합니다. 예를 들면, 다음방법은 메세지를 모두
Maildir에 보관합니다.
:0w
|safecat Maildir/tmp Maildir/new
Len Budney가 썼고,
<http://www.pobox.com/~lbudney/linux/software/safecat.html> 에
웹페지를 운영하고 있습니다.
6.2.11. maildrop
procmail과 유사한 멜필터입니다. (패치를 하지않은) procmail이 갖지
않은 특징 하나는 maildir멜복스를 지원한다는 것입니다.
Sam Varshavchik이 썼고, <http://www.flounder.net/~mrsam/maildrop>에
웹페지를 운영합니다.
6.3. 인터넷멜의 동작방법
6.3.1. 메세지가 A지점에서 B지점으로 가는 방법
한호스트의 사용자가 다른 호스트의 사용자에게 메세지를 보내면,
무대뒤에서는 알아차리지 못하는 많은 일이 일어난다.
예를 들어 alice@alpha.example.com의 Alice가 bob@beta.examle.com의
Bob에게 메세지를 보낸다고 합시다. 다음과 같은 일이 벌어집니다.
Alice는 mutt이나 pine 등 자기의 Mail User Agent (MUA)로 메세지를
작성합니다. To 필드에 수신인, Subject필드에 메세지의 제목을, 그리고
메세지본문을 적습니다. 다음과 같을 겁니다.
To: bob@beta
Subject: lunch
How about pizza?
1. 메세지가 맘에 들면 MUA에게 보내도록 합니다.
2. 여기서, MUA는 Date나 Message-Id 등과 같은 추가헤더필드를 덧붙이고,
(예를들어서 bob@beta를 "Bob <bob@beta.example.com>"로 바꿔서)
Alice가 넣은 값들을 고칩니다. 다음으로, MUA는 멜시스템에 메세지를
삽입합니다. 여기에는 두가지 방법이 있습니다. 메세지를 삽입하기
위해 멜시스템에서 제공하는 프로그램을 실행하거나, 로컬시스템 또는
원격멜서버상의 Simple Mail Transfer Protocol (SMTP)포트에 접속을
엽니다. 본 예제에서, 우리는 MUA가 로컬삽입프로그램을 사용해서
메세지를 MTA로 보낸다고 하겠습니다. 삽입과정의 자세한 내용은
MTA마다 다르지만, 유닉스시스템에서는 sendmail방식이 사실표준입니다.
이방식으로 MUA는 헤더와 본문을 공백줄로 분리해서 파일에 넣고,
sendmail프로그램으로 그 파일을 보냅니다.
3. 메세지가 구문이 올바르고 sendmail이 제대로 호출되어서 삽입을
성공했으면, 그 메세지는 이제 MTA의 책임입니다. 세부사항은 MTA마다
크게 다르지만, 대개 alpha의 MTA는 헤더를 검토해서 메세지를 어디로
보낼지 결정해서, beta에 SMTP접속을 열고, beta시스템의 MTA로
메세지를 전송합니다. SMTP대화에서 메세지는 두 부분으로 나눠서
보내지게 되는데, 그 하나는 봉투로서 수신인 주소
(bob@beta.example.com)와 회신주소 (alice@alpha.example.com)를
명시하고, 다른 하나는 메세지 그 자체로서 헤더와 본문을 이룹니다.
4. beta 시스템에 bob이라는 사용자가 없어서 beta MTA가 메세지를
거부하면, alpha MTA는 회신주소인 alice@alpha로 바운스메세지를
보내서 문제를 알립니다.
5. beta MTA가 메세지를 수용하면, 수신인 주소를 보고서 그것이 로컬이나
원격시스템에 있는지 결정합니다. 본 예제에서는 로컬이므로 MTA는
메세지를 직접 전달하거나, /bin/mail이나 procmail 등과 같은 Mail
Delivery Agent (MDA)에게 건내줍니다.
6. Bob이 멜쿼타를 초과했기 때문에 전달이 안되면, beta MTA는 봉투의
회신주소인 alice@alpha로 바운스메세지를 보냅니다.
7. 전달이 잘되었으면, Bob의 MUA가 그 메세지를 읽어서 보여줄 때까지
그의 멜복스에 대기합니다.
6.3.2. 더많은정보
인터넷멜이 어떻게 작동하는 지에 대한 정보는 다음중 하나이상을
보십시오.
o <http://pobox.com/~djb/im.html>: 큐메일의 저자에 의한 인터넷멜
o <http://pobox.com/~djb/smtp.html>: 큐메일의 저자에 의한 SMTP
o <http://pobox.com/~djb/immhf.html>: 큐메일의 저자에 의한
인터넷멜메세지 헤더포맷
6.3.2.1. 인터넷 RFC들
인터넷의 Requests for Comment (RFC's)는 인터넷의 공식문서입니다.
이것들 대부분은 비평단계를 훨씬 넘어서 TCP, FTP, Telnet 등의
인터넷프로토콜과 여러 다양한 멜표준과 프로토콜을 정의합니다.
o RFC 821, Simple Mail Transfer Protocol.
<http://www.ietf.org/rfc/rfc0821.txt>
o RFC 822, Standard for the Format of ARPA Internet Text Messages.
<http://www.ietf.org/rfc/rfc0822.txt>
o RFC 931, Authentication Server.
<http://www.ietf.org/rfc/rfc0931.txt>
o RFC 974, Mail Routing and the Domain System.
<http://www.ietf.org/rfc/rfc0974.txt>
o RFC 1123, Requirements for Internet Hosts -- Application and
Support. <http://www.ietf.org/rfc/rfc1123.txt>
o RFC 1413, Identification Protocol.
<http://www.ietf.org/rfc/rfc1413.txt>
o RFC 1423, Privacy Enhancement for Internet Electronic Mail: Part
III: Algorithms, Modes, and Identifiers.
<http://www.ietf.org/rfc/rfc1423.txt>
o RFC 1651, SMTP Service Extensions.
<http://www.ietf.org/rfc/rfc1651.txt>
o RFC 1652, SMTP Service Extension for 8bit-MIMEtransport.
<http://www.ietf.org/rfc/rfc1652.txt>
o RFC 1806, Content disposition. header.
<http://www.ietf.org/rfc/rfc1806.txt>
o RFC 1854, SMTP Service Extension for Command Pipelining.
<http://www.ietf.org/rfc/rfc1854.txt>
o RFC 1891, SMTP Service Extension for Delivery Status Notifications.
<http://www.ietf.org/rfc/rfc1891.txt>
o RFC 1892, The Multipart/Report Content Type for the Reporting of
Mail System Administrative Messages.
<http://www.ietf.org/rfc/rfc1892.txt>
o RFC 1893, Enhanced mail system status codes.
<http://www.ietf.org/rfc/rfc1893.txt>
o RFC 1894, An Extensible Message Format for Delivery Status
Notifications. <http://www.ietf.org/rfc/rfc1894.txt>
o RFC 1939, Post Office Protocol - Version 3.
<http://www.ietf.org/rfc/rfc1939.txt>
o RFC 1985, SMTP Service Extension for Remote Message Queue Starting
(ETRN). <http://www.ietf.org/rfc/rfc1985.txt>
o RFC 1991, PGP Message Exchange Formats.
<http://www.ietf.org/rfc/rfc1991.txt>
o RFC 2015, MIME Security with Pretty Good Privacy. (PGP).
<http://www.ietf.org/rfc/rfc2015.txt>
o RFC 2045, MIME Internet message bodies.
<http://www.ietf.org/rfc/rfc2045.txt>
o RFC 2046, MIME Media Types. <http://www.ietf.org/rfc/rfc2046.txt>
o RFC 2047, MIME Headers. <http://www.ietf.org/rfc/rfc2047.txt>
o RFC 2048, MIME Registration Procedures.
<http://www.ietf.org/rfc/rfc2048.txt>
o RFC 2049, MIME Conformance Criteria.
<http://www.ietf.org/rfc/rfc2049.txt>
o RFC 2142, Mailbox names for common services.
<http://www.ietf.org/rfc/rfc2142.txt>
o RFC 2183, Content Disposition header.
<http://www.ietf.org/rfc/rfc2183.txt>
6.4. 구조
6.4.1. 모듈시스템구조
인터넷 MTA는 다양한 일을 합니다. Sendmail과 smail 등의 초기 디자인은
단일구성체입니다. 다른 말로, 하나의 커다란 복합으로서 '모자를
바꿔쓰는' 식인데, SMTP서버가 되려고 한 모자를 쓰고, SMTP클라이언트가
되려고 다른 모자를 쓰고, 또 메세지를 로컬로 삽입하려고 다른 모자를
쓰고, 큐를 관리하려고 다른 모자를 씁니다.
큐메일은 모듈방식입니다. 위의 각 기능들을 별개의 프로그램으로
수행합니다. 따라서, 프로그램들은 훨씬 더작고, 더간단하며, 기능이나
보안의 벅이 더 적습니다. 보안을 더 강화하기 위해서, 큐메일모듈은
상이한 특권으로 운행하고, 서로 "기대"하지 않기 때문에, 다른 모듈이 늘
하던대로 하리라고 추정하지 않습니다.
핵심모듈들입니다.
모듈 기능
qmail-smtpd SMTP를 통한 메세지의 수용과 거절
qmail-inject 메세지의 로컬삽입
qmail-rspawn/qmail-remote 원격전달처리
qmail-lspawn/qmail-local 로컬전달처리
qmail-send 큐처리
qmail-clean 큐청소
모듈방식에는 단점도 있습니다. 단일구성체의 MTA와 달리, 모듈간
상호작용은 잘정의되어있어서 모듈은 최소한의 필요정보만 서로
교환합니다. 이는 대개 디버깅목적으로 Sendmail이 동작궤적을
표준출력으로 내보냅니다. 한 sendmail바이너리가 삽입, 큐,
앨이어스처리, .forward파일처리, SMTP를 통한 원격송부 등을
다하기때문에, 메세지를 전달할때까지의 전체전달을 쉽게 추적할 수
있습니다. 큐메일에 동등한 능력은 없고, 모듈에서 모듈로 "디벅"플랙을
건네주는 것을 구현하려면 엄청나게 코드를 고쳐야 하고, 더 복잡해집니다.
6.4.2. 파일구조
/var/qmail이 큐메일파일구조의 근본입니다. 큐메일을 컴파일할때 바꿀
수는 있지만, 다른 애드민이 무엇인가를 어디에서 찾아야 할 지 알게
그대로 두어야 좋습니다. 큐메일트리의 일부 또는 전부를 다른곳에 꼭
놓고 싶으면, 심볼릭링크를 이용하는 것이 낳습니다. 자세한 내용은
설치항목의 디렉토리만들기항목을 보시기 바랍니다.
톱레벨 섭디렉토리입니다.
디렉토리 내용
alias 시스템전반의 앨리어스에 대한 .qmail파일
bin 프로그램바이너리와 스크립트
boot 기동스크립트
control 설정파일
doc 문서 (맨페지제외)
man 맨페지
queue 보내기전메세지의 큐
users 큐메일사용자 데이터베이스 파일
6.4.3. 큐구조
컴파일디렉토리의 INTERNALS파일에 큐의 자세한 내용을 더 잘
설명해놓았습니다. 다음은 큐구조의 좀더 넓은 개요입니다.
섭디렉토리 내용
bounce 영구전달에러
info* 송신자주소를 봉투하기
intd qmail-queue의 봉투진행
local* 로컬봉투수신자주소
lock lock 파일
mess* 메세지파일
pid qmail-queue가 i-node번호를 얻기 위해 사용
remote* 원격봉투송신자주소
todo 완전봉투
----------------------------------------------------------------------------------------
유의점: 디렉토리에 "*"표시가 있으면 (conf-split-1)까지 "0", "1", ..., 등으로 된
분할섭디렉토리를 갖고 있는데, conf-split은 컴파일디렉토리의 conf-split파일에
포함된 컴파일시설정입니다. 기본은 23입니다. 이렇게 디렉토리를 쪼개는 것은 매우
바쁜서버에서 단일디렉토리의 파일수를 줄이기 위해서입니다.
----------------------------------------------------------------------------------------
아이노드번호에 따라서 섭디렉토리하의 파일들을 이름짓습니다. 이것이
뜻하는 바는, 표준 유닉스 유틸리티인 mv, dump/restore, tar 등을 써서
수동으로 그것들을 움직이지 못합니다. 큐파일을 정확하게 이름바꾸는
사용자공헌 유틸리티가 <http://www.qmail.org>에 두어개 있습니다.
----------------------------------------------------------------------------------
유의점: 큐메일이 가동중에는 큐메일파일을 수정하지 않아야 좋습니다. 큐를 수정하려면,
먼저 큐메일을 멈추고, 큐를 조심하여 다루고, 다시 큐메일을 가동하십시오.
----------------------------------------------------------------------------------
6.4.4. 사진
/var/qmail/doc에 PIC로 이름을 시작하는 파일들이 죽 있습니다. 이들은
큐메일이 감당하는 다양한 상태의 문장"사진"입니다. 다양한 모듈을 통한
통제흐름을 보여주며, 복잡한 설정을 만들고 디버깅하는 데 큰 도움이
됩니다.
파일이름 개요
PIC.local2alias 로컬앨리어스에 전달한 로컬삽입메세지
PIC.local2ext 확장주소로 전달한 로컬삽입메세지
PIC.local2local 로컬사용자에게 전달한 로컬삽입메세지
PIC.local2rem 원격주소로 전달한 로컬삽입메세지
PIC.local2virt 로컬버추얼도메인상의 주소로 전달한 로컬삽입메세지
PIC.nullclient 널클라이언트에 삽입한 메세지
PIC.relaybad 로컬호스트를 중계로 사용하는 시도의 실패
PIC.relaygood 로컬호스트를 중계로 사용하는 시도의 성공
PIC.rem2local SMTP를 통해 받은 로컬사용자에로의 메세지
이 파일들은 다음에서 온라인으로 구할 수 있습니다.
o <http://www.qmail.org/man/index.html>
큐메일의 진짜사진을 원하신다면, Andre Opperman의 "대형큐메일사진"을
<http://www.nrg4u.com/>에서 보십시오.
6.5. 어쩌다 한번씩 묻는 질문들
이것들은 자주 묻지는 않지만 중요하고 대답하기도 쉽지 않은
질문들입니다.
6.5.1. 큐메일은 지연메세지를 어느 정도 자주 보냅니까?
메세지마다 재시도시간표가 있습니다. 메세지가 전달불능으로 오래
있을수록, 큐메일은 그것을 덜 자주 보내려고 합니다. 재시도시간표는
설정할 수 없습니다. 다음 테이블은 원격수신자에게 가는 전달불능인
메세지가 바운스될때까지의 재시도시간표를 보여줍니다. 로컬메세지는
비슷하지만, 더 잦은 시간표를 사용합니다.
전달시도 초 날-시:분:초
1 0 0-00:00:00
2 400 0-00:06:40
3 1600 0-00:26:40
4 3600 0-01:00:00
5 6400 0-01:46:40
6 10000 0-02:46:40
7 14400 0-04:00:00
8 19600 0-05:26:40
9 25600 0-07:06:40
10 32400 0-09:00:00
11 40000 0-11:06:40
12 48400 0-13:26:40
13 57600 0-16:00:00
14 67600 0-18:46:40
15 78400 0-21:46:40
16 90000 1-01:00:00
17 102400 1-04:26:40
18 115600 1-08:06:40
19 129600 1-12:00:00
20 144400 1-16:06:40
21 160000 1-20:26:40
22 176400 2-01:00:00
23 193600 2-05:46:40
24 211600 2-10:46:40
25 230400 2-16:00:00
26 250000 2-21:26:40
27 270400 3-03:06:40
28 291600 3-09:00:00
29 313600 3-15:06:40
30 336400 3-21:26:40
31 360000 4-04:00:00
32 384400 4-10:46:40
33 409600 4-17:46:40
34 435600 5-01:00:00
35 462400 5-08:26:40
36 490000 5-16:06:40
37 518400 6-00:00:00
38 547600 6-08:06:40
39 577600 6-16:26:40
40 608400 7-01:00:00
6.5.2. 저는 MX가 많은 대형사이트에 매일을 보내지 못하는데 왜그렇죠?
다음의 메세지를 받는다면,
deferral: CNAME_lookup_failed_temporarily._(#4.4.3)/
문제는 큐메일이 대형네임서버질의응답을 처리하지 못해서입니다. 패치를
설치해서 고칩니다. 고급주제에서 패치를 보시기 바랍니다.
어떤사람은 이런시스템에 닿는데 문제가 없는데 왜그러냐고 질문할 수도
있습니다. 원래, 타이밍과 로컬네임서버에 한 질의순서에 의거하여,
"aol.com"에 대한 수도 있습니다.
A와 MX레코드가 시간초과하면 "그럴수도" 있지만, NS로코드는 그렇지
않습니다. .COM서버는 2틀의 수명시한 (TTL)을 설정해놓지만, AOL은
레코드에 1시간의 수명시한을 설정해놓으므로, 덜바쁜 네임서버에서 이러한
일이 종종 일어납니다. 더바쁜 네임서버는 특정시간에 그 레코드들은
캐쉬에 갖고 있기 때문에 패치하지 않은 큐메일이 CNAME을 점검하려는
시도를 무색하게 합니다.
더좋은 시험은 nosuchuser@large-mx.ckdhr.com으로 멜을 보내는 겁니다.
그 서버가 당신의 큐를 청소하고, ckdhr.com에서 바운스하는 것으로
끝나면, 당신의 MTA는 512바잇을 넘기는 MX 리스트를 갖는 호스트로 멜을
보낼 수 있습니다. (단일 수명시한이며 512바잇을 넘기는 단일 RRset을
사용해서, 이문제를 다른 질의의 타이밍과 순서에 의지하지 않고 볼 수
있습니다.)
6.5.3. QUEUE_EXTRA?
컴파일시설변수로서 매전달에 추가하는 추가수신인을 적습니다. 본래
로깅하려고 사용합니다. 예를 들면, FAQ에는 QUEUE_EXTRA를 써서 드나는
메세지를 전부 보관하는 방법을 설명합니다.
QUEUE_EXTRA를 사용하려면, extra.h를 편집해서 "T수신인\0"형식으로
수신인을 추가하고, QUEUE_EXTRALEN에 QUEUE_EXTRA의 길이를 적습니다.
("\0"은 한문자로 계산됩니다.) 예를 들면 다음과 같습니다.
#define QUEUE_EXTRA "Tlog\0"
#define QUEUE_EXTRALEN 5
큐메일이 운행중이면 중지시킵니다. 설치항목의 큐메일스크립트를
설치하셨으면, 다음과 같이 하십시오.
/usr/local/sbin/qmail stop
큐메일스크립트가 없으시면, 기동/중지 스크립트를 사용하시든지,
TERM신호를 qmail-send에 보내십시오.
그다음에 다음과 같이 해서 큐메일을 재컴파일하십시오.
make setup check
원하시는 대로 alias/.qmail-log을 채우십시오. 예를 들어, Message-ID를
록하려면 다음과 같이 합니다.
| awk '/^$/ { exit } /^[mM][eE][sS][sS][aA][gG][eE]-/ { print }'
끝으로, 큐메일을 재가동합니다.
6.6. 에러메세지
큐메일에러메세지와 그 의밉니다.
괄호안의 에러코드에 관한 설명은 RFC 1893을 보십시오.
이 부록은 완전하지 않습니다.
qmail-local
o "Unable to fork: reason. (#4.3.0)"
o "Unable to read message: reason. (#4.3.0)"
o "Unable to open filename: reason. (#4.3.0)"
o "Temporary error on maildir delivery. (#4.3.0)"
o "Unable to open filename: reason. (#4.2.1)"
o "Unable to write filename: reason. (#4.3.0)"
o "Unable to run /bin/sh: reason. (#4.3.0)"
o "Unable to stat home directory: reason. (#4.3.0)"
o "Unable to switch to directory: reason. (#4.3.0)"
qmail-smtpd
o "555 syntax error (#5.5.4)"
qmail.c
o "Zqq write error or disk full (#4.3.0)"
o "Zqq read error (#4.3.0)"
spawn.c
o "Internal error: delnum negative. (#4.3.5)"
o "Internal error: delnum too big. (#4.3.5)"
o "Internal error: delnum in use. (#4.3.5)"
o "Internal error: messid has nonnumerics. (#5.3.5)"
o "Internal error: messid too long. (#5.3.5)"
o "Internal error: messid too short. (#5.3.5)"
6.7. 의외의 실수
큐메일신참자는 다음과 같은 문제들을 자주 만납니다.
6.7.1. 큐메일은 수퍼유저에게 멜을 전달하지 않습니다.
qmail-local이 특권사용자로서 명령을 실행하는 가능성을 막기위해서,
큐메일은 UID가 0인 모든 사용자를 무시합니다. 이것은 qmail-getpw
맨페지에 설명되어 있습니다.
그렇다고 큐메일이 root@example.com에 전달하지 않는다는 것은 아니고,
다만 전달은 비특권사용자에 의해 처리되어야 한다는 것입니다. 으례,
/alias/.qmail-root을 채워서 root에 대한 앨리어스를 만듦니다.
6.7.2. 큐메일은 홈디렉토리가 없는 사용자에게 멜을 전달하지 않습니다.
또하나의 보안특징이고, 좋은 습관입니다. qmail-getpw맨페지에 설명되어
있습니다.
6.7.3. 큐메일은 사용자이름에 대문자를 쓰는 사용자에게 멜을 전달하지
않습니다.
큐메일은 주소에서 "@"의 왼쪽에 있는 모든 것인 "로컬부분"을 소문자로
변환합니다. 맨페지에는 설명되어 있지 않지만, 코드는 그렇게 합니다.
대문자를 갖는 사용자를 무시한다는 사실은 qmail-getpw맨페지에 기록되어
있습니다.
6.7.4. 큐메일은 홈디렉토리에 그룹이나 기타사용자에게 쓰기를 허락하는
사용자에게 멜을 전달하지 않습니다.
또하나의 보안특징입니다. qmail-local맨페지에 설명되어 있습니다.
컴파일시 conf-patrn 컴파일 컨피그파일을 통해서 재지정할 수 있습니다.
6.7.5. 큐메일은 확장주소의 점(.)을 콜론(:)으로 바꿉니다.
또하나의 보안특징입니다. 확장주소가 파일트리를 ".."로 백업하는것을
막는 것이 목적입니다. 콜론으로 바꾸기 때문에, 큐메일은 사용자의
.qmail파일 모두가 홈디렉토리에 있게 합니다. qmail-local맨페지에
기록했습니다.
6.7.6. 큐메일은 확장주소의 대문자를 소문자로 바꿉니다.
큐메일은 주소의 로컬부분을 모두 소문자로 만든다는 또하나의 사실입니다.
qmail-local맨페지에 설명했습니다.
6.7.7. 큐메일은 /etc/hosts를 사용하지 않습니다.
큐메일은 호스트네임이 있는 IP주소를 결정하기 위해서 /etc/hosts를
사용하지 않습니다. control파일에 있는 이름을 사용하면, 큐메일은
네임서버에 접근할 수 있어야 합니다.
그래도 네임서버에 접근할 수 없는 시스템에서도 큐메일을 운영할 수
있습니다. control파일에 있는 호스트는 IP주소로 적을 수도 있는데,
대괄호 ([])로 둘러싸야 합니다. 예를 들면 다음과 같습니다.
[10.1.2.219]
사실, 대괄오가 언제나 필요하지는 않지만, 사용해야 좋은 방법입니다.
6.7.8. 큐메일은 SMTP활동을 록하지 않습니다.
여러 이유로 해서, 큐메일은 SMTP접속, 거절, 무효명령, 또는 유효명령
등을 록하지 않습니다. tcpserver로 접속을 록할 수 있고, recordio로
SMTP대화 전부를 록할 수 있습니다. recordio는 ucspi-tcp패케지의
일부입니다. 절차는
<http://pobox.com/~djb/qmail/faq/servers.html#recordio>의 FAQ에
설명되어 있습니다.
6.7.9. 큐메일은 지연통지를 만들지 않습니다.
Sendmail은 수시간내에, 통상 4시간내에, 메세지를 전달할 수 없으면,
작성자에게 지연통지를 보냅니다. 이 통지는 바운스메세지같아
보입니다만, 아직 전달이 영구실패했다는 것을 가리키지는 않습니다.
큐메일은 이런 경고를 보내지 않습니다. 전달불능메세지는 큐에서
큐수명시간을 다 보낸다음에야만 작성자에게 돌려집니다.
6.7.10. 큐메일은 /var/qmail/queue/lock/trigger가 틀린접근권한이거나
보통파일이면 늦어집니다.
qmail-queue와 qmail-send는 /var/qmail/queue/lock/trigger라는
네임파잎은 통해서 의사소통합니다. 이 파잎이 엉망이 되면, qmail-send는
반시간정도 새메세지를 통보하지 않습니다.
올바르게 설치되었다는 것을 확신하는 가장 좋은 방법은 소스디렉토리에서
"make check"을 실행하는 것입니다. 그것이 가능하지 않다면, 다음과 같은
지 확인하십시오.
# ls -l /var/qmail/queue/lock/trigger
prw--w--w- 1 qmails qmail 0 Jul 5 21:25 /var/qmail/queue/lock/trigger
줄의 앞에 (네임파잎을 알리는) "p", 모드 (특히 전체쓰기허가), 소유자와
그룹 등에 각별히 유의해 보시기 바랍니다.
6.8. lwq에 대한 FAQ
--------------------------------------------------------------------------------
역자추가: 다음의 주소에서 최근의 질의응답을 참고하실 수 있습니다. (05 Apr 2000)
http://www.faqts.com/knowledge-base/index.phtml/fid/139/lang/en
--------------------------------------------------------------------------------
6.8.1. lwq의 소유자는?
lwq는 Copyright 1999 David E. Sill입니다.
6.8.2. lwq의 라이센스는?
lwq는 OpenContent License version 1.0에 포함됩니다. 완전한 라이센스에
대해서는 <http://www.opencontent.org/opl.shtml>를 보십시오. 본래,
수정판을 재배포한다면 그판도 OpenContent License에 포함된다는 조건하에
lwq를 복사, 재배포, 수정할 수 있습니다.
6.8.3. lwq의 새판을 구할 수 있다는 것은 어떻게 통지받을 수 있습니까?
lwq-announce-subscribe@sws1.ctd.ornl.gov에 메세지를 보내서 lwq-
announce멜링리스트에 가입하십시오.
6.8.4. lwq공헌자와 팬은 어디서 이야기할 수 있습니까?
lwq-subscribe@sws1.ctd.ornl.gov에 메세지를 보내서 lwq 멜링리스트에
가입하십시오.
6.8.5. lwq는 다른 언어로 번역되었습니까?
lwq를 번역하는데 관심있으시면, 제게 알려주셔서 노력의 중복을 막고,
조화할 수 있게 해주십시오. 또한 제가 SDF소스문서를 번역하시는 분께
드려서, 번역이 SDF로도 될 수 있게 할 수 있습니다. (이것이 왜 중요한
지 다음질문을 보시기 바랍니다.)
또한, lwq를 번역하시는 분들은 lwq멜링리스트에 가입하셔서 (전의 질문을
보십시오.) 번역에 관한 논점을 토론하고 공지사항을 만들 수 있도록
하시길 권장합니다.
6.8.6. lwq는 HTML이외에 포스트스크립트, PDF, 평범한글, 또는
다른형태로도 구할 수 있습니까?
그렇습니다. 다른 형태는
<http://Web.InfoAve.net/~dsill/qmail.html>에서 찾을 수 있습니다.
6.8.7. lwq를 사용했더니, 시스템파괴, 하드디스크삭제, 백발을 했습니다.
죄송합니다. 정말이지 미안합니다. 그렇지만 lwq는 어떤 보증도
없습니다. 위에서 말씀드린 OpenContent License를 보시기 바랍니다.
저는 이것을 쓴다고 해서 어떤 보상을 받지 않았고, 다만 큐메일공동체에
무언가 유익한 것을 공헌하고 싶었을 뿐입니다.
사실, 이것은 FAQ가 아닙니다. 진짜로는, 이것이 NAQ (Never Asked
Question)이길 바랍니다.
[하나 받으십시오!]
========================================================================================
메일을 전달하기 위해서 메일 클라이언트(접속을 시도하는 프로그램이
메일 클라이언트이든, 다른 메일 서버이든, 클라이언트라고 하겠습니다.)가
는 일단 qmail 이 돌아가고 있는 서버의 25번 포트로 접속을 합니다.
그러면, 서버의 tcpserver 가 그 요청을 받습니다.
그리고 tcpserver 는 /etc/tcp.smtp 파일을 체크해서
(정확히는 /etc/tcp.smtp.cdb 입니다) 접속을 해 온
클라이언트의 ip 주소를 체크합니다.
만약, ip 주소가 /etc/tcp.smtp 에서 allow 로 되어 있는 ip 주소라면,
릴레이를 허용합니다.
(해당 엔트리에 RELAYCLIENT 옵션이 있다면,
/var/qmail/control/rcpthosts 파일도 무시합니다.)
그리고, tcpserver 는 qmail-smtpd 에게 연결을 넘겨줍니다.
qmail-smtpd 는 접속해 들어온 클라이언트와
helo servername.domain.com
으로 인사(?)를 나눕니다.
그리고,
mail from:id@domain.com
rcpt to:id@destdomain.com
message..
등의 일반적인 smtp 처리를 합니다.
그런데,
rcpt to:
명령(?)이 클라이언트로부터 들어오게 되면,
만약 /var/qmail/control/rcpthosts 파일을 참조합니다.
(클라이언트의 ip 가 /etc/tcp.smtp 파일에서 RELAYCLIENT 옵션을 주지
않은 ip 일 경우)
그리고, rcpt to: 뒤의 메일을 받을 사람의 도메인 네임(서버 이름)을
/var/qmail/control/rcpthosts 파일을 검색해서 찾을 수 없다면,
sorry, 릴레이를 허용하지 않습니다....
류의 메세지를 클라이언트에게 보내주고, 해당 메일을 전송해 주지 않습니다.
그러나, /etc/tcp.smtp 에서 allow 로 되어 있고, RELAYCLIENT 옵션을 부여한
ip 를 가진 클라이언트에서 25 번 포트로 접속해 들어오면,
qmail-smtpd 는 /var/qmail/control/rcpthosts 파일을 체크하지 않고,
rcpt to: 가 지정하는 도메인(메일주소)으로 메일을 보내(릴레이 하여)줍니다.
아웃룩, balsa 등의 메일 클라이언트를 이용하여 메일을 보낼때에도
이와 똑같은 일이 일어납니다.
메일 클라이언트는 지정된 메일 서버의 25번 포트로 접속해 들어가서,
메일을 보냅니다.
따라서, /etc/tcp.smtp 파일에, (회사내에서) 메일 클라이언트를 사용하는
사용자들의 ip 주소를 모두 적어주어야 아웃록 등의 클라이언트에서
메일을 보내 줄 수 있습니다.
그리고, /etc/tcp.smtp 파일을 갱신했다면,
tcprules 를 이용해서 반드시 /etc/tcp.smtp.cdb 도 갱신해 주어야
한다는 것을 잊지 않도록 합니다.
설정 파일들의 형식(문법)에 대한 자세한 것들은
기존의 문서를 참조하면 쉽게 알 수 있습니다.
전 단지, qmail 서버에 접속 요청이 들어왔을 때
서버가 어떻게 작동하는지에 대해 설명했을 따름입니다.
(제대로 맞게 했는지 불안하지만.. -_-a)