折腾centos6下的postfix+dovecot+mysql的虚拟域名用户账户的邮件服务器(一)

安装依赖包软件

# yum -y install postfix postfix-mysql dovecot dovecot-mysql

首先先保证不连接数据库的情况下可以运行起来

配置postfix

进入目录 ,备份文

# cd /etc/postfix

# cp main.cf main.cf.bak


提取出非默认的配置

# postconf -n > main.tmp

覆盖文件

# cp main.tmp main.cf


编辑文件

vim main.cf

在最后一行添加如下内容

inet_interfaces = 192.168.0.30,127.0.0.1

myhostname = mail.benet.com

mydomain = benet.com

myorigin = $mydomain

mydestination = $mydomain, $myhostname

home_mailbox = Maildir/


重新启动服器

service postfix restart


配置dovecot


复制配置文件,编辑文件

# cp /etc/dovecot/dovecot.conf /etc/dovecot.conf.bak

# vi /etc/dovecot/dovecot.conf  

在最后一行添加

ssl_disable = yes

protocols = pop3 imap

disable_plaintext_auth = no

mail_location = maildir:~/Maildir  


注意:首先如果有sendmail服务,停止sendmail服务,它会和postfix有冲突的

service sendmail stop

chkconfig --level 2345 sendmail off

重启postfix服务

# service postfix restart

# service httpd restart

设置开机启动项

开放端口:25,80,110,143,3306(实际上建议直接关闭,避免后面又有要改的)

# vim /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 110 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 143 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

开机启动:

# chkconfig httpd on

# chkconfig postfix on


再记得给dovecot加一个日志

根据dovecot的log设定,编辑/etc/dovecot/10-logging.conf


###软件自带的日志存储位置设置# Log file to use for error messages. "syslog" logs to syslog,# /dev/stderr logs to stderr.log_path = /var/log/dovecot.log##不定义info_log_path以及debug_log_path或者留空,便只记录在log_path中# Log file to use for informational messages. Defaults to log_path.info_log_path = /var/log/dovecot_info.log# Log file to use for debug messages. Defaults to info_log_path.debug_log_path = /var/log/dovecot_debug.log#保留为空,以便将调试级别的消息发送到info_log_path##警告和错误消息将转到由log_path指定的文件,而信息性消息转到info_log_path,并将调试消息转到debug_log_path。如果您这样做,请确保您真的在查看错误消息的log_path文件,因为“启动”消息

到这里可以选择一个webmail了,我用的squirrelmail,适合自己折腾和开放给用户。


新建数据库及用户

接下来,我们需要新建一个MySQL用户及一个数据库:

  1. 使用root口令登录MySQL

    mysql -u root -p
  2. 输入root口令

  3. 新建一个数据库,名称叫做mailserver:

    create database mailserver character set utf8;
  4. 输入如下命令以新建一个用户mailserver,并指定密码为mailserver123:

    create user mailserver@'localhost' identified by 'mailserver123';
  5. 将数据库mailserver的所有权限赋给用户mailserver:

    grant all on mailserver.* to mailserver@'localhost' identified by 'mailserver123';
  6. 退出root用户:

    exit;
  7. 使用mailserver用户登录:

    mysql -u mailserver -p
  8. 输入mailserver帐号的口令

  9. 将默认数据库切换为mailserver数据库:

    use mailserver;



