CentOS 7使用PostfixDovecot及MariaDB搭建邮箱服务器

Posted PhiloChou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CentOS 7使用PostfixDovecot及MariaDB搭建邮箱服务器相关的知识,希望对你有一定的参考价值。

1. 安装软件

1.1 更新yum源

yum update

1.2 排除默认Postfix源

CentOS 7主源中自带的Postfix版本并不支持MariaDB;所以,我们将从CentOS Plus源中进行安装。在此之前,我们在[base][updates]源中过滤掉Postfix,防止版本更新时,被不支持MariaDB的Postfix覆盖。

文件:/etc/yum.repos.d/CentOS-Base.repo

[base]
name=CentOS-$releasever - Base
exclude=postfix

#released updates
[updates]
name=CentOS-$releasever - Updates
exclude=postfix

1.3 安装必须的软件

yum --enablerepo=centosplus install postfix
yum install dovecot mariadb-server dovecot-mysql

以上安装了Postfix、Dovecot及MariaDB
下面,我们配置MariaDB数据库

2. 设置MariaDB

2.1 让MariaDB随系统启动

systemctl enable mariadb.service
/bin/systemctl start mariadb.service

2.2 初始化MariaDB

执行mysql_secure_installation命令进行初始化。在初始化过程中,建议我们修改MariaDB的root密码、移除匿名账号、禁止root远端登录及移除测试数据库,最后会重新加载权限表。

mysql_secure_installation

2.3 打开MariaDB控制台

mysql -u root -p

2.4 创建邮箱服务数据库mail

CREATE DATABASE mail;
USE mail;

2.5 创建邮箱管理员账号mail_admin

创建后,我们为他分配mail数据库的读写权限。

注意:将下面语句中的mail_admin_password替换为您自己的强密码

GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';
FLUSH PRIVILEGES;

2.6 创建虚拟域(virtual domains)表:

CREATE TABLE domains (
    domain varchar(50) NOT NULL,
    PRIMARY KEY (domain)
);

2.7 创建邮件转发(mail forwarding)表

CREATE TABLE forwardings (
    source varchar(80) NOT NULL,
    destination TEXT NOT NULL,
    PRIMARY KEY (source)
);

2.8 创建用户(users)表

CREATE TABLE users (
    email varchar(80) NOT NULL,
    password varchar(20) NOT NULL,
    PRIMARY KEY (email)
);

2.9 创建邮件传输(transports)表

CREATE TABLE transport (
    domain varchar(128) NOT NULL default '',
    transport varchar(128) NOT NULL default '',
    UNIQUE KEY domain (domain)
);

2.10 退出MariaDB控制台

quit

2.11 绑定MariaDB到本机(127.0.0.1)

文件:/etc/my.cnf

[mysqld]
bind-address=127.0.0.1

2.12 重启数据库

/bin/systemctl restart mariadb.service

3. 配置Postfix并关联MariaDB

注意:下面的过程中,请将mail_admin_password替换为您在上面的操作中所设置的密码。

3.1 创建虚拟域配置文件

文件:/etc/postfix/mysql-virtual_domains.cf

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain='%s'
hosts = 127.0.0.1

3.2 创建虚拟转发配置文件

文件:/etc/postfix/mysql-virtual_forwardings.cf

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT destination FROM forwardings WHERE source='%s'
hosts = 127.0.0.1

3.3 创建虚拟邮箱配置文件

文件:/etc/postfix/mysql-virtual_mailboxes.cf

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s'
hosts = 127.0.0.1

3.4 创建虚拟邮箱映射文件

文件:/etc/postfix/mysql-virtual_email2email.cf

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT email FROM users WHERE email='%s'
hosts = 127.0.0.1

3.5 修改以上各配置文件的权限

chmod o= /etc/postfix/mysql-virtual_*.cf
chgrp postfix /etc/postfix/mysql-virtual_*.cf

3.6 创建系统用户及组,用来处理邮件。并建立虚拟邮箱的存放路径

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m

3.7 完成剩余的Postfix配置。

注意:用自己的主机名替换下面的server.example.com

