• 搭建完整邮件系统(postfix+dovecot+clamAV+Spamassassin+amavisd-new)


    ============================

    相关软件:

    1. 发送邮件 --- postfix
    2. 身份认证 --- sasl2

    3. 接收邮件 --- dovecot

    4. 防病毒邮件 --- clamAV

    5. 防垃圾邮件 --- spamassassin

    6.控制病毒及垃圾邮件扫描程序 --- amavisd-new

    ============================

    待完善的问题:

    1. 群发邮件的权限设置

    2. 用户邮箱的配额限制

    ============================


    完整邮件系统架构简介

    我们知道,一个完整的邮件系统应该包括以下几个重要功能:

    基本功能:      发送邮件、收取邮件

    安全性功能:  收发邮件的身份认证、防病毒、防垃圾

    完整的邮件系统架构流程图如下:



    相关软件的安装及配置

    1. 安装postfix,同时让postfix支持mysql查询
       # aptitude install postfix postfix-mysql
    2. 查看postfix是否支持外部数据库mysql认证
       # postconf -m
          btree
          cidr
          environ
          hash
          internal 
          mysql
          nis
          proxy
          regexp
          sdbm
          static
          tcp
          unix


    3. 查看postfix支持的sasl认证类型
            # postconf -a
            cyrus
            dovecot

    4. 安装cyrus sasl认证
       # aptitude install sasl2-bin libsasl2-modules-sql
    5. 修改/etc/default/saslauthd
       START=no  ====> START=yes
    6. 重启saslauthd,并验证saslauthd正常工作
       # /etc/init.d/saslauthd restart
       # testsaslauthd -u {username} -p {password}
       若出现如下结果,表示saslauthd已正常运行,并可进行认证服务,否则请检查username和password并重试
       0: OK "Success."

       注:{username},{password}是登录linux系统的用户名和密码


    7. postfix启用sasl认证
       编辑/etc/postfix/main.cf,在最后添加如下内容:
       smtpd_sasl_auth_enable = yes
       broken_sasl_auth_clients = yes
       smtpd_sasl_security_options = noanonymous


    8. 修改/etc/postfix/master.cf,禁止postfix启用chroot
       smtp      inet  n       -       -       -       -       smtpd
       rewrite   unix  -       -       -       -       -       trivial-rewrite
       cleanup   unix  n       -      -       -       0       cleanup
       ==========>>>>>>
       smtp      inet  n       -       n       -       -       smtpd
       rewrite   unix  -       -       n       -       -       trivial-rewrite
       cleanup   unix  n       -       n       -       0       cleanup
       

        这样设置的原因:如果不这么设置,则在发送邮件时,总是报如下错误,且邮件无法发送成功:

        postfix/trivial-rewrite[10698]: warning: connect to mysql server localhost: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' 
        postfix/trivial-rewrite[10698]: fatal: mysql:/etc/postfix/mysql_virtual_alias_maps.cf(0,lock|fold_fix): table lookup problem
        postfix/smtpd[10394]: warning: problem talking to service rewrite: Success
        postfix/master[10386]: warning: process /usr/lib/postfix/trivial-rewrite pid 10698 exit status 1
        postfix/smtpd[10697]: warning: problem talking to service rewrite: Connection reset by peer
        postfix/master[10386]: warning: /usr/lib/postfix/trivial-rewrite: bad command startup -- throttling

    9. 安装mysql并创建数据库和表,同时插入数据
       # aptitude install mysql-client mysql-server
       # mysql -u root -p
         输入密码
       # sql> create database mail;
       # sql> create table mail.users( id in(8) primary key auto_increment, username varchar(50), password varchar(50), domain varchar(50), quota int(10), maildir varchar(200));
       # sql> insert into mail.users(username,password,domain,maildir,quota) values('test','test','tiddy.com','tiddy.com/test/',16000);
       # sql> commit;

    10. 修改postfix通过sasl的认证方式(pam/shadow/sql/ldap),在/etc/postfix/sasl目录下新建文件smtpd.conf,内容如下:
    pwcheck_method: auxprop
    auxprop_plugin: sql
    mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM
    sql_engine: mysql
    sql_hostnames: 127.0.0.1
    sql_user: root
    sql_passwd: tiddy
    sql_database: mail
    sql_select: SELECT password FROM users WHERE username = '%u'

    11. 在postfix上安装telnet并进行测试
       # aptitude install telnet
       # telnet localhost 25
         Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    220 mail.tiddy.com ESMTP Postfix (Debian/GNU)
    auth login
    334 VXNlcm5hbWU6
    dGVzdA==
    334 UGFzc3dvcmQ6
    dGVzdA==
    235 2.7.0 Authentication successful
    mail from:<user1@tiddy.com>
    250 2.1.0 Ok
    rcpt to:<tiddy@126.com>
    250 2.1.5 Ok
    data
    354 End data with <CR><LF>.<CR><LF>
    Subject: alskdjlasd
    lasdjflasdf
    .
    250 2.0.0 Ok: queued as 4C1FB440E6

    postfix sasl mysql认证成功


    注意:上述红色标记的文字表示经过BASE64编码的用户名(test)和密码(test)

    12. 安装POP3软件dovecot
        # aptitude install dovecot-pop3d


    13. 创建虚拟用户(以便该用户有权限访问邮件存放目录)
        # groupadd -g 5000 vmail
        # useradd -u 5000 -g 5000 vmail -d /var/vmail -m

    14. 配置dovecot
        修改/etc/dovecot/dovecot.conf,主要修改如下部分
        1) 去掉注释符号(#)
           base_dir = /var/run/dovecot
        2) dovecot所使用的协议
           protocols = pop3 pop3s
        3) dovecot所监听的端口(*:监听所有网络端口)
           listen = *
        4) 打开明文密码认证(采用pop3协议收取邮件时,采用明文密码认证)
           disable_plaintext_auth = no
        5) 日志文件
           log_path = /var/log/dovecot.log
        6) debug日志文件
           info_log_path = /var/log/dovecot.info
        7) 每行日志输出的前缀
           log_timestamp = "%Y-%m-%d %H:%M:%S "
        8) 客户端用pop3协议收取邮件时的服务器收取路径
           mail_location = maildir:/var/vmail/%d/%n/
        9) 是否开启debug(测试阶段使用,正式投入使用后,最好关闭)
           mail_debug = yes

       10) dovecot的pop3认证

           auth default {
                #认证方式
                mechanisms = plain login
                #认证过程中的密码查询方式(采用sql查询)
                passdb sql {
                        # Path for SQL configuration file
                        args = /etc/dovecot/dovecot-sql.conf
                }
                #认证过程中的用户查询方式(采用sql查询)
                userdb sql {
                        # Path for SQL configuration file
                        args = /etc/dovecot/dovecot-sql.conf
                }
                #监听客户端socket以便随时发现客户端发起的用户身份认证
                socket listen {
                        client {
                          path = /var/spool/postfix/private/auth
                          mode = 0660
                          user = postfix
                          group = postfix
                        }
                }


           }

    15. 修改/etc/dovecot/dovecot-sql.conf
        1) 数据库驱动
           driver = mysql
        2) 数据库连接信息
           connect = host=localhost dbname=mail user=root password=tiddy
        3) 数据库密码的加密方式(PLAIN:明文方式,不加密)
           default_pass_scheme = PLAIN
        4) 数据库查询语句
           password_query = SELECT username, domain, password FROM users WHERE username = '%n'
           user_query = SELECT maildir, 5000 AS uid, 5000 AS gid FROM users WHERE username = '%n'


    16. 重新修改/etc/postfix/main.cf(注意:有的内容已经存在或添加过,请务必不要重复添加)
    ######################## 基本配置 ##########################
    myhostname = postfixsvr
    alias_maps = hash:/etc/aliases
    alias_database = hash:/etc/aliases
    myorigin = tiddy.com
    relayhost =
    mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
    mailbox_size_limit = 0
    recipient_delimiter = +
    inet_interfaces = all
    #我们使用虚拟网域virtual_mailbox_domains变量来决定哪些网域的邮件可以被投递,此处注释掉
    #relay_domains = tiddy.com
    #mydestination = tiddy.com


    ##################### 启用SASL Auth ########################

    # 设定 Postfix 使用 SASL 认证。
    smtpd_sasl_auth_enable = yes


    # 设定 SASL 支持非标准 E-mail Client 的认证动作。
    broken_sasl_auth_clients = yes


    # 不使用 ANONYMOUS 这个认证。
    smtpd_sasl_security_options = noanonymous


    # 对收件人,发件人的限制(允许授权认证用户,本地网络用户<即mynetwork定义的网络客户端>,其他一律拒绝)
    smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject


    # 客户端限制(允许授权认证客户端,本地网络客户端<即mynetwork定义的网络客户端>,其他一律拒绝)
    smtpd_client_restrictions = permit_sasl_authenticated, permit_mynetworks, reject


    # 认证类型
    smtpd_sasl_type = dovecot


    # sasl认证路径(注意与dovecot配置文件/etc/dovecot/dovecot.conf中的socket listen内容path末端保持一致)
    smtpd_sasl_path = private/auth

    ############################### 虚拟邮箱 #####################################

    # 虚拟邮箱的根路径

    virtual_mailbox_base = /var/vmail

    # 虚拟邮箱映射表
    virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf


    # 虚拟网域
    virtual_mailbox_domains = tiddy.com

    # 虚拟别名映射表(用户邮箱别名,邮件群组都由该参数决定,群组也是别名的一种形式)
    virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf

    # 哪些用户可以访问虚拟邮箱
    virtual_uid_maps = static:5000
    virtual_gid_maps = static:5000


    ########################### 邮件投递程序 #################################
    virtual_transport = virtual


    ########################## 邮箱容量限制################################
    #每封信的最大大小(10M),postfix的默认值为10M,但这指的是邮件正文和
    #编码后附件的总和,经过base64编码,附件的大小会增加35%左右,因此这里设定邮件大小为14M
    message_size_limit = 14336000


    # 如果使用Courier maildir++ quotas,则使用yes,默认为no
    virtual_maildir_extended = yes


    virtual_create_maildirsize = yes

    #默认邮箱大小限制
    virtual_mailbox_limit = 16000000


    #是否允许覆盖默认的邮箱大小设置。
    virtual_mailbox_limit_override = yes

    # no限制整个maildir,yes只限制inbox,默认为no
    virtual_mailbox_limit_inbox = no


    #针对每个用户的限制
    virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf

    # 这个选项在未设置’virtual_maildir_limit_message_maps’时,如果用户超出了限额的提示信息
    virtual_maildir_limit_message = Sorry, overquota


    # yes的话使用5xx错误,no使用4xx错误,邮件还是会被放入队列
    virtual_overquota_bounce = yes


    # 是否在计算限额时加上垃圾文件夹,这个选项需要virtual_trash_name配合,默认为no
    virtual_trash_count = no
    # 设置垃圾文件夹名称,默认值为:.Trash
    virtual_trash_name = “.Trash”


    17. 创建相关文件

        (1) 创建文件/etc/postfix/mysql_virtual_mailbox_maps.cf,内容如下(下面内容其实是查询数据库,具体语句涵义不再赘述):

              user = root
              password = tiddy
              hosts = localhost
              dbname = mail
              table = users
              select_field = maildir
              where_field = username

         (2) 创建文件/etc/postfix/mysql_virtual_alias_maps.cf,内容如下(下面内容其实是查询数据库,具体语句涵义不再赘述):

              user = root
              password = tiddy
              hosts = localhost
              dbname = mail
              table = alias
              select_field = goto
              where_field = address

    18. 数据库结构

           数据库名称:mail

           数据库表users( id in(8) primary key auto_increment, username varchar(50), password varchar(50), domain varchar(50), quota int(10), maildir varchar(200))

           数据库表alias( id int(8) primary key auto_increment, address varchar(100), goto varchar(5000), isgroup int(2))


        注意:

              (1) 表users中的字段maildir保存的邮件存放路径的最后一个字符'/'有无,决定了邮件的存放方式:有'/'表示以maildir方式存放,无'/'表示以mailbox方式存放

              (2) 表alias中的字段goto表示根据别名邮箱将邮件实际转发的目标邮箱,如果是群组转发,则goto字段可能保存多个邮箱地址,这些邮箱地址以分号隔开


    -----------------------------------------------------------------以上是基本邮件系统的安装及配置---------------------------------------------------------------------------------

    -----------------------------------------------------------------以下是对基本邮件系统的完善(包括杀毒和防垃圾邮件的处理)---------------------------------------------------------------------------------

    1. 安装杀毒软件(ClamAV)和防垃圾软件(SpamAssassin)及其相关依赖包
         # apt-get install libnet-dns-perl pyzor razor arj bzip2 cabextract cpio file gzip lha nomarch pax rar unrar unzip zip
         # apt-get install amavisd-new spamassassin clamav-daemon


    2. 修改用户权限
         # usermod -a -G clamav amavis
         # usermod -a -G amavis clamav


    3. 修改spamassassin配置文件/etc/default/spamassassin
         ENABLED=0 ====> ENABLED=1
         CRON=0    ====> CRON=1


    4.启动spamassassin
        # /etc/init.d/spamassassin start


    5. 修改amavis配置文件/etc/amavis/conf.d/15-content_filter_mode
        去掉如下内容注释(目的:check病毒和垃圾邮件)
        @bypass_virus_checks_maps = (
         \%bypass_virus_checks, @bypass_virus_checks_acl, $bypass_virus_checks_re);

         @bypass_spam_checks_maps = (
         \%bypass_spam_checks, @bypass_spam_checks_acl, $bypass_spam_checks_re);




    6. 修改postfix配置文件/etc/postfix/main.cf,注释掉mydestination,并添加如下内容
        # 将postfix接收到的邮件传递给amavis程序进行扫描

        content_filter = smtp-amavis:[127.0.0.1]:10024


    7. 编辑文件/etc/postfix/master.cf,在文件最后添加如下内容(注意:-o之前必须至少有两个空格,表示跟前面一行在逻辑上是一行
    smtp-amavis     unix    -       -       -       -       2       smtp
            -o smtp_data_done_timeout=1200
            -o smtp_send_xforward_command=yes
            -o disable_dns_lookups=yes
            -o max_use=20


    127.0.0.1:10025 inet    n       -       -       -       -       smtpd
            -o content_filter=
            -o local_recipient_maps=
            -o relay_recipient_maps=
            -o smtpd_restriction_classes=
            -o smtpd_delay_reject=no
            -o smtpd_client_restrictions=permit_mynetworks,reject
            -o smtpd_helo_restrictions=
            -o smtpd_sender_restrictions=
            -o smtpd_recipient_restrictions=permit_mynetworks,reject
            -o smtpd_data_restrictions=reject_unauth_pipelining
            -o smtpd_end_of_data_restrictions=
            -o mynetworks=127.0.0.0/8
            -o smtpd_error_sleep_time=0
            -o smtpd_soft_error_limit=1001
            -o smtpd_hard_error_limit=1000
            -o smtpd_client_connection_count_limit=0
            -o smtpd_client_connection_rate_limit=0
            -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks


    8. 在文件/etc/postfix/master.cf中的pickup行添加如下内容(注意:-o之前必须至少有两个空格,表示跟前面一行在逻辑上是一行
          -o content_filter=
          -o receive_override_options=no_header_body_checks


    9. 重启postfix
        # /etc/init.d/postfix reload


    10. amavis对相关邮件(病毒,垃圾邮件等)的处理方式,修改/etc/amavis/conf.d/20-debian_defaults

           关于如下参数的含义,详情请参见我的另一篇文章《邮件系统之amavisd-new的简介、安装及配置》
        $final_spam_destiny = D_BOUNCE  ===> $final_spam_destiny = D_DISCARD
        $QUARANTINEDIR = "/data/virusmails";


    11. 修改/etc/amavis/conf.d/05-node_id(若不修改成如下格式,在启动邮件系统的一些软件时,在/var/log/mail.log中总是报错,且软件无法正常启动)
          $myhostname = "mail.tiddy.com";


    12. 修改/etc/amavis/conf.d/50-user,添加如下内容(注意如下内容不能添加到最后面):

          #垃圾邮件和病毒邮件将被存放的目录(该目录spam-quarantine对应/etc/amavis/conf.d/20-debian_defaults文件中的变量$QUARANTINEDIR )

          #这里的设置表示垃圾及病毒邮件的保存目录为/data/virusmails
          $spam_quarantine_to = "spam-quarantine";
          $virus_quarantine_to = "spam-quarantine";
          #黑白名单设置
          @whitelist_sender_maps = read_hash("/etc/amavis/whitelist");
          @blacklist_sender_maps = read_hash("/etc/amavis/blacklist");


    13. 在目录/etc/amavis下创建文件blacklist(黑名单)和whitelist(白名单)
           # touch /etc/amavis/whitelist
           # touch /etc/amavis/blacklist

    14. 重启所有服务

           # /etc/init.d/clamav-daemon restart

           # /etc/init.d/clamav-freshclam restart 

           # /etc/init.d/spamassassin restart

           # /etc/init.d/amavis restart

           # /etc/init.d/postfix restart

           # /etc/init.d/dovecot restart


  • 相关阅读:
    SourceTree 3.0.17如何跳过注册进行安装? — git图形化工具(一)
    一键复制功能
    如何适配处理iphoneX底部的横条
    .gitignore文件如何编写?
    Spring事务管理——事务的传播行为
    数据库事务之声明式事务
    JVM中的内存分区简介
    SpringMVC中文件的上传(上传到服务器)和下载问题(二)--------下载
    SpringMVC中文件的上传(上传到服务器)和下载问题(一)--------上传
    HashMap和Hashtable的区别
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3471429.html
Copyright © 2020-2023  润新知