电子邮件,就是用一种电子手段提供信息交换的通信方式。

  在生活当中,我们如果想邮寄出一封信,要写上收信人地址和发信人地址,然后交给我们当地的邮局,如果收信人是本地的,我们本地的邮局就派邮递员,将信发到收信人的邮箱里,收信人去拿就可以了,如果是外地的,本地的邮局将信件发送给收信人地方的邮局,投递给收信人,而我们的电子邮件的原理,和我们现实生活当中有很多的相似之处呢。

   整个电子邮件传输过程的参与者有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,帮助大家简单了解一下邮件传输的过程。

Linux上邮件服务postfix 2.9.3编译安装_邮件服务

                                               图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:


Linux上邮件服务postfix 2.9.3编译安装_邮件服务_02

                                图1.2 正向域MX记录

      反向域,如图1.3:


Linux上邮件服务postfix 2.9.3编译安装_邮件服务_03

                                图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)。

Linux上邮件服务postfix 2.9.3编译安装_邮件服务_04

                                             图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,进行管理的时候,创建自己的域的时候,创建完成后,要再次编辑,允许自由注册,这样我们就允许新用户注册了