postconf -e 'myhostname = server.example.com'
postconf -e 'mydestination = localhost, localhost.localdomain'
postconf -e 'mynetworks = 127.0.0.0/8'
postconf -e 'inet_interfaces = all'
postconf -e 'message_size_limit = 30720000'
postconf -e 'virtual_alias_domains ='
postconf -e 'virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'
postconf -e 'virtual_mailbox_base = /home/vmail'
postconf -e 'virtual_uid_maps = static:5000'
postconf -e 'virtual_gid_maps = static:5000'
postconf -e 'smtpd_sasl_type = dovecot'
postconf -e 'smtpd_sasl_path = private/auth'
postconf -e 'smtpd_sasl_auth_enable = yes'
postconf -e 'broken_sasl_auth_clients = yes'
postconf -e 'smtpd_sasl_authenticated_header = yes'
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination' postconf -e 'smtpd_use_tls = yes'
postconf -e 'smtpd_tls_cert_file = /etc/pki/dovecot/certs/dovecot.pem'
postconf -e 'smtpd_tls_key_file = /etc/pki/dovecot/private/dovecot.pem'
postconf -e 'virtual_create_maildirsize = yes'
postconf -e 'virtual_maildir_extended = yes'
postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'
postconf -e 'virtual_transport = dovecot'
postconf -e 'dovecot_destination_recipient_limit = 1'

3.8 编辑/etc/postfix/master.cf文件,在文件底部添加Dovecot服务

文件:/etc/postfix/master.cf

dovecot   unix  -       n       n       -       -       pipe
    flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f $sender -d $recipient

3.9 配置Postfix随系统启动

systemctl enable postfix.service
/bin/systemctl start postfix.service

至此我们完成了Postfix的全部配置

4. 配置Dovecot

4.1 备份/etc/dovecot/dovecot.conf文件

mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf-backup

4.2 新建配置文件

文件:/etc/dovecot/dovecot.conf

注意:替换第37行的example.com为您自己的域

protocols = imap pop3
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_location = maildir:/home/vmail/%d/%n/Maildir

ssl_cert_file = /etc/pki/dovecot/certs/dovecot.pem
ssl_key_file = /etc/pki/dovecot/private/dovecot.pem

namespace 
    type = private
    separator = .
    prefix = INBOX.
    inbox = yes


service auth 
    unix_listener auth-master 
        mode = 0600
        user = vmail
    

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

user = root


service auth-worker 
    user = root


protocol lda 
    log_path = /home/vmail/dovecot-deliver.log
    auth_socket_path = /var/run/dovecot/auth-master
    postmaster_address = postmaster@example.com


protocol pop3 
    pop3_uidl_format = %08Xu%08Xv


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


userdb 
    driver = static
    args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes

4.3 Dovecot与MariaDB关联

我们需要创建/etc/dovecot/dovecot-sql.conf.ext文件,并加入如下内容:

注意:替换mail_admin_password

文件:/etc/dovecot/dovecot-sql.conf.ext

driver = mysql
connect =
host=127.0.0.1
dbname=mail
user=mail_admin
password=mail_admin_password
default_pass_scheme = CRYPT
password_query = SELECT email as user, password FROM users WHERE email='%u';

4.4 修改以上配置文件的权限

chgrp dovecot /etc/dovecot/dovecot-sql.conf.ext
chmod o= /etc/dovecot/dovecot-sql.conf.ext

4.5 配置Dovecot随系统启动

systemctl enable dovecot.service
/bin/systemctl start dovecot.service

4.6 检查Dovecot的启动日志是否正常

文件:/var/log/maillog

Mar 18 17:10:26 localhost postfix/postfix-script[3274]: starting the Postfix mail system Mar 18 17:10:26 localhost postfix/master[3276]: daemon started -- version 2.10.1, configuration /etc/postfix Mar 18 17:12:28 localhost dovecot: master: Dovecot v2.2.10 starting up for imap, pop3 (core dumps disabled)

4.7 使用telnet工具测试POP3

yum install telnet
telnet localhost pop3

4.8 终端应该会出现如下提示

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Dovecot ready.

4.9 输入quit退出控制台。

quit