新建表格

  1. 输入如下SQL语句以新建virtual_domains表,该表是本地服务器用以接收邮件的域名:

    CREATE TABLE `virtual_domains` (    `id` int(11) NOT NULL auto_increment,    `name` varchar(50) NOT NULL,    PRIMARY KEY (`id`))    ENGINE=InnoDB DEFAULT CHARSET=utf8;
  2. 输入如下SQL语句以新建virtual_users表,该表邮件服务器的终端用户表,记录用户的邮件地址及密码「千万不要保存明文密码」:

    CREATE TABLE `virtual_users` (  `id` int(11) NOT NULL auto_increment,  `domain_id` int(11) NOT NULL,  `password` varchar(106) NOT NULL,  `email` varchar(100) NOT NULL,  PRIMARY KEY (`id`),  UNIQUE KEY `email` (`email`),  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE)  ENGINE=InnoDB DEFAULT CHARSET=utf8;
  3. 输入如下SQL语句以新建virtual_aliases表,该表是邮件服务器别名表「邮件服务器种的别名alias的概念大家可以Google一番」:

    CREATE TABLE `virtual_aliases` (  `id` int(11) NOT NULL auto_increment,  `domain_id` int(11) NOT NULL,  `source` varchar(100) NOT NULL,  `destination` varchar(100) NOT NULL,  PRIMARY KEY (`id`),  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE)  ENGINE=InnoDB DEFAULT CHARSET=utf8

    插入数据

    为了便于查看结果,接下来给上述三张表种插入一些测试数据:

  4. 给virtual_domains表插入测试数据,大致如下:

    insert into virtual_domains(id,name) values(1,'mail.mydomain.com');     insert into virtual_domains(id,name) values(2,'mydomain.com');

    请注意: 
    上述表种id字段是自增列,可以不赋值。但无论如何,接下来的两张表种我们将需要上述表种的逐渐列id的值。比如:我将要添加mydomain.com域名下的邮箱帐号,而mydomain.com在virtual_domains表种的id值为2。

  5. 给virtual_users表添加用户数据:

    insert into virtual_users(id,domain_id,password,email)  values (1,2,ENCRYPT('zhangsan123456', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))),'zhangsan@mydomain.com');insert into virtual_users(id,domain_id,password,email)  values (2,2,ENCRYPT('123456lisi', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))),'lisi@mydomain.com');
  6. 给virtual_aliases表添加别名数据:

    insert into virtual_aliases(id,domain_id,source,destination)  values (1,2,'all@mydomain.com','zhangsan@mydomain.com');insert into virtual_aliases(id,domain_id,source,destination)  values (1,2,'all@mydomain.com','lisi@mydomain.com');

    请注意: 
    通过上述别名表的数据,当有人给all@mydomain.com发送邮件时,系统将自动将邮件转发给zhangsan@mydomain.com和lisi@mydomain.com
    这种场景,在公司内部「发送通知」等情况下适用




测试数据

写几个SQL查询语句查看下结果吧

select * from virtual_domains;  select * from virtual_users;  select * from virtual_aliases;


