Courier 是一个优秀的电子信件系统,功能上它远比 Qmail、 Postfix 等我们已经熟知的系统完整,包含了 ESMTP (含身份认证)、 POP3、 IMAP、 传真、网页信箱界面、保密通信 (SSL 和 TLS 涵盖 SMTP、 POP3、 IMAP)、多种用户数据库 (UNIX® 操作系统的用户数据文件 (通过 PAM(3))、Berkeley DB、LDAP、MySQL®、PostgreSQL)。而它也吸收了先前信件系统的优点。Courier 中的信件过滤器 maildrop、IMAP 服务器组件还常被与其它电子信件系统 (如 Postfix) 配合使用。

Sam Варшавчик (Sam Varshavchik),美国籍俄罗斯人。出生于俄罗斯,10 岁随家庭移居美国。现在纽约工作,是一位编程和分析顾问。他在业余时间主持开发了 Courier。
1990 年毕业于纽约州立大学石溪分校工程与应用科学学院,随后一直从事开发和咨询工作。精通 UNIX® 和各种数据库管理系统,掌握多种编程开发环境。他有着计算机和数学的教育背景,对于底层开发 (代码编写、调试等,如操作系统内核开发) 和上层的策划及商务分析,如分析商务需求、为商务解决方案选择最佳 IT 平台,都有着丰富的经验。
Sam 的个人主页:http://www.courier-mta.com/,Courier 的主页:http://www.courier-mta.org/。
虽然在 FreeBSD® 的 port 中已有 Courier 及相关组件收录,但是这些 port 不能适应中文处理和中国现状,有些需要调整的参数也没有 port 选项与之对应。本文所述的是 Courier-0.53.3 和 Courier-authlib-0.58 在 FreeBSD® 6.1-STABLE 中的情况。
FreeBSD® 已经将 GNU CC、Perl、Berkeley DB 作为系统的基本组成部分,这些都是安装 Courier 时必需的。此外还需要一些其它软件包,在 FreeBSD® 中可用 port 安装,或下载安装制作好的 package 安装。
原始版本下载位置: http://sourceforge.net/projects/courier/,需要下载软件包 authlib 和 courier。
其中软件包 Courier 需要打上与中文和中国现状相关的补丁,还要加上网页信箱界面的中文模板。我已打补丁的软件包下载位置: http://ftp.intron.ac/pub/network/mail/courier/ 。补丁的情况可用 diff -r -U 10 命令检查。补丁的内容有:
解压缩:
~#tar xjvf courier-authlib-0.58.tar.bz2
配置:
~/courier-authlib-0.58#./configure --prefix=/usr/local/authlib --localstatedir=/var/authlib \ --without-stdheaderdir
选项 --without-stdheaderdir 使得 authlib 的配置信息程序 courierauthconfig 的 --cppflags 功能生效,才能使后续的配置找到 authlib 头文件的位置。
编译与安装:
~/courier-authlib-0.58#gmake ~/courier-authlib-0.58#gmake install ~/courier-authlib-0.58#gmake install-configure
注意:配置和编译 courier 需要以普通用户身份进行,而不是 root 身份。
解压缩:
~>tar xvjf pcourier-0.53.3.tar.bz2
其中我加入的脚本文件 mycfg.sh 里只包含一行实质内容:
./configure --prefix=/usr/local/courier --localstatedir=/var/courier --without-ipv6 \ --disable-unicode --enable-https=auto --enable-hardtimeout=10800 --enable-softtimeout=3600 \ --with-maxargsize=67108864 --with-maxformargsize=67108864 --with-maxmsgsize=67108864 \ --enable-mimetypes=/usr/local/etc/apache22/mime.types --with-defaultlang=zh
重要的选项:
适当按照自己的要求修改文件 mycfg.sh 的内容。然后以普通用户,而不是 root 的身份运行:
~/pcourier-0.53.3>sh mycfg.sh
~/pcourier-0.53.3>gmake ~/pcourier-0.53.3>gmake check
如果编译无法通过,检查本文第 1 步中所述的准备工作。
切换到root身份:
~/pcourier-0.53.3>su -
安装:
~#cd ~ncr/pcourier-0.53.3/ ~ncr/pcourier-0.53.3#gmake install ~ncr/pcourier-0.53.3#gmake install-configure
将 /usr/local/courier/libexec/courier/webmail/webadmin 用 cp -p 命令放入 Apache 加密 HTTP 服务的 CGI 目录。并在刚才编译courier的目录中执行:
~ncr/pcourier-0.53.3#gmake install-webadmin-password
键入网页管理的密码。密码被明文存放在 /usr/local/courier/etc/webadmin/password 中,需要注意保密。
典型的网页管理界面的入口地址是 https://www.somecompany.com/cgi-bin/webadmin 。使用网页管理界面后,下面许多步骤的设置均可通过它来完成。
写好 /usr/local/courier/etc/aliases/system,补全这一行:
postmaster: ncr
这是将给系统管理员的信转发给用户 ncr,然后执行 /usr/local/courier/sbin/makealiases 。
需要注意的是:Courier 的这种信件转发方式只适用于本机转发,而不适用于远程转发。Courier 采用与 Qmail 类似的方式设置远程转发。
写好 /usr/local/courier/etc/smtpaccess/default ,并执行 /usr/local/courier/sbin/makesmtpaccess 。
修改 /usr/local/courier/etc 中的 courierd,使之启用信件过滤器 maildrop。
DEFAULTDELIVERY="| /usr/local/courier/bin/maildrop"
书写 /usr/local/courier/etc/me, 加入信箱地址中“@”后的部分,一般应为域名系统的 MX 记录或 A 记录,例如 somecompany.com。只有第一行的内容是有效的,不要多加 (主机别名的配置见下文)。书写完成后执行 /usr/local/courier/sbin/makealiases。
书写 /usr/local/courier/etc/locals,将所有收信用的域名 (包括 me 中已经指定的域名) 加入其中。例如:
localhost mail somecompany.com mail.somecompany.com freebsd.somecompany.com
执行 /usr/local/courier/sbin/makealiases 。
写入 /usr/local/courier/etc/esmtpacceptmailfor,内容要完全包含 /usr/local/courier/etc/locals 的内容。在没有虚拟域和代理转发的大多数情形中可以将 locals 复制为 esmtpacceptmailfor。
写入 /usr/local/courier/etc/sizelimit,这是 Courier 核心部分所能接受的最大信件长度。例如:
67108864
(64 MB)
为 maildrop 书写 /usr/local/courier/etc/maildroprc,一般只需要这行就足够了:
DEFAULT="$HOME/Maildir"
也可以添加一些在全系统范围内生效的过滤语句,如使用 SpamAssassin 的语句。
修改 /usr/local/courier/etc/esmtpd,启用 SMTP 服务的身份认证:
ESMTPAUTH="LOGIN CRAM-MD5"
修改以下一行以略去收信时对发信服务器的域名反向解析和 ident 检查 (一种 TCP 回叫身份认证方式)。有些配置不规范的 SMTP 服务器会在这些检查过程中因超时而退信。
TCPDOPTS="-nodnslookup -noidentlookup -stderrlogger=/usr/local/courier/sbin/courierlogger"
将网页信箱界面的 CGI 程序 /usr/local/courier/libexec/courier/webmail/webmail 放入 Apache 的相应 CGI 程序目录,最好是加密 HTTP 服务的 CGI 目录。
在 httpd.conf 或其它 Apache 配置文件中设置别名 (“Alias”) 或者制作一个链接,以便在使用网页信箱界面时浏览器可以得到图标:
/usr/local/www/apache22/data# ln -s /usr/local/courier/share/sqwebmail/images webmail
为网页信箱界面书写 /usr/local/courier/etc/maildirfilterconfig,可以这么写:
MAILDIRFILTER=../.mailfilter MAILDIR=./Maildir
为网页信箱界面书写 /usr/local/courier/etc/maildirshared,两栏之间 Tab 字符用分隔,例如:
★公告信息★ /home/bulletin
为网页信箱界面书写 /usr/local/courier/etc/defaultdomain,例如:
somecompany.com
否则网页信箱界面会自动使用该机操作系统的主机名。
日常添加信箱别名,可以在 /usr/local/courier/etc/aliasdir/ 书写 .courier-* 文件。例如,.courier-webmaster 的内容是:
someengineer@othercompany.com
修改 /usr/local/authlib/etc/authlib/authdaemonrc,指明所用的用户认证模块。Courier 支持多种用户数据库,支持同时使用多个用户数据库。根据需要调整如下一行中各模块名的顺序和使用与否:
authmodulelist="authuserdb authpam authmysql authcustom authpipe"
例如:
只使用操作系统的用户数据库:
authmodulelist="authpam"
先查询 Berkeley DB 文件 (/usr/local/authlib/etc/authlib/userdb.dat);假如没有找到该用户名,再查询 MySQL® 数据库:
authmodulelist="authuserdb authmysql"
在用户数量不多时,建议使用 Berkeley DB 存储用户数据;在用户数量很多时,建议使用 MySQL® 等专门的数据库系统存储用户数据。参见 authlib 的文档。
书写 /usr/local/authlib/etc/authlib/userdb,该文件权限设置为 root 所有 600。例如:
xiaofei systempw=$1$AAAABBBBCCCCDDDD|gecos=王小飞|home=/home/mail/xiaofei|uid=65534|gid=65534
第一列的用户名与其后内容应该用 Tab 字符分隔,否则相应的处理工具会出错。加密的密码可以使用工具 /usr/local/authlib/sbin/userdbpw 获得。该用户的家目录权限应与该用户的用户标识、组标识一致,在家目录中应设置信件存储目录。
#mkdir /home/mail/xiaofei #cd /home/mail/xiaofei /home/mail/xiaofei#/usr/local/courier/bin/maildirmake Maildir /home/mail/xiaofei#chown -Rh nobody:nobody .
之后运行 /usr/local/authlib/sbin/makeuserdb,以产生二进制格式的 Berkeley DB 数据文件 /usr/local/authlib/etc/authlib/userdb.dat 和 /usr/local/authlib/etc/authlib/userdbshadow.dat 。
在 MySQL® 系统中建立 Courier 专用的数据库、登录用户。并建立一张用户数据表,例如:
CREATE TABLE passwd (
id char(128) DEFAULT '' NOT NULL,
crypt char(128) DEFAULT '' NOT NULL,
clear char(128) DEFAULT '' NOT NULL,
name char(128) DEFAULT '' NOT NULL,
uid int(10) unsigned DEFAULT '65534' NOT NULL,
gid int(10) unsigned DEFAULT '65534' NOT NULL,
home char(255) DEFAULT '' NOT NULL,
maildir char(255) DEFAULT '' NOT NULL,
defaultdelivery char(255) DEFAULT '' NOT NULL,
quota char(255) DEFAULT '' NOT NULL,
options char(255) DEFAULT '' NOT NULL,
KEY id (id(128))
);
修改相应的配置文件 /usr/local/authlib/etc/authlib/authmysqlrc ,设置连接 MySQL® 数据库的正确参数,主要是连接协议 (TCP 或 UNIX® 套接字)、连接用户名、连接密码、数据库名、数据表名,以及各数据域的名称。
上面的表中有两个数据域存放用户登录密码,“crypt”是指密码的密文,“clear”是指密码的明文。一般说来只设置密码密文就足够了。密码明文用于挑战型 (challenge) 认证方式 CRAM-MD5、 CRAM-SHA1、 CRAM-SHA256 ,除须在数据库中存放密码明文,还应在配置文件 authmysqlrc 中用选项 MYSQL_CLEAR_PWFIELD 启用相应的功能。
假如需要虚拟域的支持,将要虚拟的域名写入 /usr/local/courier/etc/hosteddomains/my,并运行 /usr/local/courier/sbin/makehosteddomains。再将要虚拟域名加入 /usr/local/courier/etc/esmtpacceptmailfor,并运行 /usr/local/courier/sbin/makealiases。
Berkeley DB、MySQL® 等用户数据库都能支持虚拟域,操作系统的用户数据库不能支持虚拟域。在 Berkeley DB、MySQL® 等用户数据库中,虚拟域用户对应的“用户”项格式为: 用户名@虚拟域名
为网页信箱界面书写 /usr/local/courier/etc/logindomainlist (每行第 1 部分为虚拟域名,第 2 部分为网页信箱界面网址中的域名):
head.somecompany.com:mail.somecompany.com:mygroup hr.somecompany.com:mail.somecompany.com:mygroup finance.somecompany.com:mail.somecompany.com:mygroup sale.somecompany.com:mail.somecompany.com:mygroup
当用户以含有“mail.somecompany.com”的网址 (例如 http://mail.somecompany.com/cgi-bin/webmail ) 访问时,登录界面上就会列出信箱的域名 head.somecompany.com、 hr.somecompany.com、 finance.somecompany.com、 sale.somecompany.com 。
在 /etc/rc.local 中加上启动 courier、authdaemon、esmtpd、pop3d、sqwebmaild 命令:
/usr/local/courier/libexec/authlib/authdaemond start /usr/local/courier/sbin/courier start /usr/local/courier/sbin/esmtpd start /usr/local/courier/sbin/pop3d start /usr/local/courier/libexec/courier/sqwebmaild start
对于 FreeBSD®,可以按一定规范书写一个脚本并放置于 /usr/local/etc/rc.d/ 。
若需要 SMTP-SSL 服务、POP3-SSL 服务,还需要在 /etc/rc.local 中加上:
/usr/local/courier/sbin/esmtpd-ssl start /usr/local/courier/sbin/pop3d-ssl start
修改 /usr/local/courier/etc/esmtpd,这行改为:
ESMTPAUTH_TLS="PLAIN LOGIN CRAM-MD5"
同时按照 /usr/local/courier/sbin/ 里的脚本 mkesmtpdcert、mkimapdcert、mkpop3dcert 里的内容制作数字证书。证书做好后放在 /usr/local/courier/share 里,命名为 esmtpd.pem、imapd.pem、pop3d.pem,权限设为 root 所有 400。每个 .pem 文件中都同时包含加/解密的公开钥匙、秘密钥匙和一段 Diffie-Hellman 参数。
在 /etc/crontab 中加上清除会话文件的指令,至少一小时一次:
#minute hour mday month wday who command 0 * * * * bin /usr/local/courier/share/sqwebmail/cleancache.pl
修改 mailwrapper 的配置文件 /etc/mail/mailer.conf,使相应工具的链接指向 Courier 的工具,而不是 Sendmail 的:
sendmail /usr/local/courier/bin/sendmail send-mail /usr/local/courier/bin/sendmail mailq /usr/local/courier/bin/mailq newaliases /usr/local/courier/sbin/makealiases hoststat /usr/local/courier/bin/mailq purgestat /usr/local/courier/bin/mailq
在 /etc/rc.conf 的尾部加入一行或修改:
sendmail_enable="NONE"
假如使用操作系统的用户数据库,则以各个用户的身份为没有 Maildir 的用户创建 ~user/Maildir,在该用户的家目录中执行:
>/usr/local/courier/bin/maildirmake Maildir
通知所有用户将自己的家目录的权限管好,不可限制太死 (如他自己也不可执行)。
也可以 root 身份在 /usr/share/skel/ 中运行
#/usr/local/courier/bin/maildirmake Maildir
以后添加用户时,就一劳永逸了。
以该用户身份在其家目录中执行:
>/usr/local/courier/share/sqwebmail/webgpg Maildir
用“dmesg|grep -i irq”命令查看频繁产生中断的中断请求线号 (IRQ,如网卡、硬盘) 在 /etc/rc.conf 中加入:
rand_irqs="..."
例如:5 号线接着网卡,14 号线接第一个 IDE 控制器,则写成:
rand_irqs="5 14"
在 /usr/local/courier/share/sqwebmail/html/zh-cn/TIMEZONELIST 中写入用户需要用到的时区。该文件第一行实质内容是网页信箱界面登录时的缺省时区;若为“* *”,则表示默认使用操作系统的时区设置。例如,用户只用到中国和美国的时区,并以北京所处的东 8 区作为默认时区:
Asia/Shanghai 北京 上海 广州 Asia/Urumqi 拉萨 乌鲁木齐 EST5EDT 美国东海岸 EST 美国东部/印第安那 CST6CDT 美国中部 MST7MDT 美国山地 MST 美国山地/亚利桑那 PST8PDT 美国太平洋海岸
在 /usr/local/courier/etc/calendarmode 中写入
local
配置完成后,一定要在重新启动计算机后仔细测试信箱系统的收发功能。网页信箱界面的典型入口地址是 https://www.somecompany.com/cgi-bin/webmail 。




