It is very common these days for a single system to
host many domains. For instance, arkum.ch and
akadia.com might run on a single host, but
act as if they were two totally different hosts. A system usually has a canonical
domain, which is considered its usual or common domain name. Additional domains are
configured as virtual domains. Each virtual domain can host services such as web
sites and email as if it were the only domain on a server.
To determine which technique or techniques you need,
you must decide how Postfix should deliver messages for virtual domains. There are two
important considerations that influence how you should configure Postfix for hosting
multiple domains:
-
Should your domains have separate namespaces?
For example, should mail for the two addresses info@arkum.ch and
info@akadia.com go to the same mailbox or separate ones?
-
Does every user require a local account? We'll
make the distinction between local accounts that are real Unix accounts on
your system and virtual accounts. With virtual accounts, users can have
mailboxes on your server, but don't otherwise log in to the system and don't require
an entry in /etc/passwd.
Consider the four different ways Postfix can handle mail for
virtual domains:
-
Shared mailboxes with system accounts
-
Separate mailboxes with system accounts
-
Separate mailboxes with virtual accounts (shown in this
Article)
Your POP/IMAP server will be a major factor in deciding which
technique you need. If your POP/IMAP server does not understand virtual domains, then it
will most likely require that you have system accounts for all addresses. Some POP/IMAP
servers inherently support multiple domains, and deliver messages into a particular
directory structure on the local filesystem. Other POP/IMAP servers use their own
proprietary message store. Postfix can hand off messages to them using LMTP.
The drawback for the two first techniques is that you must maintain system accounts
for all email addresses on your server. As the number of domains you host increases, so
does the effort to maintain all the accounts. In particular, if users only receive email
at your server, and don't otherwise log in, you probably don't want to have to create
system accounts for each one. Instead, configure Postfix to deliver to a local message
store where each virtual email address can have its own mailbox file. Your users then
retrieve their messages through a POP/IMAP server.
The local message store works much like normal local delivery, but
it doesn't require a one-to-one correspondence between each mail file and a local user
account. For this configuration, list each virtual domain in the
virtual_mailbox_domains parameter:
virtual_mailbox_domains =
arkum.ch
If you have many domains, you can list them in a file and point
virtual_mailbox_domains to the file:
virtual_mailbox_domains =
/usr/local/postfix/etc/virtual_domains
The file virtual_domains then contains a line for each
domain:
#
# virtual_domains
#
arkum.ch
arkum.com
opal.ch
opal.com
Virtual domains listed in virtual_mailbox_domains are
delivered by the virtual delivery agent, which is actually a streamlined version
of the local delivery agent. It makes deliveries in a highly secure and efficient manner,
but local aliases, .forward files, and mailing list programs are not
available.
When setting up the virtual mailboxes, you should structure the
directories to accommodate the expectations of your POP/IMAP server. Let's assume for
this explanation that the virtual mailboxes are all located below the base directory
/var/spool/mail. Each virtual domain has its own subdirectory below that, so that
you have directories like the following:
/var/spool/mail/arkum.ch
/var/spool/mail/arkum.com
/var/spool/mail/opal.ch
/var/spool/mail/opal.com
This is a common configuration for POP/IMAP servers that support
virtual hosting. Below each domain subdirectory are the mail files for each user.
Indicate to Postfix the base directory of the mail store with the virtual_mailbox_base
parameter:
virtual_mailbox_base = /var/spool/mail
You must create a lookup file that maps email addresses to their
mailbox files. Specify the lookup table with the virtual_mailbox_maps
parameter:
virtual_mailbox_maps =
hash:/usr/local/postfix/etc/virtual_mailbox
Every user receiving mail to a virtual mailbox file must have an
entry in a Postfix lookup table. The mailbox file is specified relative to
virtual_mailbox_base. Mail files can use either mbox or maildir format. To use maildir
format, include a slash at the end of the filename. A virtual mailbox map file looks like
the following:
#
# virtual_mailbox
#
mueller@arkum.ch arkum.ch/mueller
hans.mueller@arkum.ch arkum.ch/mueller
meier@arkum.ch
arkum.ch/meier
roland.meier@arkum.ch arkum.ch/meier
The email address mueller@arkum.ch goes to a different
mailbox from the address meier@arkum.ch.
The virtual mailbox files must be owned by a user account and
associated with a group on your system. How your users retrieve their messages determines
what the ownership of mailbox files should be. Often, your POP/IMAP server executes under
its own account and expects all of the mailbox files to be owned by this user, but if
necessary, Postfix lets you configure ownership for mailbox files in any way you need.
Each can be owned by a separate user, or one user can own all of the mailboxes for one
domain, while a different user owns the mailboxes of another.
The virtual_uid_maps and virtual_gid_maps parameters
determine the owner and group Postfix uses when making deliveries to virtual mailbox
files. You can specify that all of the virtual mailboxes should be owned by the same user
account with the static map type. Assume, for this example, that you have created an
account called vmail that has a UID of 404, and a group
called vmail that has a GID of 400. You want all of the
virtual mailbox files to be owned by this user and group.
Set the virtual_uid_maps and virtual_gid_maps
parameters in main.cf:
virtual_uid_maps = static:404
virtual_gid_maps = static:400
If you want to use different UIDs for different mailbox files, you
must create a lookup file that maps the addresses to the UIDs. Then point the mapping
parameter to your lookup file:
virtual_uid_maps =
hash:/usr/local/postfix/etc/virtual_uids
virtual_gid_maps =
hash:/usr/local/postfix/etc/virtual_gids
The file /usr/local/postfix/etc/virtual_uids contains entries like the following, with each address mapped
to the correct UID. In this case, the mailboxes for mueller@arkum.ch use one ID
and those for meier@arkum.ch use another:
#
# virtual_uids
#
mueller@arkum.ch 404
meier@arkum.ch 405