Postfix的配置

  1. 备份Postfix的配置文件/etc/postfix/main.cf,先!

    cp /etc/postfix/main.cf /etc/postfix/main.cf_backup_20150511

    请注意 
    任何时候,对任何配置进行修改之前,先做好备份总是非常必要的 
    同时,这也是一个非常良好的操作习惯

  2. 使用vi编辑器打开/etc/postfix/main.cf文件

    vi /etc/postfix/main.cf
  3. 打开之后,按下i键进入编辑模式

  4. 鉴于我们没有打算使用Postfix做用户的权限验证「上述几个图种已经展示清楚」,我们将要把Postfix默认的用户验证参数屏蔽,因此请在如下几行前边加入#符号以注释:

    # TLS parameters    #smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem    #smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key  #smtpd_use_tls=yes    #smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache    #smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
  5. 复制如下内容,并将其插入到上述注释代码之后:

    smtpd_tls_cert_file=/etc/dovecot/dovecot.pem  smtpd_tls_key_file=/etc/dovecot/private/dovecot.pem  smtpd_use_tls=yes  smtpd_tls_auth_only = yes  #Enabling SMTP for authenticated users, and handing off authentication to Dovecot  smtpd_sasl_type = dovecot  smtpd_sasl_path = private/auth  smtpd_sasl_auth_enable = yes  smtpd_recipient_restrictions =  permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination

    请注意: 
    上述几个参数的含义,请参照Postfix配置文档

  6. 按照如下方式修改mydestination一行的值:

    mydestination = localhost

    请注意: 
    将mydestination的值修改为localhost,以便Postfix能够通过MySQL表中相关数据决定需要接受/发送邮件的域名,这样更具有通用性

  7. 在文档种加入以下内容,以便告诉Postfix不要使用LDA「Local Delivery Agent」转而使用Dovecot的LMTP完成本地邮件投递:

    #Handing off local delivery to Dovecot's LMTP, and telling it where to store mail  virtual_transport = lmtp:unix:private/dovecot-lmtp
  8. 在文档中加入以下内容,以便告诉Postfix去MySQL数据库种寻找域名、用户帐号密码及邮件别名等信息:

    #Virtual domains, users, and aliases  virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf  virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf  virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
  9. 最终,修改完成以后的/etc/postfix/main.cf文件大致应该如下:

    # See /usr/share/postfix/main.cf.dist for a commented, more complete version    # Debian specific:  Specifying a file name will cause the first  # line of that file to be used as the name.  The Debian default  # is /etc/mailname.  #myorigin = /etc/mailname  smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)  biff = no  # appending .domain is the MUA's job.  append_dot_mydomain = no  # Uncomment the next line to generate "delayed mail" warnings  #delay_warning_time = 4h  readme_directory = no  # TLS parameters    #smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem #smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key  #smtpd_use_tls=yes  #smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache  #smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache  smtpd_tls_cert_file=/etc/dovecot/dovecot.pem  smtpd_tls_key_file=/etc/dovecot/private/dovecot.pem  smtpd_use_tls=yes  smtpd_tls_auth_only = yes  #Enabling SMTP for authenticated users, and handing off authentication to Dovecot  smtpd_sasl_type = dovecot  smtpd_sasl_path = private/auth  smtpd_sasl_auth_enable = yes  smtpd_recipient_restrictions =      permit_sasl_authenticated,      permit_mynetworks,      reject_unauth_destination  # See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for    # information on enabling SSL in the smtp client.      myhostname = host.mydomain.com  alias_maps = hash:/etc/aliases  alias_database = hash:/etc/aliases  myorigin = /etc/mailname  #mydestination = example.com, hostname.mydomain.com,localhost.mydomain.com, localhost  mydestination = localhost  relayhost =          mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128    mailbox_size_limit = 0  recipient_delimiter = +  inet_interfaces = all  #Handing off local delivery to Dovecot's LMTP, and telling it where to store mail  virtual_transport = lmtp:unix:private/dovecot-lmtp  #Virtual domains, users, and aliases  virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf  virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf  virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
  10. 按下ESC键并输入如下内容以保存并退出

    wq!
  11. 新建/etc/postfix/mysql-virtual-mailbox-domains.cf文件并输入如下内容:

    user = mailserver   password = mailserver123  hosts = 127.0.0.1  dbname = mailserver  query = SELECT 1 FROM virtual_domains WHERE name='%s'
  12. 重启Postfix服务

    service postfix restart
  13. 测试上述内容是否正确,如果上述内容配置正确,则如下命令执行后返回结果应该为1:

    postmap -q mydomain.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
  14. 新建/etc/postfix/mysql-virtual-mailbox-maps.cf文件并输入如下内容:

    user = mailserver    password = mailserver123  hosts = 127.0.0.1  dbname = mailserver  query = SELECT 1 FROM virtual_users WHERE email='%s'
  15. 重启Postfix服务

    service postfix restart
  16. 测试上述配置是否正确,如果上述内容配置正确,则如下命令执行后返回结果应该为1:

    postmap -q lisi@mydomain.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
  17. 新建/etc/postfix/mysql-virtual-alias-maps.cf文件并输入如下内容:

    user = mailserver    password = mailserver123  hosts = 127.0.0.1  dbname = mailserver  query = SELECT destination FROM virtual_aliases WHERE source='%s'
  18. 重启Postfix服务

    service postfix restart
  19. 测试上述配置是否正确,如果上述配置正确,则如下命令执行后返回结果应该是之前添加的别名帐号:

    postmap -q all@mydomain.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf
  20. 使用vi编辑器打开/etc/postfix/master.cf文件「请注意修改之前先备份」,找到submission和smtps所在的两行,并将其注释去掉。这样做的目的是允许Postfix通过587和465端口发送邮件

  21. 重启Postfix服务

    service postfix restart


由于字数限制,重要内容在下一篇- -。


Leave a Comment