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

相关软件:

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

搭建完整邮件系统(postfix+dovecot+clamAV+Spamassassin+amavisd-new)的更多相关文章

  1. 搭建邮件服务器 Postfix + Dovecot (CentOS)

    最近分配到一台ECS服务器,需要搭建一台邮件服务器. 查了一波资料选择了Postfix (smtp)和 Dovecot(pop3). 推荐教程:http://www.cnblogs.com/zlbei ...

  2. Linux搭建邮件服务器Postfix+Dovecot+MySQL+PHP

    用于搭建的服务器信息 阿里云 Centos 6.5 32位 安装过程1.安装Postfix 版本(2:2.6.6-8.el6) yum -y install postfix 安装完成还需要替换系统自带 ...

  3. Postfix+Dovecot+MySQL搭建邮件服务器

    网上有很多使用Postfix搭建邮件服务器的文章,但目前貌似没有看到较为完整的一篇.本例将尝试在Ubuntu系统中使用Postfix+Dovecot+MySQL搭建邮件服务器. 说到邮件服务器,网上有 ...

  4. centos6.8 搭建postfix/dovecot邮件服务器

    postfix/dovecot邮件服务器 安装配置参考链接  http://www.cnblogs.com/jkklearn/p/7280045.html (domain 为自己域名 xxx.com) ...

  5. 企业邮件系统-Postfix安装使用

    Postfix是目前流行的一套邮件传输代理软件(MTA),其作者Wietst Venema最初开发这套软件时就对总体设计.扩展能力.可用性及系统安全等方面进行了充分的考虑.由于Postfix在稳定.效 ...

  6. postfix+dovecot配置多域名邮件服务器

    mail邮局系统的MX(邮件交换)记录配置,以便收发邮件.(MX记录,是邮件交换记录,它指向一个邮件服务器,用于电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器,如果没有做域名解析,邮局不能正 ...

  7. CentOS 系统中安装postfix+dovecot+openwebmail <转>

    一.先卸载sendmain[root@ser ~]#  yum remove sendmail 二.安装postfix ,dovecot,cyrus-sasl[root@ser ~]#  yum -y ...

  8. [RHEL] RHEL7.0 下 Postfix + Dovecot 实现邮件发送

    RHEL7.0 下 Postfix + Dovecot 实现邮件发送 一.前言 大家都对邮件服务(mail service)很感兴趣嘛.我在自己 博客站 预言了自己会实战一次,访问量一天到十几(毕竟平 ...

  9. Vue项目搭建完整剖析全过程

    Vue项目搭建完整剖析全过程 项目源码地址:https://github.com/ballyalex 有帮助的话就加个星星呗~!  项目技术栈:vue+webpack+bower+sass+axios ...

随机推荐

  1. 纯css+js水平时间轴

    自定义,并自动加载时间节点 当前时间节点居中,突出显示 时间动态无痕添加 效果图: 初始状态 时间左走到一定2016.1月后 html: <!-- 水平时间轴 --> <div id ...

  2. JavaScript--时间显示小插件

    JS调用系统时间,显示在当前页面上,利用DOM操作节点来实现动态刷新 <!DOCTYPE html> <html> <head> <meta charset= ...

  3. sql - 复制表

    1,复制表结构和内容 1)这个表: select * into new_table_name from old_table_name ref:SQL复制数据表及表结构

  4. WebStorm shortcuts.

  5. PHP Countable接口

    实现该接口可以使用count()方法来获取集合的总数

  6. 疯狂学习java web5(SSI框架)

    其实前面的所有只是铺垫,目的只是为了了解现有工程是怎样的.之前直接上来就看,看了很久依然是云里雾里,所以不得已学习点基础知识,前面的基础只是蜻蜓点水一带而过,希望能起部分作用了. 发现struct2有 ...

  7. 浮点与整形在GUI下的相关思考

    平时不接触绘图,似乎感觉不到浮点和整形所带来的区别,这次项目中意外的碰到了浮点与整形进行迁移的工作.因此写点心得,让自己以后也可以看看. 用浮点作图有个最大的弊端就是边界情况,比如你需要在点(20,2 ...

  8. Django - staticfiles,STATIC_ROOT, STATIC_URL,STATICFILES_DIRS

    staticfiles:这是一个静态资源管理的app,django.contrib.staticfiles.老的版本中,静态资源管理一直是一个问题,部分app发布的时候需要带上静态资源,在部署的时候必 ...

  9. 总结:ARM逻辑和高级C(朱老师物联网学习)

    开始学习朱老师物联网的视频是国庆节的那几天开始的,刚刚开始的时候是想自己在网上找一些嵌入式方面的视频资料,也找了很多的资料臂如“国嵌视频”“达内的视频”,之后也化了十几块钱在淘宝上面买了几十个G的视频 ...

  10. Tomcat基础教程(一)

    Tomcat, 是Servlet和JSP容器,其是实现了JSP规范的servlet容器.它在servlet生命周期内包容,装载,运行,和停止servlet容器. Servlet容器的三种工作模式: 1 ...