在Internet中,电子邮件系统并不是一个孤立的体系,除了需要DNS服务提供邮件域名的解析,可以使用Web服务提供用户界面以外,邮件系统的内部也是由不同的软件程序组成的。
MTA 邮件传输代理
负责接受客户端邮件,并将其传输给其他的MTA。MTA是电子邮件系统的核心部分。例如Sendmail,Postfix和Exchange。
MDA 邮件分发代理
负责在服务器中将邮件分发到用户邮箱。有些MTA集成MDA功能。例如Exchange。
MUA 邮件用户代理
负责提供邮件阅读,撰写,发送,接收等管理界面。例如Mutt,Pine等。
RFC822
电子邮件报文格式,规定了电子邮件由邮件头和邮件内容两个部分组成。
SMTP
发送和传输电子邮件。MUA使用SMTP协议将邮件发送给MTA,MTA使用SMTP协议将邮件传输给其他的MTA。SMTP协议使用端口TCP 25,发信认证部分被称为ESMTP。
POP3
从邮件服务器获取邮件,然后在离线处理邮件。POP3协议使用端口TCP 110。
IMAP4
以联机的方式处理邮件,可以选择性下载邮件。IMAP4协议使用端口TCP 143。
MIME
现代邮件传输格式,让电子邮件具备传输二进制文件的能力。
Exchange
微软的企业电子邮件方案,多用于企业环境。
Notes/Domino
由Lotus公司开发的电子邮件产品,后被IBM收购,多用于政府机构,银行等大型机构。
Sendmail
最早的Unix/Linux电子邮件系统。配置相对复杂,安全性欠佳。
Qmail
易于二次开发的Unix/Linux电子邮件系统。企业按照自己的需求,修改Qmail的源代码实现特定的功能。
Postfix
Sendmail的替代品。
Postfix 采用模块化设计,由不同的程序实现不同的功能。Postfix的主进程名为 master ,由主进程根据需求启动其他程序协同处理邮件。
Postfix可以直接使用本地系统用户作为邮件用户,也可以使用虚拟用户。虚拟用户帐号信息通常存储在MySQL数据库中。
wget http://www.postfix.cn/source/official/postfix-2.7.3.tar.gz wget http://vda.sourceforge.net/VDA/postfix-vda-2.7.2.patch
预处理
service sendmail stop rpm -qa | grep sendmail | xargs rpm -e --nodeps
创建服务用户和组
groupadd -g 1200 postdrop groupadd -g 1000 postfix useradd -M -u 1000 -g postfix -G postdrop -s /sbin/nologin postfix
解压源码包
tar zxvf postfix-2.7.3.tar.gz cd postfix-2.7.3 patch -Np1 < ../postfix-vda-2.7.2.patch
配置源码包
yum install db4-devel yum install cyrus-sasl-devel
或
rpm -ivh /media/cdrom/Server/db4-devel-4.3.29-9.fc6.i386.rpm rpm -ivh /media/cdrom/Server/cyrus-sasl-devel-2.1.22-4.i386.rpm
make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include/ -DUSE_CYRUS_SASL -DUSE_SASL_AUTH -I/usr/include/sasl' 'AUXLIBS=-L/usr/local/mysql/lib/ -lmysqlclient -lm -lz -L/usr/lib/sasl2 -lsasl2'
编译并安装
vim /etc/ld.so.conf /usr/local/mysql/lib/ ldconfig -v
make && make install
/etc/postfix/
主配置目录,包含主配置文件,各类脚本,查询表等。
/etc/postfix/main.cf
主配置文件
/etc/postfix/master.cf
master程序配置文件
/usr/libexec/postfix/
服务器程序目录
/var/spool/postfix/
邮件队列相关目录
/var/spool/postfix/incoming/
传入队列
/var/spool/postfix/active/
活动队列
/var/spool/postfix/deferred/
推迟队列
/var/spool/postfix/hold/
约束队列
/var/spool/postfix/corrupt/
错误队列
/usr/sbin/
服务管理程序目录
/usr/sbin/postalais
用于构造,修改和查询别名表
/usr/sbin/postconf
用于显示和编辑主配置文件
/usr/sbin/postfix
用于启动和停止postfix服务
/usr/sbin/postmap
用于构造,修改或查询查询表
/usr/sbin/postqueue
用于一般用户管理邮件队列
/usr/sbin/postsuper
用于超级用户管理邮件对列
Postfix系统最主要的配置文件包括: /etc/postfix/main.cf
和 /etc/postfix/master.cf
。
/etc/postfix/main.cf
是Postfix服务的主配置文件。 /etc/postfix/main.cf
是master程序配置文件。
/etc/postfix/main.cf
配置项有300多个,大部分配置都设置了默认值。大多数时候只需要配置少数几个参数,就可以满足一般邮件服务器的要求。
Postfix系统提供了 postconf 工具用来辅助配置,不带任何选项的postconf命令将显示当前Postfix服务所使用的配置参数, -n 选项则显示不同于默认配置的参数。
postconf postconf -n
邮件管理员经常使用postconf命令简化 /etc/postfix/main.cf
文件,只保留与默认配置不同的参数,提高主配置文件的易读性。
cd /etc/postfix/
postconf -n > new.cf
cp main.cf main.cf.bak mv new.cf main.cf
cat main.cf
Postfix系统的日志文件位于 /var/log/maillog
文件中,该文件记录了Postfix服务器运行状态信息。在安装调试Postfix邮件系统及日常维护过程中,经常会使用 tail 命令带 -f 选项实时观察日志内容变化。
tail -f /var/log/maillog
如果日志内容较多,还可以使用 egrep 命令进行过滤,只关注包含 reject warning error fatalpanic 等比较重要的事件记录。
egrep '(reject|warning|error|fatal|panic):' /var/log/maillog
Postfix服务的启动控制主要通过 /usr/sbin/postfix
命令来完成。
postfix (start|stop|check|reload)
postfix start netstat -antpl | grep :25
构建基本发信,收信服务器的配置和测试。
IP地址
192.168.1.n
邮件域
benet99.com
主机名
mail.benet99.com
邮件账号
test
POP3/IMAP4服务
dovecot
LAMP平台
/usr/local/apache2/
/usr/local/mysql/
/usr/local/php5
域名服务器
192.168.1.100
Postfix主要提供基于SMTP协议的发信服务,其最基本的功能就是存储和发送邮件。
修改主配置文件
Postfix主配置文件内不能使用 单引号 或 双引号 。
vim /etc/postfix/main.cf
内容为:
command_directory = /usr/sbin config_directory = /etc/postfix daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix debug_peer_level = 2 home_mailbox = Maildir/ //指定邮件存储目录 html_directory = no mail_owner = postfix mailq_path = /usr/bin/mailq manpage_directory = /usr/local/man mydestination = $mydomain, $myhostname //指定接收邮件域名 mydomain = benet.com //指定邮件域名 myhostname = mail.benet.com //指定邮件主机名 myorigin = $mydomain //指定发送邮件域名 newaliases_path = /usr/bin/newaliases queue_directory = /var/spool/postfix readme_directory = no sample_directory = /etc/postfix sendmail_path = /usr/sbin/sendmail setgid_group = postdrop unknown_local_recipient_reject_code = 550
用户的邮箱空间用于保存各自的电子邮件内容。在Postfix服务器中,支持两种邮箱存储方式。
postfix reload netstat -antpl | grep :25
Mailbox
所有邮件存储在同一个文件内,默认是 /var/spool/mail/username
,每个邮件之间以特定的标记分割。
Maildir/
使用目录结构来存储,每一封邮件保存成一个文件,每个文件名称一般有一定的规律,例如会包含时间戳、pid及inode节点号等每一封邮件作为一个独立的文件保存。
添加邮件用户账号
使用Linux系统账号发送邮件。
发送邮件测试
telnet localhost 25 helo localhost mail from: [email protected] rcpt to: [email protected] data subject: Test Mail from: [email protected] to: [email protected] hello! this is a test mail! . quit
Dovecot是一个安全性较好的POP3/IMAP服务器软件,响应速度快且扩展性好。Dovecot默认使用Linux系统用户,通过PAM方式进行身份验证。
下载软件
wget http://www.dovecot.org/releases/2.0/dovecot-2.0.11.tar.gz
预处理
useradd -M -s /sbin/nologin dovecot useradd -M -s /sbin/nologin dovenull
解压源码包
tar zxvf dovecot-2.0.11.tar.gz cd dovecot-2.0.11
安装PAM开发包
yum install pam-devel
或
rpm -ivh /media/cdrom/Server/pam-devel-0.99.6.2-3.27.el5.i386.rpm
配置编译安装
./configure --sysconfdir=/etc --with-mysql --with-pam make && make install
修改配置文件
vim /etc/dovecot/dovecot.conf
内容为:
ssl = no protocols = pop3 imap disable_plaintext_auth = no mail_location = maildir:~/Maildir passdb { driver = pam } userdb { driver = passwd }
检查配置文件
doveconf -n
编辑PAM文件
cp ~/dovecot.pam /etc/pam.d/dovecot
或
vim /etc/pam.d/dovecot
内容为:
#%PAM-1.0 auth include system-auth account include system-auth password include system-auth session include system-auth
添加为系统服务
cp ~/dovecot.server /etc/init.d/dovecot chmod a+x /etc/init.d/dovecot chkconfig --add dovecot chkconfig dovecot on
启动服务
service dovecot start netstat -antpl | grep dovecot
POP3接收邮件测试
telnet localhost 110 user leiyue pass pwd@123 list retr 1 quit
此处省略xxxx字。
Webmail是指提供给邮件用户发信收信的Web界面。通过访问邮件系统提供的Web界面,可以和邮件客户端软件实现相同的邮件管理功能。使用Webmail简单,便捷,在Internet邮件服务中得到了广泛的应用。
Postfix邮件系统支持多种Webmail,例如:OpenWebmail,Extmail,SquirreMail等。
下载软件包
wget http://downloads.sourceforge.net/project/squirrelmail/stable/1.4.21/squirrelmail-1.4.21.tar.bz2 wget http://downloads.sourceforge.net/project/squirrelmail/locales/1.4.18-20090526/zh_CN-1.4.18-20090526.tar.gz
解压软件包
tar jxvf squirrelmail-1.4.21.tar.bz2 -C /usr/local/apache2/htdocs/ mv /usr/local/apache2/htdocs/squirrelmail-1.4.21 /usr/local/apache2/htdocs/webmail cd /usr/local/apache2/htdocs/webmail tar zxvf ~/zh_CN-1.4.18-20090526.tar.gz
调整权限设置
mkdir -p attach data chown -R daemon:daemon attach/ data/ chmod 730 attach/
修改配置文件
cp config/config_default.php config/config.php
vim config/config.php
修改以下内容:
$domain = 'benet.com'; $smtpServerAddress = 'localhost'; $smtpPort = 25; …… $imapServerAddress = 'localhost'; $imapPort = 143; $imap_server_type = 'dovecot'; …… $data_dir = '/usr/local/apache2/htdocs/webmail/data/'; $attachment_dir = '/usr/local/apache2/htdocs/webmail/attach/'; …… $squirrelmail_default_language = 'zh_CN'; $default_charset = 'zh_CN.UTF-8';
启动Web服务访问Webmail
访问 http://www.benet.com/webmail/ 。
SMTP发信认证是避免被人当作垃圾发送邮件服务器的必要措施。当用户通过SMTP协议向外部邮件域发送邮件时,服务器要求用户提供用户名和密码进行身份烟长。只有通过身份验证的用户才被允许发送外部邮件,否则将拒绝发信。
在Postfix邮件系统中,可以使用Cyrus SASL软件来实现基本的SMTP认证机制。
rpm -qa | grep cyrus cyrus-sasl-2.1.22-4 cyrus-sasl-lib-2.1.22-4 cyrus-sasl-devel-2.1.22-4 cyrus-sasl-plain-2.1.22-4
设置Cyrus SASL函数库
vim /usr/lib/sasl2/smtpd.conf
内容为:
pwcheck_method:saslauthd
启动saslauthd服务
service saslauthd start chkconfig saslauthd on
修改主配置文件
vim /etc/postfix/main.cf
内容为:
command_directory = /usr/sbin config_directory = /etc/postfix daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix debug_peer_level = 2 home_mailbox = Maildir/ html_directory = no mail_owner = postfix mailq_path = /usr/bin/mailq manpage_directory = /usr/local/man mydestination = $mydomain, $myhostname mydomain = benet.com myhostname = mail.benet.com myorigin = $mydomain newaliases_path = /usr/bin/newaliases queue_directory = /var/spool/postfix readme_directory = no sample_directory = /etc/postfix sendmail_path = /usr/sbin/sendmail setgid_group = postdrop smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination //指定smtpd允许和拒绝条件 smtpd_sasl_auth_enable = yes //指定smtpd认证方式 smtpd_sasl_security_options = noanonymous //拒绝匿名用户访问 unknown_local_recipient_reject_code = 550
测试SMTP发信认证
添加了SMTP发信认证就不能作为发信服务器发送邮件。
使用密文测试SMTP发信认证
telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. 220 mail.benet.com ESMTP Postfix helo localhost 250 mail.benet.com mail from: [email protected] 250 2.1.0 Ok rcpt to: [email protected] 554 5.7.1 <[email protected]>: Relay access denied quit 221 2.0.0 Bye Connection closed by foreign host.
telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. 220 mail.benet.com ESMTP Postfix helo localhost 250 mail.benet.com auth login 334 VXNlcm5hbWU6 bGVpeXVl 334 UGFzc3dvcmQ6 cHdkQDEyMw== 235 2.7.0 Authentication successful mail from: [email protected] 250 2.1.0 Ok rcpt to: [email protected] 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> subject: test mail from: [email protected] to: [email protected] this is a test mail for [email protected] . 250 2.0.0 Ok: queued as 869682F408 quit 221 2.0.0 Bye Connection closed by foreign host.
获得用户名和密码的加密密文
printf "leiyue" | openssl base64
命令结果为:
bGVpeXVl
printf "pwd@123" | openssl base64
命令结果为:
cHdkQDEyMw==
邮件别名是邮件系统的重要功能,主要来实现邮件的群发。邮件别名依赖于 aliases 机制,需要用到查询表。
Postfix查询表
Postfix服务器在处理邮件的过程中经常需要做各种转换和查询,需要使用查询表/etc/aliases
来完成。
postconf | grep aliases alias_database = hash:/etc/aliases alias_maps = hash:/etc/aliases, nis:mail.aliases
设置邮件别名实现群发
修改别名表。
vim /etc/aliases
添加以下内容:
root: leiyue hr: leiyue
使用 newaliases 命令生成 /etc/aliases.db
数据库文件。Postfix系统将识别并使用/etc/aliases.db
文件中的设置。
newaliases
限制用户发送邮件大小
Postfix系统默认支持10MB大小的邮件,需要注意的是这里的大小是经过Base64函数编码后的邮件大小。
postconf | grep message_size_limit message_size_limit = 10240000
修改发送邮件的默认大小为20MB。
vim /etc/postfix/main.cf
添加以下内容:
message_size_limit = 20480000
postfix reload
限制用户邮箱空间大小
在Postfix邮件系统中,根据邮件用户的类型,邮件存储的方式不同,可以采取不同的方法来限制用户邮箱空间大小。
使用 quota 磁盘配额
主要针对使用系统用户的情况,可以直接使用Linux的磁盘配额功能。对使用Mailbox和Maildir存储方式的用户都生效。
使用 virtualmailboxlimit 配置项
主要针对使用虚拟用户的情况,默认限制50MB。安装VDA补丁后,该参数对使用Mailbox或Maildir存储方式的用户都生效。
postconf | grep virtual_mailbox_limit virtual_mailbox_limit = 51200000 virtual_mailbox_limit_inbox = no virtual_mailbox_limit_maps = virtual_mailbox_limit_override = no
使用 mailboxsizelimit 配置项
主要针对使用系统用户的情况,默认限制是50MB。该参数对使用Mailbox邮件存储方式的用户生效。
postconf | grep mailbox_size_limit mailbox_size_limit = 51200000
当邮件用户达到一定数量时,邮件系统将在用户安全,系统管理以及数据维护等方面遇到巨大的挑战。为了提供更好的性能,效率和安全性,使用虚拟邮件用户将是一个更好的选择。
ExtMail是由国内开源组织使用Perl语言开发的一套功能强大的中文Webmail平台,主要包括ExtMail和Extman两个部分的程序套件。
ExtMail
提供给邮件用户使用邮件系统的Web界面
Extman
提供给邮件系统管理员管理邮件系统的Web界面
访问站点 http://www.extmail.org/cgi-bin/download.cgi 下载软件包ExtMail和Extman最新版。
使用 Extman 虚拟邮件管理系统在MySQL数据库中建立初始化数据库和表,用于保存虚拟邮件域,虚拟邮件用户相关信息。
service mysqld restart tar zxvf extman-1.1.tar.gz cd extman-1.1/docs mysql -u root -p < extmail.sql
由于数据库版本不同,导入 extmail.sql 数据库时报错:
ERROR 1064 (42000) at line 50: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TYPE=MyISAM COMMENT='Ext/Webman - Admin Accounts'' at line 15
用文本编辑器打开extmail.sql,将数据库文件内的所有 TYPE=MyISAM 替换为 ENGINE=MyISAM ,保存退出。
丢弃导入到一半出错的数据库 extmail 。
mysql -u root -p mysql> drop database extmail;
重新导入数据库。
mysql -u root -p < extmail.sql mysql -u root -p < init.sql
脚本 extmail.sql 完成的主要数据库操作:
创建名为 extmail
的数据库,初始化一些表。
创建数据库用户 extmail@localhost
,密码为 extmail
,对数据库extmail的表有select,update权限。
创建数据库用户 webman@localhost
,密码为 extman
,对数据库extmail表有select,insert,delete,update权限。
脚本 init.sql 完成的主要数据库操作:
初始化数据库 extmail
建立名为 extmail.org
的虚拟邮件域
建立数据库用户 [email protected]
,密码为 extman*123*
,作为邮件域的管理账号。
建立数据库用户 [email protected]
,密码为 extmail
,作为基本邮件用户。
使用虚拟邮件域时,其中邮件域名,邮件用户名,密码及邮件别名等信息都存储在MySQL数据库中。当Postfix接收到一封新邮件时,首先检查是不是发往本地域的邮件,如果不是则转向数据库查询是不是发往虚拟域的邮件,确认收件人是否存在、用户邮箱路径等信息。
了解当前的Postfix系统是否支持MySQL数据库。
postconf -m | grep mysql
修改Postfix的主配置文件,添加虚拟邮件用户配置项。
vim /etc/postfix/main.cf
修改以下内容:
…… # mydestination = $mydomain, $myhostname …… virtual_mailbox_base = /var/mailbox virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf virtual_uid_maps = static:1000 virtual_gid_maps = static:1000
各配置项具体作用如下:
virtual_mailbox_base
指定虚拟邮箱存储目录
virtual_alias_maps
指定虚拟邮件用户对应别名
virtual_mailbox_maps
指定记录虚拟邮箱和存储位置的对应关系
virtual_mailbox_domains
设置Postfix服务器可以接收的虚拟邮件域域名
virtual_uid_maps
设置所有虚拟邮件用户映射用户的UID号
virtual_gid_maps
设置所有虚拟邮件用户映射组的GID号
将extman提供的虚拟用户映射表文件复制到Postfix的配置目录中。
cp *.cf /etc/postfix/
由于虚拟邮件用户的账号信息保存在MySQL数据库中,仅仅使用Cyrus SASL已经无法完成SMTP发信认证,这时需要结合Courier-authlib的 authdaemond 服务才能提供基于MySQL数据库虚拟用户的SMTP发信认证。
下载源码包
wget http://downloads.sourceforge.net/project/courier/authlib/0.63.0/courier-authlib-0.63.0.tar.bz2
解压源码包
tar jxvf courier-authlib-0.63.0.tar.bz2 cd courier-authlib-0.63.0
安装expat软件包
yum install expect
或
rpm -ivh /media/cdrom/Server/expat-1.95.8-8.2.1.i386.rpm
卸载MySQL的rpm包
rpm -e mysql
配置软件包
./configure --prefix=/usr/local/courier-authlib --sysconfdir=/etc --without-stdheaderdir --with-authmysql --with-redhat --with-mysql-libs=/usr/local/mysql/lib --with-mysql-includes=/usr/local/mysql/include
编译安装
make && make install
生成配置文件
make install-configure
修改SMTP发信认证配置
修改SMTP发信认证配置
vim /usr/lib/sasl2/smtpd.conf
内容为:
pwcheck_method:authdaemond authdaemond_path:/usr/local/courier-authlib/var/spool/authdaemon/socket
启动authdaemond服务
service authdaemond start chkconfig --add authdaemond chkconfig authdaemond on
添加authdaemond为系统服务
cp ~/courier-authlib-0.63.0/courier-authlib.sysvinit /etc/init.d/authdaemond chmod a+x /etc/init.d/authdaemond
设置authdaemond数据库配置
cp authmysqlrc authmysqlrc.bak grep -v "^#" authmysqlrc | grep -v "^$" > newauthmysqlrc mv newauthmysqlrc authmysqlrc
vim authmysqlrc
内容为:
MYSQL_SERVER localhost MYSQL_USERNAME extmail MYSQL_PASSWORD extmail MYSQL_SOCKET /tmp/mysql.sock MYSQL_PORT 0 MYSQL_OPT 0 MYSQL_DATABASE extmail MYSQL_USER_TABLE mailbox MYSQL_CRYPT_PWFIELD password MYSQL_UID_FIELD uidnumber MYSQL_GID_FIELD gidnumber MYSQL_LOGIN_FIELD username MYSQL_HOME_FIELD concat('/var/mailbox/', homedir) MYSQL_NAME_FIELD name MYSQL_MAILDIR_FIELD concat('/var/mailbox/', maildir)
设置authdaemon服务目录权限
chmod 755 /usr/local/courier-authlib/var/spool/authdaemon
修改authdaemond主配置文件
cd /etc/authlib/ cp authdaemonrc authdaemonrc.bak grep -v "^#" authdaemonrc | grep -v "^$" > newauthdaemonrc mv newauthdaemonrc authdaemonrc
vim authdaemonrc
内容为:
authmodulelist="authmysql" authmodulelistorig="authmysql" daemons=5 authdaemonvar=/usr/local/courier-authlib/var/spool/authdaemon DEBUG_LOGIN=0 DEFAULTOPTIONS="" LOGGEROPTS=""
验证库文件路径
ldconfig -v | grep -A 9 courier-authlib
命令结果为:
/usr/local/courier-authlib/lib/courier-authlib: libcourierauthsasl.so -> libcourierauthsasl.so.0 libauthuserdb.so -> libauthuserdb.so.0 libcourierauth.so -> libcourierauth.so.0 libauthcustom.so -> libauthcustom.so.0 libauthmysql.so -> libauthmysql.so.0 libauthpipe.so -> libauthpipe.so.0 libcourierauthcommon.so -> libcourierauthcommon.so.0 libauthpam.so -> libauthpam.so.0 libcourierauthsaslclient.so -> libcourierauthsaslclient.so.0
添加库文件路径
echo "/usr/local/courier-authlib/lib/courier-authlib" >> /etc/ld.so.conf
启用Dovecot的数据库认证
vim /etc/dovecot/dovecot.conf
内容为:
ssl = no protocols = pop3 imap disable_plaintext_auth = no mail_location = maildir:~/Maildir passdb { args = /etc/dovecot/dovecot-mysql.conf.ext driver = sql } userdb { args = /etc/dovecot/dovecot-mysql.conf.ext driver = sql }
建立数据库查询配置文件
vim /etc/dovecot/dovecot-mysql.conf.ext
内容为:
driver = mysql connect = host=localhost dbname=extmail user=extmail password=extmail default_pass_scheme = CPYPT password_query = select username as user, password from mailbox where username = '%u' user_query = select maildir, uidnumber as uid, gidnumber as gid from mailbox where username = '%u'
调整默认邮件存储目录权限
mkdir -p /var/mailbox/extmail.org/postmaster/Maildir/ chown -R postfix:postfix /var/mailbox
测试authdaemond服务
/usr/local/courier-authlib/sbin/authtest -s login [email protected] extmail
命令结果为:
Authentication succeeded. Authenticated: [email protected] (uid 1000, gid 1000) Home Directory: /var/mailbox/extmail.org/postmaster Maildir: /var/mailbox/extmail.org/postmaster/Maildir/ Quota: (none) Encrypted Password: $1$phz1mRrj$3ok6BjeaoJYWDBsEPZb5C0 Cleartext Password: extmail Options: (none)
测试虚拟用户的发信认证
printf "[email protected]" | openssl base64
命令结果为:
cG9zdG1hc3RlckBleHRtYWlsLm9yZw==
printf "extmail" | openssl base64
命令结果为:
ZXh0bWFpbA==
telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. 220 mail.benet.com ESMTP Postfix auth login 334 VXNlcm5hbWU6 cG9zdG1hc3RlckBleHRtYWlsLm9yZw== 334 UGFzc3dvcmQ6 ZXh0bWFpbA== 235 2.7.0 Authentication successful
安装Perl支持包
cpan cpan> install Unix::Syslog cpan> install DBI cpan> install DBD::mysql
安装并配置ExtMail套件
登录并使用ExtMail邮件系统
访问 http://mail.benet.com 。
重启httpd服务
/usr/local/apache2/bin/apachectl restart
编译安装httpd服务的 mod_suexec
模块
cd /usr/src/httpd-2.2.17/ ./configure --enable-suexec -with-suexec-caller=daemon make suexec make install-suexec cd modules/generators/ /usr/local/apache2/bin/apxs -c mod_suexec.c /usr/local/apache2/bin/apxs -i -a -n suexec ./.libs/mod_suexec.so
调整httpd服务配置
vim /usr/local/apache2/conf/httpd.conf
修改以下内容:
…… LoadModule suexec_module modules/mod_suexec.so NameVirtualHost 192.168.1.103 <VirtualHost 192.168.1.103> ServerName mail.benet.com DocumentRoot /usr/local/apache2/htdocs/extmail/html ScriptAlias /extmail/cgi /usr/local/apache2/htdocs/extmail/cgi Alias /extmail /usr/local/apache2/htdocs/extmail/html SuexecUserGroup postfix postfix </VirtualHost>
建立ExtMail配置文件
cp webmail.cf.default webmail.cf
vim /usr/local/apache2/htdocs/extmail/webmail.cf
修改以下内容:
SYS_CONFIG = /usr/local/apache2/htdocs/extmail/ SYS_LANGDIR = /usr/local/apache2/htdocs/extmail/lang SYS_TEMPLDIR = /usr/local/apache2/htdocs/extmail/html …… SYS_MAILDIR_BASE = /var/mailbox SYS_AUTH_SCHEMA = virtual SYS_CRYPT_TYPE = md5crypt SYS_MYSQL_USER = extmail SYS_MYSQL_PASS = extmail SYS_MYSQL_DB = extmail SYS_MYSQL_HOST = localhost SYS_MYSQL_SOCKET = /tmp/mysql.sock …… SYS_AUTHLIB_SOCKET = /usr/local/courier-authlib/var/spool/authdaemon/socket ……
调整cgi目录权限
chown -R postfix:postfix cgi
解压源码包
tar zxvf extmail-1.2.tar.gz -C /usr/local/apache2/htdocs/ mv /usr/local/apache2/htdocs/extmail-1.2 /usr/local/apache2/htdocs/extmail cd /usr/local/apache2/htdocs/extmail
部署好ExtMail程序套件后,电子邮件用户可以通过Web界面登录和使用邮件服务。但邮件域名为extmail.org,还需要安装Extman程序套件,通过Web界面对ExtMail邮件系统进行管理。
安装gd-devel软件包
使用YUM安装gd-devel软件包
yum install gd-devel -y
配置YUM支持DVD源
cp ~/cdrom.repo /etc/yum.repos.d/ yum update
安装Perl支持包
如果不安装 gd-devel 软件包,安装Perl支持包的过程中会出现找不到 gdlib-config 命令的错误。
cpan cpan> install GD cpan> install File::Tail cpan> exit
安装rrdtool绘图引擎
wget ftp://ftp.pbone.net/mirror/ftp.pramberger.at/systems/linux/contrib/rhel5/i386/rrdtool-1.4.5-1.el5.pp.i386.rpm wget ftp://ftp.pbone.net/mirror/ftp.pramberger.at/systems/linux/contrib/rhel5/i386/perl-rrdtool-1.4.5-1.el5.pp.i386.rpm
yum install libdbi rpm -ivh rrdtool-1.4.5-1.el5.pp.i386.rpm rpm -ivh perl-rrdtool-1.4.5-1.el5.pp.i386.rpm
安装并配置Extman套件
调整临时会话目录的权限
chown -R postfix:postfix /tmp/extman
创建临时会话目录
mkdir /tmp/extman
修改配置文件
cp webman.cf.default webman.cf
vim webman.cf
修改以下内容:
SYS_CONFIG = /usr/local/apache2/htdocs/extman/ SYS_LANGDIR = /usr/local/apache2/htdocs/extman/lang SYS_TEMPLDIR = /usr/local/apache2/htdocs/extman/html SYS_MAILDIR_BASE = /var/mailbox …… SYS_SESS_DIR = /tmp/extman/ …… SYS_BACKEND_TYPE = mysql SYS_CRYPT_TYPE = md5crypt SYS_MYSQL_USER = webman SYS_MYSQL_PASS = webman SYS_MYSQL_DB = extmail SYS_MYSQL_HOST = localhost SYS_MYSQL_SOCKET = /tmp/mysql.sock ……
调整cgi目录权限
chown -R postfix:postfix cgi
解压源码包
tar zxvf extman-1.1.tar.gz -C /usr/local/apache2/htdocs/ mv /usr/local/apache2/htdocs/extman-1.1 /usr/local/apache2/htdocs/extman cd /usr/local/apache2/htdocs/extman
调整httpd服务配置
vim /usr/local/apache2/conf/httpd.conf
修改以下内容:
…… LoadModule suexec_module modules/mod_suexec.so NameVirtualHost 192.168.1.103 <VirtualHost 192.168.1.103> ServerName mail.benet.com DocumentRoot /usr/local/apache2/htdocs/extmail/html ScriptAlias /extmail/cgi /usr/local/apache2/htdocs/extmail/cgi Alias /extmail /usr/local/apache2/htdocs/extmail/html ScriptAlias /extman/cgi /usr/local/apache2/htdocs/extman/cgi Alias /extman /usr/local/apache2/htdocs/extman/html SuexecUserGroup postfix postfix </VirtualHost>
重启httpd服务
/usr/local/apache2/bin/apachectl restart
或
service httpd restart
登录并管理ExtMail邮件系统
访问 http://mail.benet.com/extman/ 。
设置邮件别名或群组
添加邮件域的管理用户
添加虚拟邮件用户,设置用户密码,可使用的邮件服务等
添加虚拟邮件域,设置虚拟域用户容量,邮箱大小等
查看邮件系统的图形化信息
cp -r /usr/local/apache2/htdocs/extman/addon/mailgraph_ext /usr/local/ cd /usr/local/mailgraph_ext/ ./mailgraph-init start echo "/usr/local/mailgraph_ext/mailgraph-init start" >> /etc/rc.d/rc.local
对于运行在Internet环境中的企业电子邮件系统来说,如何有效的防范垃圾邮件和病毒邮件是一个必须解决的问题。
在SMTP会话过程中,客户端程序在每个阶段分别向服务器提供不同的地址信息,Postfix系统可以针对这些信息进行检查,并通过主配置文件的配置项决定如何处理邮件。
检查配置参数和检查对象如下:
smtpd_client_restrictions
检查客户端的主机名/地址
smtpd_helo_restrictions
检查客户端HELO信息中的主机名
smtpd_sender_restrictions
检查发件人地址
smtpd_recipient_restrictions
检查收件人地址
根据客户端主机名/地址过滤
通过设置限制条件 check_client_access
检查邮件客户端是否满足访问策略要求。
vim /etc/postfix/main.cf smtpd_client_restrictions = check_client_access hash:/etc/postfix/access
建立 /etc/postfix/access
文本文件,根据需要设置访问策略。客户端地址可以使用ip地址,网络地址,主机名或域名等形式。常见的过滤工作有:
vim /etc/postfix/access
添加以下内容:
127.0.0.1 OK 192.168.1 OK 192.168.1.100 REJECT
设置完毕后,使用 postmap 命令将 /etc/postfix/access
文件转换为hash数据库/etc/postfix/access.db
。
postmap /etc/postfix/access
REJECT
拒绝
OK
允许
DISCARD
丢弃
根据客户端HELO主机名过滤
vim /etc/postfix/main.cf
添加以下内容:
smtpd_helo_required = yes smtpd_helo_restrictions = reject_invalid_hostname
根据发件人地址过滤
vim /etc/postfix/main.cf
添加以下内容:
smtpd_sender_login_maps = mysql:/etc/postfix/mysql_virtual_sender_maps.cf, mysql:/etc/postfix/mysql_virtual_alias_maps.cf smtpd_sender_restrictions = reject_sender_login_mismatch, reject_non_fqdn_sender, reject_unknown_sender_domain, check_sender_access hash:/etc/postfix/sender_access
vim /etc/postfix/sender_access
添加以下内容:
[email protected] REJECT cracker@ REJECT 163.com REJECT
portmap /etc/postfix/sender_accessF
根据收件人地址过滤
vim /etc/postfix/main.cf
添加以下内容:
smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination, reject_non_fqdn_recipient, reject_unknown_recipient_domain
在Postfix邮件系统中,针对邮件内容的过滤及反病毒邮件功能,可以由 MailScanner 调度SpamAssassin 和 F-Prot 软件来实现。
MailScanner
协调调度邮件过滤软件俺
SpamAssassin
根据邮件内容过滤垃圾邮件
F-Prot
提供病毒邮件查杀功能
其主要工作流程:
由Postfix将接收的邮件全部放到 hold 队列中
MailScanner对 hold 队列的邮件进行处理
调用SpamAssassin对邮件内容进行检查
调用F-Prot对邮件内容进行扫描
检查完毕的邮件转入 incoming 队列中交给Postfix投递
安装并配置MailScanner
启动MailScanner服务
service MailScanner start chkconfig MailScanner on
调整邮件过滤队列的目录的属主,属组
chown -R postfix:postfix /var/spool/MailScanner/incoming chown -R postfix:postfix /var/spool/MailScanner/quarantine
配置Postfix支持Mailscanner
vim /etc/postfix/main.cf
添加以下内容:
header_checks = regexp:/etc/postfix/header_checks
vim /etc/postfix/header_checks
添加以下内容:
/^Received:/ HOLD
配置软件包
vim /etc/MailScanner/MailScanner.conf
修改以下内容:
…… Run As User = postfix Run As Group = postfix Queue Scan Interval = 6 Incoming Queue Dir = /var/spool/postfix/hold Outgoing Queue Dir = /var/spool/postfix/incoming Incoming Work Dir = /var/spool/MailScanner/incoming Quarantine Dir = /var/spool/MailScanner/quarantine PID file = /var/run/MailScanner.pid Restart Every = 7200 MTA = postfix Sendmail = /usr/sbin/sendmail Sendmail2 = /usr/sbin/sendmail …… Use SpamAssassin = yes Max SpamAssassin Size = 200k Required SpamAssassin Score = 6 High SpamAssassin Score = 10 SpamAssassin Auto Whitelist = yes SpamAssassin Timeout = 75 Max SpamAssassin Timeouts = 10 SpamAssassin Timeouts History = 30 Check SpamAssassin If On Spam List = yes Include Binary Attachments In SpamAssassin = no Spam Score = yes Cache SpamAssassin Results = yes SpamAssassin Cache Database File = /var/spool/MailScanner/incoming/SpamAssassin.cache.db Rebuild Bayes Every = 0 Wait During Bayes Rebuild = no Use Custom Spam Scanner = no Max Custom Spam Scanner Size = 20k Custom Spam Scanner Timeout = 20 Max Custom Spam Scanner Timeouts = 10 Custom Spam Scanner Timeout History = 20 Spam Actions = deliver header "X-Spam-Status: Yes" High Scoring Spam Actions = delete forward [email protected] Non Spam Actions = deliver header "X-Spam-Status: No" …… Debug = no Debug SpamAssassin = no …… include /etc/MailScanner/conf.d/*
安装软件包
tar zxvf MailScanner-4.83.4-1.rpm.tar.gz cd MailScanner-4.83.4-1 yum install rpm-build ./install.sh nodeps
The important ones are HTML-Parser and MIME-tools.
下载软件包
wget http://www.mailscanner.info/files/4/rpm/MailScanner-4.83.4-1.rpm.tar.gz
安装并配置SpamAssassin
yum install spamassassin
service spamassassin start chkconfig spamassassin on
安装并配置F-Prot
wget http://files.f-prot.com/files/unix-trial/fp-Linux-i686-ws.tar.gz tar zxvf fp-Linux-i686-ws.tar.gz -C /opt/ cd /opt/f-prot/ ./install-f-prot.pl
/opt/f-prot/fpupdate
crontab -e
添加以下内容:
38 * * * * root /opt/f-prot/fpupdate > /dev/null
crontab -l
service crond start chkconfig crond on
测试邮件内容过滤
发送测试邮件的文本内容如下:
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
tail /var/log/maillog
测试反病毒邮件
发送测试邮件的文本内容如下:
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
tail /var/log/maillog