postfix +dovecote+mysql创建邮箱服务器

参考文章   https://www.cnblogs.com/renweihang/p/7988591.html

建议先看上面的文章,因为人家写的东西比我写的有意思,而且知识点也多。

我的环境是  ubuntu16.0.4 部分设置可能和上面文章里的配置不太一样。并且没有开启SSL https认证。

 First,你需要有一个域名。如果没有域名你也只能玩本地的邮箱搭建了,我由于没钱买域名,所以只能玩本地的。当然你也可以搭建个dsn服务器,搞个局域网可用的邮箱系统。

sudo vim /etc/hosts

然后添加一行  127.0.0.1      localhost.localdomain。  

vim /etc/hostname

修改为  localhost.localdomain。

Second,mysql 安装配置

apt-get install mysql-server

安装完成以后,新建数据库及用户

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. 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. 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. 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. 4.给virtual_domains表插入测试数据,大致如下:

    insert into virtual_domains(id,name) values(1,'mail.localhost.localdomain');     
    insert into virtual_domains(id,name) values(2,'localhost.localdomain');

    请注意: 
    上述表种id字段是自增列,可以不赋值。但无论如何,接下来的两张表种我们将需要上述表种的逐渐列id的值。比如:我将要添加localhost.localdomain域名下的邮箱帐号,而localhost.localdomain在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@localhost.localdomain');
    
    
    insert into virtual_users(id,domain_id,password,email)  
    values (2,2,ENCRYPT('123456lisi', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))),'lisi@localhost.localdomain');
  6. 5.给virtual_aliases表添加别名数据:

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

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

测试数据

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

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

Postfix安装及配置

Postfix是邮件发送的核心服务器,所有向内、向外投递的邮件都需要经过Postfix通过SMTP协议完成。接下来的内容,大家需要修改Postfix相关的一些参数,它们是:

  • 告诉Postfix如何连接MySQL数据库,并让Postfix通过数据库种的表确定收发邮件的域名、用户帐号及密码、邮件别名等
  • 告诉Postfix将收到的邮件转发给Dovecot的LMTP服务以完成本地投递
  • 告诉Postfix所有的连接都需要STARTTLS加密,如果有必要「废话啊,当然必须这样」
  • 开放本地端口25、465、587之一或全部

Postfix的安装及配置

Postfix是邮件发送的核心服务器,所有向内、向外投递的邮件都需要经过Postfix通过SMTP协议完成。接下来的内容,大家需要修改Postfix相关的一些参数,它们是:

  • 告诉Postfix如何连接MySQL数据库,并让Postfix通过数据库种的表确定收发邮件的域名、用户帐号及密码、邮件别名等
  • 告诉Postfix将收到的邮件转发给Dovecot的LMTP服务以完成本地投递
  • 告诉Postfix所有的连接都需要STARTTLS加密,如果有必要「废话啊,当然必须这样」
  • 开放本地端口25、465、587之一或全部

Postfix的安装

apt-get install postfix postfix-mysql
安装过程中需要选择Postfix的类型,请选择Internet Site

Postfix的配置

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

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

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

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

    2.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. 3.按照如下方式修改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. 4.最终,修改完成以后的/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.localhost.localdomain  
    alias_maps = hash:/etc/aliases  
    alias_database = hash:/etc/aliases  
    myorigin = /etc/mailname  
    #mydestination = example.com, hostname.mydomain.com,localhost.localdomain.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. 5.新建/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. 6.重启Postfix服务

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

    postmap -q localhost.localdomain mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
    
    8.新建/etc/postfix/mysql-virtual-mailbox-maps.cf文件并输入如下内容:
  14. user = mailserver    
    password = mailserver123  
    hosts = 127.0.0.1  
    dbname = mailserver  
    query = SELECT 1 FROM virtual_users WHERE email='%s'
  15. 9.重启Postfix服务

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

    postmap -q lisi@localhost.localdomain mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
  17. 11.新建/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. 12.重启Postfix服务

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

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

  21. 15.重启Postfix服务

    service postfix restart

