1、介绍
vpopmail是qmail的一个非常重要的扩展软件包,它是由Inter7公司[http://www.inter.com]开发的,主要针对qmail本身支持虚拟邮件域,但是配置和用户管理非常复杂和麻烦而设计的。它的特点是实现了qmail所有的用户帐号只使用操作系统的一个用户帐号,所有的的vpopmail相关的进程都以一个GID/UID来运行,让邮件系统的帐户和操作系统的用户分离,提高了邮件系统的安全性。它支持基于域名和IP地址的虚拟邮件域,每个虚拟邮件域之间互相独立,通过使用平衡树填充的技术,vpopmail可支持2300万个虚拟邮件域,每个虚拟邮件域可支持2300万个邮件帐户。Vpopmail还支持LDAP、Oracle、Sybase、Mysql、PostgreSQL等用户认证信息存储方式,使得建立和维护百万级用户的大型邮件系统很方便的实现。
2、实现虚拟域的原理
qmail对邮件域有本地(local)和虚拟(virtual)的概念。本地域是实现匹配/etc/passwd系统帐号,而虚拟域则匹配在qmail的配置文件virtualdomains中的各个域。Vpopmail利用qmail的users/assign和 virtualdomains文件。users/assign文件被编译成users/cdb的格式,它利用一个哈系数据库来加快查找速度,若任意一个模式得到匹配,qmail就使用文件中定义的uid和gid传送该邮件到文件中定义的目录。Vpopmail利用该方法实现使qmail以单一的 vpopmail/vchkpw身份来传输用户所有的虚拟域的邮件,从而实现了将邮件传输到~vpopmail/domains/< virtualdomain>目录下的不同用户。
对于qmail来说,qmail-local程序一旦从users/assign得到相关的信息,则其运行标准的.qmail文件操作。一般来说,.qmail-<user>文件被用来完成邮件的转发、别名、或者调用其他程序如ezmlm等。若没有找到匹配,则qmail -local查找.qmail-default文件,这是qmail-local邮件投递机制中的最后一步,qmail利用该文件激活 vedlivermail程序,该程序以两个参数被调用,第一个当前没有作用,主要使用来向后兼容的,第二个参数使用来在一个虚拟域用户没有被找到时缺省投递,一般来说,缺省投递可以时将邮件投递到某个目录或者某个邮件地址返回没有此用户的返回信件。
3. .qmail-文件
传送用户邮件通常是由一个或者几个 ".qmail"(发音 dot kyoo mail) 文件控制的. 这些文件位于用户的主目录, 文件名由 .qmail 开头. .qmail 的man 手册页面描述了 .qmail 文件使用方法.
.qmail 文件包括了一个传送指令清单, 每行一个指令. 每行的第一个字符决定了选择那种传送方式.
字符
传送类型
值
#
无 (注释)
忽略
|
程序
由shell 执行的命令
/ 或者 .
mbox邮箱格式 (如果路径最后一个字符不是一个斜杠)
mbox 的路径名 (包括斜杠"/"或者 点".")
/ 或者 .
maildir邮箱格式 (如果路径最后一个字符是一个反斜杠)
maildir 的路径名 (包括斜杠"/"或者 点".")
&
转发
转发邮件的地址
字母或者数字
转发
转发邮件的地址 (包括第一个字符)
程序传送
如果指令是由程序传送, qmail 启动一个 shell (/bin/sh) 来执行这个命令, 然后把邮件的一个副本从标准输入传送给这个命令.
程序传送是非常强大的, 被用来实现的功能范围非常广阔, 例如邮件过滤, 自动回复, 以及通过第三方传送代理比如procmail来传送邮件.
例如:
|preline /usr/ucb/vacation djb
这个指令操作qmail 启动preline, 将 /usr/ucb/vacation 和 djb 作为参数传送给 preline, 并且在标准输入传送邮件的副本给这个命令.
(1). mbox 格式邮箱的邮件投递
mbox 是标准的UNIX邮箱格式, 多个邮件存放在一个独立文件内, 每个邮件由一个"From" 的行开始. 这一行看起来像一个标题字段, 不过那不是标题, 那仅仅是传送代理添加的, 便于邮件读出器可以找到每个邮件开始部分的一个标记.
例如:
./Mailbox
这个设置表示邮件将被追加到 $HOME/Mailbox 文件上, 每个邮件由"From"引领. 一个存放了一个单独邮件的简单的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?
第一行是 qmail 传送邮件时添加的.
(2). maildir 格式邮箱的邮件投递
maildir 是 Dan Bernstein 为了表明 mbox 邮箱格式的缺陷而创造的格式. 一个 maildir 邮箱包含三个子目录, new, cur, 和 tmp. 在各个子目录下的每个邮件根据状态的不同分别存储在各个子目录下独立的文件中. 未读邮件存储在new中, cur存储已读邮件, tmp 是为那些正在传送过程中的邮件使用的. maildir 的man手册页详细描述了maildir格式的细节.
maildir 格式的优点之一就是保证邮件传输的安全, 即使在不锁定情况下, 不同邮件代理同时更新邮件, 也能保证传输的可靠. 这意味着maildir 邮箱可以安全的建立在以NFS性质挂接的文件系统上.
例如:
./Maildir/
这个设置表示将把邮件存储在 $HOME/Maildir 下面的 maildir 格式的邮箱.
注意: qmail-local 可以将邮件传送到 maildir 格式邮箱, 但是不能创建这种邮箱. 你需要使用qmail 附带的maildirmake 程序来创建 maildir 格式邮箱. 例如: "maildirmake ~/Maildir". 不过要确定你使用maildir的拥有者运行maildirmake, 而不是 root 用户. 另外的方式, 你的 useradd 和 adduser 命令可能支持"skeleton"骨架目录, 例如: /etc/skel, 然后可以直接复制这个目录给所有新用户.
(3). 转发邮件
转发邮件就是将邮件重发到指定地址. 由.qmail文件内的命令不能包含注释部分和多余的空格.
下面的写法是错的:
&<user@example.com>
& user@example.com
&Joe User <user@example.com>
下面的是正确的写法:
&user@example.com
user@example.com
&user
前两个将邮件副本转发给 user@example.com, 最后一个将邮件副本转发给本地用户 user.
(4). 扩展地址
qmail 支持用户控制扩展地址. 在基本地址 username@hostname.domain 上扩展的扩展地址为: username-extension@hostname.domain ,用户同样可以接收发往扩展地址的邮件. 在本节其余部分, 我们讨论的范围都是在本地系统上, 所以我们将不再使用"@hostname.domain" 部分.
给用户 username 的邮件传送指令由 ~username/.qmail 文件指定. 对于型如username-extension 的扩展地址的传送指令由用户目录下的~username/.qmail-extension 文件指定.
举一个例子, dave-lwq@sparge.example.com 这个扩展地址的传送将由文件 ~dave/.qmail-lwq 来控制.
扩展地址可以拥有多个字段, 例如 dave-list-qmail 这个扩展地址, 由 ~dave/.qmail-list-qmail 来控制. 在这个例子里面, dave-list-qmai 这个地址被用来订阅 qmail 的邮件列表, ~dave/.qmail-list-qmail 则负责归档这个列表的邮件到单独的邮箱里面.
.qmail 文件可以用-default 后缀进行匹配。 所以 dave-list-qmail 可以由 ~dave/.qmail-list-default 操作. 这个文件可以一对多方式用一个.qmail文件控制所有型如 dave-list-加上任何后缀的地址. 注意 dave-list 不能由 ~dave/.qmail-list-default 控制, 因为在"list"后面没有"-".
qmail 会使用最接近的匹配方式. 例如, qmail在传送一个标志着送给dave-list-qmail这个地址的邮件时, 会按照下面顺序查找.qmail控制文件, 并按照最先匹配的.qmail文件传送这个邮件.
.qmail-list-qmail
.qmail-list-default
.qmail-default