至此,我们完成了Dovecot配置。下一步,我们要确保别名是否正常配置。

5. 配置邮箱别名

5.1 编辑文件/etc/aliases,确保postmasterroot按照您的信息进行配置:

文件:/etc/aliases

postmaster: root
root: postmaster@example.com

5.2 编辑别名,并重启Postfix

newaliases
/bin/systemctl restart postfix.service

至此,我们完成了别名配置。下一步,我们来测试Postfix是否正常。

6. 测试Postfix

6.1 测试Postfix的SMTP-AUTH和TLS

telnet localhost 25

6.2 保持连接,并输入如下命令

ehlo localhost

6.3 您将会看到类似信息

250-hostname.example.com
250-PIPELINING
250-SIZE 30720000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN
250-AUTH=PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

6.4 输入quit退出测试。下一步,我们创建数据库用来管理域及用户。

7 创建测试域及用户

注意:开始继续前,请先作好域名的DNS及MX相关设置。

在下面的例子中,我们假设使用”example.com”这个域,并创建”sales@example.com”邮箱

7.1 打开MariaDB控制台

mysql -u root -p

7.2 切换到mail数据库,创建域及用户

注意:下面的password请用强密码

USE mail;
INSERT INTO domains (domain) VALUES ('example.com');
INSERT INTO users (email, password) VALUES ('sales@example.com', ENCRYPT('password'));
quit

7.3 使用mailx小工具发送测试邮件

yum install mailx
mailx sales@example.com

使用Ctrl+D完成消息。Cc:一栏我们可以留空。执行完后,我们的邮件系统会自动创建一个新的域和邮箱用户。

8. 检查日志

上面的发送测试完成后,我们需要检查一下日志,看看邮件是否可以正常送达。

8.1 检查/var/log/maillog。我们应该会看到类似的内容:

文件:/var/log/maillog

Mar 18 17:18:47 localhost postfix/cleanup[3427]: B624062FA: message-id=<20150318171847.B624062FA@example.com>
Mar 18 17:18:47 localhost postfix/qmgr[3410]: B624062FA: from=<root@example.com>, size=515, nrcpt=1 (queue active)
Mar 18 17:18:47 localhost postfix/pipe[3435]: B624062FA: to=<sales@example.com>, relay=dovecot, delay=0.14, delays=0.04/0.01/0/0.09, dsn=2.0.0, $
Mar 18 17:18:47 localhost postfix/qmgr[3410]: B624062FA: removed

8.2 检查Dovecot日志

文件:/home/vmail/dovecot-deliver.log

deliver(<sales@example.com>): 2011-01-21 20:03:19 Info: msgid=<<20110121200319.E1D148908@hostname.example.com>>: saved mail to INBOX

下面,我们使用邮箱客户端进行测试。

9. 测试邮箱客户端

9.1 测试sales@example.com的邮箱

cd /home/vmail/example.com/sales/Maildir
find

如果系统禁用了root账户,可能导致无法进入vmail目录。
可以使用su root临时提升权限

9.2 我们可以看到如下信息:

.
./dovecot-uidlist
./cur
./new
./new/1285609582.P6115Q0M368794.li172-137
./dovecot.index
./dovecot.index.log
./tmp

9.3 使用linux下的邮箱客户端mutt进行测试

yum install mutt
mutt -f .

如果被问到是否需要创建root邮箱,可以随意回答

9.4 查看收件箱中的邮件

如果在收件箱中看到邮件,说明Postfix、Dovecot、和MySQL都已经配置成功了!输入q退出mutt

10. 更多内容

下面是一些官方的文档。


参考:Email with Postfix, Dovecot and MariaDB on CentOS 7 - Linode Guides & Tutorials

以上是关于CentOS 7使用PostfixDovecot及MariaDB搭建邮箱服务器的主要内容,如果未能解决你的问题,请参考以下文章

Centos 7 安装Supervisor及使用

CentOS 7磁盘分区及文件系统管理

CentOS 7 安装Mono及Jexus

CentOS 7 源码包安装SVN及使用

Centos6.7或7.2系统中 github配置及基本使用

CentOS 7下安装php-redis扩展及简单使用