postfix:

    日志:
        /var/log/maillog

    邮件别名:
        将发给a的邮件发给b。
        /etc/aliases  别名文件。postfix无法识别。
            格式:
                USERNAME1@DOMAIN1:USERNAME2@DOMAIN2

        /etc/aliases.db 由hash生成的别名文件数据库。postfix读取速度快。

        #newaliases [OPTION] 创建别名数据库。将aliases文件通过hash生成aliases.db

    中继:
        默认将本机IP地址所在网段都识别为本地网络,都予以中继。


    配置文件:

        master: /etc/postfix/master.cf 主进程配置文件。若maildrop作为postfix的一个模块来使用,则相关的配置都在此文件中。

        mail:/etc/postfix/main.cf  实现各项功能的配置文件。

        /etc/postfix/main.cf
            格式: 参数 = 值 。参数必须卸写在绝对行首,空白开头的行被认为是上一行的延续。

        #postconf [OPTION] postfix自带配置main.cf的工具
            [OPTION]
                -d 显示main.cf的默认字段。
                -n 显示main.cf中修改过的字段
                -m 显示支持的所有查找表(lookup table)类型。即储存账号的表。
                -A 显示可用的sasl客户端插件类型。既所支持的sasl验证类型。
                -a 服务器端支持的sasl插件类型。
                -e PARMATER=VALUE 编辑main.cf的内容,通过的PARMATER=VALUE格式来更新配置文件。

            例如:
                #postconf -d

    基于客户端的访问控制:
        在发送过程中,每个阶段都可以控制,在main.cf中有定义,默认配置如下:
            #vim /etc/postfix/main.cf
                smtpd_client_restrictions =
                    限定连接服务器

                smtpd_data_restrictions =
                    限定发送data指令

                smtpd_end_of_data_restrictions =
                smtpd_etrn_restrictions =
                smtpd_helo_restrictions =
                    限定发送helo指令

                smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
                    限定发送rept to指令,即中继的限定。即使前边几个指令被限定,服务器也会返回正确信息。只有到这步,服务器才会返回相关的限定信息。

                smtpd_sender_restrictions =
                    限定发动mail from指令

        限制条件:
            permit_mynetworks 允许$mynetworks中定义的网段给与中继。

            reject_unauth_destination 拒绝未经认证的目标。

            ...

            访问表(access map):
                check_client_access
                check_helo_access
                check_sender_access
                check_recipient_access

                访问表文件:
                    实际上访问表文件名字可以自定义,只要保证配置文件中能互相匹配即可。默认使用access。
                    
                    /etc/postfix/access 文本文件
                        格式为PATTERN ACTION
                            PATTERN
                                邮件地址:  
                                    USERNAME@DOMAIN 匹配指定的邮件地址。

                                    DOMAIN 匹配域名部分符合的所有邮件地址。

                                    USERNAME@ 匹配用户名符合的所有邮件地址。


                                域名:
                                    DDMAIN 匹配指定域和其子域内的所有主机。

                                    .DOMAIN 匹配指定子域中的所有主机。

                                IP地址:
                                    IPADDR.IP.IP.IP 匹配指定ip的所有主机。

                                    IPADDR.IP.IP 匹配指定网段内的所有主机。

                                    IPADDR.IP 匹配指定网段内的所有主机。

                                    IPADDR 匹配指定网段内的所有主机。


                                    IPADDR/MASK CIDR格式,匹配指定网段内的所有主机。


                            ACTION
                                OK 接受PATTERN所指定的。
                                NUMS 全部为数字组成,隐式表示OK

                                REJECT CODENUM TEXT 拒绝
                                DEFER CODENUM TEXT 拒绝
                                    CODENUM TEXT 自定义拒绝码和信息,注意421和521对postfix有特殊含义,不要使用。


                    /etc/postfix/access.db hash文件

                    #postmap  [OPTION] /etc/postfix/access 将文本文件转换为hash格式的查找表文件。
                    例如:
                        #vim /etc/postfix/main.cf
                            smtpd_client_restrictions = check_client_access hash: /etc/postfix/access
                                从文件中检索相关的用户是否可以连接到服务器

            mysql:
                #vim /etc/postfix/main.cf
                            smtpd_client_restrictions = check_client_access mysql: /etc/postfix/mysql_user

        实例:
            1.禁止172.16.100.200这台主机通过工作在172.16.100.1上的postfix服务发送邮件。访问表使用hash的格式。
                #vim  /etc/postfix/access
                    172.16.100.200 REJECT
                #postmap /etc/postfix/access
                #vim /etc/postfix/main.conf
                    smtpd_client_restrictions = check_client_access hash:/etc/postfix/access
                #systemctl restart postfix

            2.禁止microsoft.com域向本服务器发送邮件。访问表使用hash的格式。
                #vim /etc/postfix/access
                    microsoft.com REJECT
                #postmap /etc/postfix/access
                #vim /etc/postfix/main.cf
                    smtpd_sender_restrictions = check_recipient_access hash:/etc/postfix/access
                #systemctl restart postfix

            3.禁止所有用户向hadoop发送邮件,访问表使用hash的格式
                #vim /etc/postfix/denyhadoop
                    hadoop@ REJECT
                #postmap /etc/postfix/denyhadoop
                #vim /etc/postfix/main.cf
                    smtpd_recipient_restrictions = heck_recipient_access hash:/etc/postfix/denyhadoop, permit_mynetworks, reject_unauth_destination 这里注意优先级顺序。
                #systemctl restart postfix


    别名相关:

        作用:将发给USERNAME1的邮件全部发给USERNAME2。注意不是转发。
        文本文件:
            /etc/aliases

        hash后文件:
            /etc/aliases.db


        配置文件:
            /etc/postfix/aliases
            格式:
                USERNAME1@DOMAIN1: USERNAME2

        #newaliases 生成新的hash查找表文件

        #systemctl restart postfix 重启服务后生效。


    编译安装配置postfix:
        0.创建用户和组:
            用户和组的id必须一致,并且尽量大于1000。

            #groupadd -g 2525 postfix
            #groupadd -g 2526 postdrop postfix自带的MDA,如果换成maildrop可以不创建。
            #useradd  -M -u 2525 -g 2525 postfix -s /sbin/nologin
            #useradd -M -u 2526 -g 2526 postdrop -s /sbin/nologin

        1.编译安装:
            #tar -xf postfix-xxx.tar.gz
            #cd postfix-xx
            #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'
            #make
            #make install

            指定相关路径:

            install_root: [/] / 默认路径。默认安装在根下。
            tempdir: [/root/postfix-XXX] /tmp/postfix 临时文件
            config_directory: [/etc/postfix] /etc/postfix 配置文件
            daemon_directory: [/usr/libexec/postfix] 进程目录
            command_directory: [/usr/sbin]  服务脚本位置
            data-directory: [/var/lib/postfix] 工作空间的位置
            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] 指定用户组
            html_directory: [no]/var/www/html/postfix web格式文档路径。
            manpages: [/usr/local/man] man文档路径
            readme_directory: [no] readme文档路径


            编译选项详解:
                CCARGS= 功能开关
                    -DHAS_MYSQL 支持mysql驱动
                    -I/usr/local/mysql/include 指定mysql头文件的位置
                    -DUSE_SASL_AUTH 支持SASL认证
                    -DUSE_TLS 支持TLS认证

                AUXLIBS= 指定额外库文件位置
                    -L/usr/local/mysql/lib 指定mysql库文件
                    -L/usr/lib/sasl2 制定sasl库文件
                    -lmysqlclient mysql客户端的库文件
                    -lz 压缩库文件
                    -lm 模块文件
                    -lcrypto 加密的库文件
                    -lssl ssl的库文件
                    -lsasl2 sasl2的库文件,需要cyrus-sasl-devel包和cyrus-sasl-plain包。

        2.复制服务脚本:
            #vim /etc/rc.d/init.d/postfix
                #!/bin/bash
                #
                # postfix      Postfix Mail Transfer Agent
                #
                # chkconfig: 2345 80 30
                # description: Postfix is a Mail Transport Agent, which is the program \
                #              that moves mail from one machine to another.
                # processname: master
                # pidfile: /var/spool/postfix/pid/master.pid
                # config: /etc/postfix/main.cf
                # config: /etc/postfix/master.cf

                # Source function library.
                . /etc/rc.d/init.d/functions

                # Source networking configuration.
                . /etc/sysconfig/network

                # Check that networking is up.
                [ $NETWORKING = "no" ] && exit 3

                [ -x /usr/sbin/postfix ] || exit 4
                [ -d /etc/postfix ] || exit 5
                [ -d /var/spool/postfix ] || exit 6

                RETVAL=0
                prog="postfix"

                start() {
                    # Start daemons.
                    echo -n $"Starting postfix: "
                        /usr/bin/newaliases >/dev/null 2>&1
                    /usr/sbin/postfix start 2>/dev/null 1>&2 && success || failure $"$prog start"
                    RETVAL=$?
                    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/postfix
                        echo
                    return $RETVAL
                }

                stop() {
                  # Stop daemons.
                    echo -n $"Shutting down postfix: "
                    /usr/sbin/postfix stop 2>/dev/null 1>&2 && success || failure $"$prog stop"
                    RETVAL=$?
                    [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/postfix
                    echo
                    return $RETVAL
                }

                reload() {
                    echo -n $"Reloading postfix: "
                    /usr/sbin/postfix reload 2>/dev/null 1>&2 && success || failure $"$prog reload"
                    RETVAL=$?
                    echo
                    return $RETVAL
                }

                abort() {
                    /usr/sbin/postfix abort 2>/dev/null 1>&2 && success || failure $"$prog abort"
                    return $?
                }

                flush() {
                    /usr/sbin/postfix flush 2>/dev/null 1>&2 && success || failure $"$prog flush"
                    return $?
                }

                check() {
                    /usr/sbin/postfix check 2>/dev/null 1>&2 && success || failure $"$prog check"
                    return $?
                }

                restart() {
                    stop
                    start
                }

                # See how we were called.
                case "$1" in
                  start)
                    start
                    ;;
                  stop)
                    stop
                    ;;
                  restart)
                    stop
                    start
                    ;;
                  reload)
                    reload
                    ;;
                  abort)
                    abort
                    ;;
                  flush)
                    flush
                    ;;
                  check)
                    check
                    ;;
                  status)
                    status master
                    ;;
                  condrestart)
                    [ -f /var/lock/subsys/postfix ] && restart || :
                    ;;
                  *)
                    echo $"Usage: $0 {start|stop|restart|reload|abort|flush|check|status|condrestart}"
                    exit 1
                esac

                exit $?

            #chmod +x /etc/rc.d/init.d/postfix

        3.修改配置文件:
            #vim /etc/postfix/main.cf
                myhostname = MAILSERVERNAME.DOMAIN
                    邮件服务器的主机名。要和hostname以及dns服务器中的主机名称保持一致。

                myorigin = $mydomain
                    指定发件人所在的域名。用来邮件地址伪装。发送来的邮件都会被改写成此域的域名。

                mydomain = DOMAIN
                    当前邮件服务器所在的域的域名。若不指定,则会将$myhostname中的第一部分删除作为域名。

                mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, ns.$mydomain
                    指定目标收件人的域名。包含在其中域,表示本机为这些域的收件服务器,可以不用中继。能否中继取决于$mynetworks中定义。若主机有其他别名也一并添加,例如ns.$mydomain

                mynetworks = 192.168.1.0/24, 127.0.0.0/8
                    本地网络,允许为来自以上网段的进行中继。

                inet_interfaces = all postfix进程 监听的IP地址,默认为all。0.0.0.0表示本机的所有可用地址。

        4.修改主机名和dns

            #vim /etc/hostname
                MAILSERVERNAME.DOMAIN

            #vim /etc/resolv.conf
                nameserver IP

        5.生成别名数据库
            #newaliases

        6.发送邮件测试:
            #telnet localhost 25 发送测试
                helo localhost
                mail from:XXX@XXXX
                rcpt to:xxxx
                data
                Subject: xxxx
                XXX
                .
                quit


        7.支持sasl认证:
            启用sasl服务:
                sasl服务脚本:
                    /etc/rc.d/init.d/saslauthd

                脚本配置文件:
                    /etc/sysconfig/saslauthd
                        MECH=shadow 将认证方式从pem改为shadow,即从/etc/shadow中读取账号密码。


                #systemctl start saslauthd

                #saslauthd [OPTION]
                    [OPTION]
                        -v 显示当前sasl服务支持的认证方式,即所支持的认证模块。默认为pam。


                #testsaslauthd [OPTION] 测试sasl认证命令。
                    [OPTION]
                        -u USERNAME
                        -p PASSWORD

                    例如:
                        #testsaslauthd -u hadoop -p hadoop

        8.支持cyrus-sasl认证:
            1.验证是否支持cyrus-sasl
                #postfixconf -a
                    cyrus
                    dovecot

                显示如上的话说明支持。

            2.编辑main.cf
                #vim /etc/postfix/main.cf
                    ############################CYRUS-SASL############################
                    broken_sasl_auth_clients = yes 是否通过sasl来验证客户端身份。
                    smtpd_recipient_restrictions= 中继设置,根据实际情况选择。
                        permit_mynetworks, 允许$mynetworks中定义的的网段(必须有)
                        permit_sasl_authenticated, 允许sasl验证通过的用户(必须有)
                        reject_invalid_hostname, 拒绝主机名不合法
                        reject_non_fqdn_hostname, 拒绝主机名不是FQDN格式。
                        reject_unknown_sender_domain, 拒绝无法识别的发件人域
                        reject_non_fqdn_sender, 拒绝没有FQDN的发件人
                        reject_non_fqdn_recipient, 拒绝没有FQDN的收件人
                        reject_unknown_recipient_domain, 拒绝没有FQDN的收件人域
                        reject_unauth_pipelining, 拒绝无法验证的管道
                        reject_unauth_destination 拒绝无法验证的目标(必须有)
                    smtpd_sasl_auth_enable = yes 启用sasl验证
                    smtpd_sasl_local_domain = $myhostname
                    smtpd_sasl_security_options = noanonymous 禁止匿名用户
                    smtpd_sasl_path = smtpd 指定要使用sasl功能的服务器程序
                    smtpd_banner = Welcome to our $myhostname ESMTP,Warning: Version not Available! 定义欢迎信息

            3.编辑smtpd.conf,若不存在则手工建立。
                #vim /usr/lib/sasl2/smptd.conf sasl对smtp验证的相关配置
                    log_level: 3 日志级别,3为显示更详细信息。一般用在排错,实际配置可以不写。
                    pwcheck_method: saslauthd 密码检查方法。
                    mech_list: PLAIN LOGIN 认证机制列表。

            4.重启postfix服务:
                #systemctl restart postfix
                #systemctl restart saslauthd


            5.测试:
                #vim /etc/postfix/main.cf
                    mynetworks=127.0.0.0/8

                #telent 172.16.100.1 25
                    ehlo mail.test.com
                        ...
                        250-AUTH LOGIN PLAIN 显示以下2行说明启用了验证
                        250-AUTH=LOGIN PLAIN
                        ...
                    mail from: root@test.com
                    rcpt to a@b.org 默认情况下是拒绝的。
                        554 Realy access deny
                #telnet 172.16.100.1 25
                    ehlo mail.test.com
                        ...
                        250-AUTH LOGIN PLAIN
                        250-AUTH=LOGIN PLAIN
                        ...
                    auth login
                    334 xxxxxx
                    USERNAME 这里输入经过base64编码的用户名,例如使用hadoop登录。
                    334 xxxxxx
                    PASSWORD 经过base64编码的密码
                    235 Authentication successful
                    mail form hadoop@test.com
                    rcpt to a@b.org



                #echo -n "hadoop" | openssl base64
                默认echo会打印换行符,-n表示不换行。通过openssl进行base64编码。
                    USENAME

                #echo -n “PASSWD” | openssl base64
                    PASSWORD