搞定,Postfix服务器应该配置完成了。相信到这里的时候,已经吓走了90%以上的朋友,剩下的10%朋友们,你们是好样的。

Dovecot安装及配置

Dovecot在本例中充当IMAP、POP服务器的角色,同时它也将负责用户登录时用户身份的验证「Dovecot会将真正的验证工作交给MySQL处理」。因为使用SSL,Dovecot将会使用993「IMAP协议」及995「POP协议」与外界交流,若服务器有iptable之类的玩意儿,请开放相关端口。

这部分的内容配置起来相对简单,但是需要配置的文件繁多。大体上,我们需要配置如下的信息:

  1. 开启Dovecot的IMAP、POP3、LMTP协议
  2. 告知Dovecot本地邮件的投档路径
  3. 连接Dovecot和MySQL数据库以验证用户身份
  4. 配置SSL加密相关信息

Dovecot的安装

通过如下命令安装Dovecot最新版:

apt-get install dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql

Dovecot的配置

需要修改的配置文件有:

  • /etc/dovecot/dovecot.confDovecot的主配置文件
  • /etc/dovecot/conf.d/10-mail.confDovecot将要操作的磁盘路径相关配置信息
  • /etc/dovecot/conf.d/10-auth.conf用户验证相关配置信息
  • /etc/dovecot/conf.d/auth-sql.conf.extSQL-Type验证相关配置信息
  • /etc/dovecot/dovecot-sql.conf.extDovecot与数据库连接相关配置信息
  • /etc/dovecot/conf.d/10-master.confDovecot本地socket相关配置信息
  • /etc/dovecot/conf.d/10-ssl.conf关于SSL的相关配置信息

请注意: 
在修改上述文件之前,请一定先做好备份以方便恢复

修改/etc/dovecot/dovecot.conf文件

使用vi编辑器打开/etc/dovecot/dovecot.conf文件并在文件种加入如下内容:

