电子邮件,就是用一种电子手段提供信息交换的通信方式。
在生活当中,我们如果想邮寄出一封信,要写上收信人地址和发信人地址,然后交给我们当地的邮局,如果收信人是本地的,我们本地的邮局就派邮递员,将信发到收信人的邮箱里,收信人去拿就可以了,如果是外地的,本地的邮局将信件发送给收信人地方的邮局,投递给收信人,而我们的电子邮件的原理,和我们现实生活当中有很多的相似之处呢。
整个电子邮件传输过程的参与者有4部分:
1、MUA(Mail User Agent):邮件用户代理,帮助我们收发和查看邮件,常见的有微软的Outlook和Foxmail等,还有现在我们基本都是通过网页来管理邮件的,就是webmail。
2、MTA(Mail Transfer Agent):邮件传输代理,在服务器上就收邮件,和我们的邮局很像呢,常用的软件有sendmail和postfix,sendmail是一个进程完成所有功能,在运行单个功能的过程中,被劫持,整个进程就被劫持了,postfix是有IBM开发,基于模块化设计,将各个功能做成模块,实现sendmail作用的同时安全性高,自带MDA,投递效率在同等调下能达到sendmail的4倍。
3、MDA(Mail Delivery Agent):邮件投递代理,充当着邮递员的身份,帮助我们把邮件放到服务器中对应用户的邮件存储位置中(利用数据库最好),也就是我们的邮箱了,常见的有procmail(整合进sendmail中)和maildrop。
4、MRA(Mail Retrieval Agent):邮件取回代理,通过这个和邮件服务器打交道取回我们的邮件,常使用到的有dovecot(支持数据库)和cyrus-imap(不支持)。
了解了邮件服务器的组成,下面通过图1.1,帮助大家简单了解一下邮件传输的过程。
图1.1邮件传输过程
邮件传输过程:
1)通过MUA发送邮件到MTA,遵循smtp协议。
2)如果发送的邮件的接收者和发送者在相同的区域,MDA将邮件存储到用户在邮件服务器中的邮箱中。
3)如果发送的邮件的接收者和我们不在同一个区域中,MTA通过DNS中的MX记录,解析到收信人MTA的ip地址,然后转发给收信者所在区域的邮件服务器MTA,这个过程我们称之为中继,如果MTA不做任何认证就做中继,这时MTA就提供了开始式中继,如果一个邮件服务器是开放式中继,过不了多久,我们邮件服务器就会成为一个垃圾邮件服务器,在安装邮件服务器的时候,我们要尽量避免中继,使用到中继,也要对用户进行限制和认证。
4)将接收者所在区域的MTA经过中继收到的邮件,投递到收信人所在服务器的邮箱当中。
5)通过MUA从服务器上取回我们的邮件,遵循pop3和imap协议。
那么,对邮件服务器的原理有一个简单的了解后,让我们自己构建使用webmial收发邮件的一个邮件服务器吧,实现整个邮件的传输过程。
一、DNS的配置,bind97
下面给出dns中MX记录的配置.
正向域,如图1.2:
图1.2 正向域MX记录
反向域,如图1.3:
图1.3 反向域MX记录
二、安装配置postfix
1、从官网上下载postfix-2.9.3.tar.gz进行编译安装
# tar zxvf postfix-2.9.3.tar.gz
# cd postfix-2.9.3
# make Makefiles 'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl -DUSE_TLS ' 'AUXLIBS=-L/usr/local/mysql/lib -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2 -lssl -lcrypto'
-D表示启用功能,-I使用的头文件
-L表示辅助库,
-lz解压缩工具
-lm编码工具
-lssl -lcrypto 使用ssl功能
# make
# make install
make install 会给我们提供一个交互式的界面,使用默认选项按回车就可也了
install_root: [/] / 指定postfix的根,工作在chroot模式下
tempdir: [/root/postfix-2.9.1] /tmp/postfix 临时目录
config_directory: [/etc/postfix] /etc/postfix 配置文件
command_directory: [/usr/sbin] 命令位置
daemon_directory: [/usr/libexec/postfix] 可执行程序
data_directory:[/var/lib/postfix] 数据存放位置
html_directory: [no] 网页形式的帮助文档
queue_directory: [/var/spool/postfix] 邮件队列所在位置
sendmail_path: [/usr/sbin/sendmail] sendmail命令所在位置
newaliases_path: [/usr/bin/newaliases] 二进制文件生成命令
mailq_path: [/usr/bin/mailq] 邮件队列命令
mail_owner: [postfix] 邮件服务器的属主
setgid_group: [postdrop] 投递邮件的属组
manpages: [/usr/local/man] man文档所在位置
readme_directory: [no]
2、创建运行postfix的用户和组
# groupadd -g 2525 postfix
# useradd -g postfix -u 2525 -s /sbin/nologin -M postfix
#groupadd -g 2526 postdrop
# useradd -g postdrop -u 2526 -s /sbin/nologin -M postdrop
postdrop是用来实现MDA投递邮件的用户,用户的ID最好使用大于1000的,如果以后使用到maildrop,maildrop规定用户ID大于1000,以postfix用户运行maildrop的时候,避免冲突。
3、修改postfix的配置文件
# vim /etc/postfix/main.cf
主要修改以下几项为我们所需要的配置
myhostname = mail.magedu.com 运行postfix的主机名
myorigin=$mydomain 用来指明发件人所在的域名,发件人地址伪装持
mydomain = magedu.com 说明自己负责的域,默认情况下,postfix将myhostnam
e的第一部分删除而作为mydomain的值
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
本机负责接收的邮件的所在的域,包含在此定义中,为其中继
mynetworks = 127.0.0.0/8
允许某个网段和本机通过我们进行中继,这里设定只允许本机中继,如果我们配置了认证,同样为认证通过的用户认证。
# postfix reload
让我们对配置文件的修改立即生效,但需要特别说明的是,在配置文件有一个参数inet_interfaces 指定postfix系统监听的网络接口,如果我们队这个参数进行更改的话,只有重启postfix服务才能有效。
4、为postfix提供sysv风格的脚本
大家有能力的可以自己编写,简单点的我们从postfix的rpm包中获取
#rpm2cpio RPM.rpm | cpio -id
将rpm转化为cpio的类型,再通过cpio打开,实现对rpm的解压缩并不安装,最后复制到/etc/rc.d/init.d目录下。
#chkconfig --add postfix添加至服务列表
#chkconfig postfix on设置开机启动
#service postfix start开启服务
5、postfix扩展应用,为postfix开启用户别名支持
1)在main.cf中添加
alias_maps = hash:/etc/aliases
2)/etc/aliases文件中定义新的别名项
jerrry: tom
原来发给jerry的邮件,将转发给tom,当我们有多个邮箱,通过别名,可以使用一个邮箱接收所有的邮箱的邮件
3)# postalias /etc/aliases
邮件别名功能使用的文件实际上是/etc/aliases.db,通过这个命令将aliase(ASCII文件)中的文件重写进aliases.db(Hash)
4) 重新载入配置文件
# postfix reload
三、为postfix开启基于cyrus-sasl的认证功能
1、先验证我们的postfix是否支持sasl的认证(图3.1)。
图3.1 验证
# vim /usr/lib/sasl2/smtpd.conf 这个文件本身是不存在,我们自己创建,文件中添加以下内容
pwcheck_method: authdaemond 使用什么认证
log_level: 3 记录日志,使用的时候最好关掉,进行测试的时候打开
mech_list:PLAIN LOGIN 认证的机制
2、编译postfix的配置文件,支持sasl基于机制的认证
# vim /etc/postfix/main.cf
############################CYRUSSASL############################
broken_sasl_auth_clients = yes smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_invalid_hostname,reject_non_fqdn_hostname,reject_unknown_sender_domain,reject_non_fqdn_sender,reject_non_fqdn_recipient,reject_unknown_recipient_domain,reject_unauth_pipelining,reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_sasl_path= smtpd
smtpd_banner = Welcome to our $myhostname ESMTP,Warning: Version not Available!
3、启用sasl服务
#service cyrus-sasl start
四、安装Courier authentication library
使用courier-authlib提供基于Mysql用户认证服务
1、编译安装
#postconf -m 查看postfix是否支持mysql
编译安装
# tar jxvf courier-authlib-0.62.4.tar.bz2
# cd courier-authlib-0.62.4
#./configure \
--prefix=/usr/local/courier-authlib \ 安装目录
--sysconfdir=/etc \ 配置文件目录
--without-authpam \ 禁用pam的认证
--without-authshadow \
--without-authvchkpw \
--without-authpgsql \
--with-authmysql \ 启用mysql认证
--with-mysql-libs=/usr/lib/mysql \ mysql库文件
--with-mysql-includes=/usr/include/mysql \ mysql的头文件
--with-redhat \ 针对系统做优化,只针对redhat和centos
--with-authmysqlrc=/etc/authmysqlrc \ 基于mysql认证使用到的配置文件
--with-authdaemonrc=/etc/authdaemonrc \ 认证进程的配置文件
--with-mailuser=postfix \ 基于哪个用户收发
--with-mailgroup=postfix \ 基于哪个组收发
--with-ltdl-lib=/usr/lib \ 需要安装libart_lgpl 和 libtool_ltdl软件包
--with-ltdl-include=/usr/include
# make
# make install
2、提供配置文件
# cp /etc/authdaemonrc.dist /etc/authdaemonrc
# cp /etc/authmysqlrc.dist /etc/authmysqlrc
修改/etc/authdaemonrc 文件
authmodulelist="authmysql" 认证时使用的模块列表,只保留authmysql
authmodulelistorig="authmysql"原始认证时使用模块列表,只保留authmysql
daemons=10 启动认证进程的个数,并发认证响应个数,和cpu的能力有关
3、配置其通过mysql进行邮件帐号认证,依赖extmail数据库,extmail提供脚本直接创建
编辑/etc/authmysqlrc 为以下内容,其中2525,2525 为postfix 用户的UID和GID。
MYSQL_SERVER localhost 指定mysql服务器
MYSQL_PORT 3306 指定你的mysql监听的端口,这里使用默认的3306)
MYSQL_USERNAME extmail 这时为后文要用的数据库的所有者的用户名,使
用时候一定要修改,不要照搬
MYSQL_PASSWORD extmail 密码
MYSQL_SOCKET /tmp/mysql.sock 套接字文件,源码安装在tmp下,rpm安装在/var/lib/mysql/mysql.sock
MYSQL_DATABASE extmail 用于认证的数据库
MYSQL_USER_TABLE mailbox 存储用户账户的表
MYSQL_CRYPT_PWFIELD password 表中用户密码字段名
MYSQL_UID_FIELD '2525' 表中UID字段
MYSQL_GID_FIELD '2525' 表中GID字段
MYSQL_LOGIN_FIELD username 登录时匹配的表中的字段
MYSQL_HOME_FIELD concat('/var/mailbox/',homedir) 服务器MDA投递存储邮件目 录,postfix属主,postdrop属组
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD concat('/var/mailbox/',maildir) 用户邮箱目录
参数中指定的数据库,表我们可以自己创建,也可以通过脚本,extmail为我们提供了创建的脚本,这里我们先写上去
4、提供SysV服务脚本,方便我们启动,为我们提供的有样本
# cp courier-authlib.sysvinit /etc/rc.d/init.d/courier-authlib
# chmod 755 /etc/init.d/courier-authlib 添加执行权限
# chkconfig --add courier-authlib 添加到服务列表
# chkconfig --level 2345 courier-authlib on 在2345级别开机自动启动
#echo "/usr/local/courier-authlib/lib/courier-authlib" >> /etc/ld.so.conf.d/courier-authlib.conf
输出库文件
# ldconfig
# service courier-authlib start 启动服务
5、配置postfix和courier-authlib
新建虚拟用户邮箱所在的目录,并将其权限赋予postfix用户:
#mkdir –pv /var/mailbox
#chown –R postfix /var/mailbox
接下来重新配置SMTP 认证,编辑 /usr/lib/sasl2/smtpd.conf ,添加下面一行: authdaemond_path:/usr/local/courier-authlib/var/spool/authdaemon/socket 套接字文件,以后会多次使用
五、让postfix支持虚拟域和虚拟用户
1、编辑/etc/postfix/main.cf,添加如下内容:
########################Virtual Mailbox Settings########################
virtual_mailbox_base = /var/mailbox 虚拟用户邮箱位置
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_uid_maps = static:2525
virtual_gid_maps = static:2525
virtual_transport = virtual 指定为虚拟用户的代理
maildrop_destination_recipient_limit = 1 一次投递一个
maildrop_destination_concurrency_limit = 1 并发投递限制
##########################QUOTA Settings########################
message_size_limit = 14336000 单个邮件信息大小
virtual_mailbox_limit = 20971520 邮箱大小
virtual_create_maildirsize = yes 邮箱大小初始值
virtual_mailbox_extended = yes 邮箱是否支持扩展
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes 允许其他设置邮件大小覆盖本中配置
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please Tidy your mailbox and try again later. 超出邮箱大小,处理信息
virtual_overquota_bounce = yes 是否弹回邮件
2、下面就可以重启服了,但是我们再配置中,支持数据库的参数,在mysql中还没没有创建,我们可以用extman源码目录下docs目录中的extmail.sql和init.sql建立数据库:
# tar zxvf extman-1.1.tar.gz
# cd extman-1.1/docs
导入extmail.sql和init.sql两个文件,这里要说明的是,由于mysql5.5以后的版本,不再支持TYPE的参数,对脚本内的参数进行更改
#sed -i ‘s@TYPE=MyISAM@ENGINE=MyISAM@g' extmail.sql
#sed -i ‘s@TYPE=MyISAM@ENGINE=MyISAM@g' init.sql
# mysql -u root -p <extmail.sql
# mysql -u root -p <init.sql
# cp mysql* /etc/postfix/
3、授予用户extmail访问extmail数据库的权限
#mysql
mysql> GRANT all on extmail.* TO extmail@localhost IDENTIFIED BY 'extmail';
mysql> GRANT all on extmail.* TO extmail@127.0.0.1 IDENTIFIED BY 'extmail';
mysql>FLUSH PRIVILEGES
说明:启用虚拟域以后,需要取消中心域,即注释掉myhostname, mydestination, mydomain, myorigin几个指令;当然,你也可以把mydestionation的值改为你自己需要的,但是mydestination一定要去掉。
六、配置dovecot支持虚拟用户
1、安装devecot软件包
#yum install devecot
# vi /etc/dovecot.conf
mail_location = maildir:/var/mailbox/%d/%n/Maildir
…… 指定邮箱存储格式:邮箱所在目录/ 域名 /用户 /用户邮箱目录
#dovecot
auth default {
mechanisms = plain 认证机制
passdb sql {
args = /etc/dovecot-mysql.conf
}
userdb sql {
args = /etc/dovecot-mysql.conf
}
2、创建dovecot-mysql.conf,这个文件本身是不存的
# vim /etc/dovecot-mysql.conf
driver = mysql
connect = host=localhost 如果是编译安装的mysql,修改成/tmp/mysql.sock
dbname=extmail user=extmail password=extmail
default_pass_scheme = CRYPT
password_query = SELECT username AS user,password AS password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, uidnumber AS uid, gidnumber AS gid FROM mailbox WHERE username = '%u'
3、接下来启动dovecot服务,就OK了
# service dovecot start
# chkconfig dovecot on
七、安装Extmail-1.2 ,需要per-DBI 和per-DBD-Mysql模块用于连接数据库
1、安装
# tar zxvf extmail-1.2.tar.gz
# mkdir -pv /web/vhosts/extsuite
# mv extmail-1.2 /var/www/extsuite/extmail
# cp /var/www/extsuite/extmail/webmail.cf.default /web/vhosts/extsuite/extmail/webmail.cf
2、修改主配置文件
#vi /web/vhosts/extsuite/extmail/webmail.cf
部分修改选项的说明:
SYS_MESSAGE_SIZE_LIMIT = 5242880
用户可以发送的最大邮件,指定邮箱配额,可以取代postfix配置文件中的指定
SYS_USER_LANG = zh_CN
SYS_MAILDIR_BASE = /var/mailbox
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
SYS_MYSQL_HOST = localhost
指明数据库服务器主机名,这里默认即可
SYS_MYSQL_TABLE = mailbox
SYS_MYSQL_ATTR_USERNAME = username
SYS_MYSQL_ATTR_DOMAIN = domain
SYS_MYSQL_ATTR_PASSWD = password
以上用来指定验正用户登录里所用到的表,以及用户名、域名和用户密码分别对应的表中列的名称;这里默认即可
SYS_AUTHLIB_SOCKET = /var/spool/authdaemon/socket
此句用来指明authdaemo socket文件的位置,这里修改为:
SYS_AUTHLIB_SOCKET = /usr/local/courier-authlib/var/spool/authdaemon/socket
这里需要另外说明的是,extmail的配置文件中,如果extmail放在了/var/www/extsuite下,配置文件无需更改,我们是在/web/vhosts中,所有/var/www都要替换成/web/vhosts。在配置extman的时候同样需要更改。
3、apache相关配置
#vim /etc/httpd/httpd.cong
启用cgi模块
LoadModule cgi_module modules/mod_cgi.so
启用虚拟主机
Include /etc/httpd/extra/httpd-vhosts.conf
# vim /etc/httpd/httpd.conf
User postfix
Group postfix
#vim /etc/httpd/extra/httpd-vhosts.conf
<VirtualHost *:80>
ServerName mail.magedu.com
DocumentRoot /web/vhosts/extsuite/extmail/html/
ScriptAlias /extmail/cgi /web/vhosts/www/extsuite/extmail/cgi
Alias /extmail /web/vhosts/extsuite/extmail/html
<Directory "/web/vhosts/extsuite">
Options none
AllowOverride none
Require all granted
</Directory>
</VirtualHost>
要想访问虚拟用户中的文件,必须设定目录的权限。
修改 cgi执行文件属主为apache运行身份用户:
# chown -R postfix.postfix /var/www/extsuite/extmail/cgi/
4、依赖关系的解决
extmail将会用到perl的Unix::syslogd功能,您可以去http://search.cpan.org搜索下载原码包进行安装。
# tar zxvf Unix-Syslog-0.100.tar.gz
# cd Unix-Syslog-0.100
# perl Makefile.PL
# make
# make install
5、启动apache服务
# service httpd start
# chkconfig httpd on
八、安装Extman-1.1
1、安装及基本配置
# tar zxvf extman-1.1.tar.gz
# mv extman-1.1 /web/vhosts/extsuite/extman
修改配置文件以符合本例的需要:
# cp /web/vhosts/extsuite/extman/webman.cf.default /web/vhosts/extsuite/extman/webman.cf
# vi /web/vhosts/extsuite/extman/webman.cf
SYS_MAILDIR_BASE = /home/domains
此处即为您在前文所设置的用户邮件的存放目录,可改作:
SYS_MAILDIR_BASE = /var/mailbox
SYS_DEFAULT_UID = 1000
SYS_DEFAULT_GID = 1000
此两处后面设定的ID号需更改为前而创建的postfix用户和postfix组的id号,本文使用的是2525,因此,上述两项需要修改为:
SYS_DEFAULT_UID = 2525
SYS_DEFAULT_GID = 2525
SYS_MYSQL_USER = webman 实际上extmail 只需要查找权限就可,这里最好创建一个web满用户,授权所有权限
SYS_MYSQL_PASS = webman
修改为:
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
取消验证码:
SYS_CAPTCHA_ON = 1
修改为:
SYS_CAPTCHA_ON = 0
而后修改cgi目录的属主:
# chown -R postfix.postfix /var/www/extsuite/extman/cgi/
在apache的主配置文件中Extmail的虚拟主机部分,添加如下两行:
ScriptAlias /extman/cgi /web/vhosts/extsuite/extman/cgi
Alias /extman /web/vhosts/extsuite/extman/html
创建其运行时所需的临时目录,并修改其相应的权限:
#mkdir -pv /tmp/extman
#chown postfix.postfix /tmp/extman
重新启动apache服务器后,Webmail和Extman已经可以使用了,可以在浏览器中输入指定的虚拟主机的名称进行访问,如下:
http://mail.magedu.com
选择管理即可登入extman进行后台管理了。默认管理帐号为:root@extmail.org 密码为:extmail*123*
这里特别说明下,当我们通过管理用户登入,extman,进行管理的时候,创建自己的域的时候,创建完成后,要再次编辑,允许自由注册,这样我们就允许新用户注册了