!include conf.d/*.conf

# Enable installed  
protocols!include_try /usr/share/dovecot/protocols.d/*.protocol  
protocols = imap pop3 lmtp

如果以上内容已经存在,只需要把该行的#号去掉即可 
上述内容大致的意思是:告诉Dovecot启用所有.conf文件;并开启Dovecot的imap、pop3、lmtp等相关协议使之正常工作

修改/etc/dovecot/conf.d/10-mail.conf文件

打开文件并找到mail_location相关信息,将其指定到本地磁盘的某个路径,这个路径将来会存放收到的邮件,如下所示:

mail_location = maildir:/var/mail/vhosts/%d/%n

同时,找到文件中mail_privileged_group相关信息并将起修改为:

mail_privileged_group = mail

保存文件并退出

在命令行种输入如下内容以查看/var/mail路径的权限:

ls -ld /var/mail

显示的内容大致应该是:

drwxrwsr-x 2 root mail 4096 May  11 15:08 /var/mail

创建/var/mail/vhosts/文件夹给每个需要启用的域名:

mkdir -p /var/mail/vhosts/mydomain.com

接下来修改一下/var/mail/目录的权限,使vmail能够访问:

chown -R xxxA:xxxB /var/mail

xxxA 和xxxB分别代表当前用户和用户组

修改/etc/dovecot/conf.d/10-auth.conf文件

找到文件中disable_plaintext_auth并取消注释

disable_plaintext_auth = yes

找到文件中auth_mechanisms并将其修改为如下值:

auth_mechanisms = plain login

默认情况下,Dovecot是允许Ubuntu系统用户登录使用的,我们需要将其禁用。找到文件种如下内容并将其注释:

#!include auth-system.conf.ext

开启Dovecot的MySQL支持,取消!include auth-sql.conf.ext的注释符号:

#!include auth-system.conf.ext  
!include auth-sql.conf.ext  
#!include auth-ldap.conf.ext  
#!include auth-passwdfile.conf.ext  
#!include auth-checkpassword.conf.ext  
#!include auth-vpopmail.conf.ext  
#!include auth-static.conf.ext

修改/etc/dovecot/conf.d/auth-sql.conf.ext文件

在文件中加入如下内容:

passdb {  
    driver = sql  
    args = /etc/dovecot/dovecot-sql.conf.ext  
}  

userdb {  
    driver = static  
    args = uid=xxxA gid=xxxB home=/var/mail/vhosts/%d/%n  
}

uid 用户   gid  用户组

修改/etc/dovecot/dovecot-sql.conf.ext文件

取消文件中driver行的注释,并将其修改为如下:

driver = mysql

取消文件中connect行的注释,并将其修改为如下:

connect = host=127.0.0.1 dbname=mailserver user=mailserver password=mailserver123

取消文件中default_pass_scheme行的注释,并将其修改为如下:

default_pass_scheme = SHA512-CRYPT

取消文件中password_query行的注释,并将起修改为如下:

password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

保存退出

在命令行种输入如下内容以修改目录权限:

chown -R xxxA:dovecot /etc/dovecot

chmod -R o-rwx /etc/dovecot

修改/etc/dovecot/conf.d/10-master.conf文件

打开文件做如下修改「通过将端口设置为0,以禁用非SSL加密的IMAP和POP3协议」:

service imap-login {  
    inet_listener imap {  
        port = 143  
    }  
    ...  
}  

service pop3-login {  
    inet_listener pop3 {  
        port = 110 
    }  
    ...  
}

找到文件中的service lmtp并将其修改如下:

service lmtp {  
        unix_listener /var/spool/postfix/private/dovecot-lmtp {  
        mode = 0600  
        user = postfix  
        group = postfix  
  }  

  # Create inet listener only if you can't use the above UNIX socket  
  #inet_listener lmtp {  
        #Avoid making LMTP visible for the entire internet  
        #address =  
        #port =  
        #}  
 }

找到文件中service auth并将其内容修改如下:

service auth {  
    # auth_socket_path points to this userdb socket by default. It's typically  
    # used by dovecot-lda, doveadm, possibly imap process, etc. Its default  
    # permissions make it readable only by root, but you may need to relax these  
    # permissions. Users that have access to this socket are able to get a list  
    # of all usernames and get results of everyone's userdb lookups.  

    unix_listener /var/spool/postfix/private/auth {  
            mode = 0666  
            user = postfix  
            group = postfix  
    }  

    unix_listener auth-userdb {  
            mode = 0600  
            user = xxxA  
            #group =  
    }  

    # Postfix smtp-auth  
    #unix_listener /var/spool/postfix/private/auth {  
    #       mode = 0666  
    #}  

    # Auth process is run as this user.  
    user = dovecot  
}

找到文件中service auth-worker内容并修改如下:

service auth-worker {  
    # Auth worker process is run as root by default, so that it can access  
    # /etc/shadow. If this isn't necessary, the user should be changed to  
    # $default_internal_user.  

    user = xxxA  
}

修改/etc/dovecot/conf.d/10-ssl.conf文件

ssl = no

重新启动Dovecot服务:

service dovecot restart

测试邮件服务器是否正常

设置一个帐号,可以向MySQL对应的表中插入数据,接下来使用邮件客户端来测试一下。推荐使用Thunderbird邮件客户端或者Foxmail客户端等。请注意以下内容:

  • 邮箱的全称「包括后面的@localhost.localdomain」将作为用户名
  • 邮箱密码是MySQL数据库种对应邮箱的密码
  • 服务器相关接口是否全部开放?993、995、25等
  • 邮件收发的所有协议,包括IMAP、POP3、SMTP全部都需要开启SSL加密

配置好客户端之后即可连接获取、发送邮件。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值