在centos 7上用postfix,dovecot,mariaDB配置邮箱

安装方法



Postfix邮件传输代理(MTA)是一款高性能的开源电子邮件服务器系统。本指南将帮助您在CentOS 7 Linode上运行Postfix,使用Dovecot进行IMAP / POP3服务,并使用MariaDB(一种替代MySQL的插件)存储有关虚拟域和用户的信息。
在使用本指南之前,请确保您已遵循入门指南并设置您的主机名。还要确保iptables 防火墙不阻止任何标准邮件端口(25,465,587,110,995,143993)。如果使用不同形式的防火墙,请确认它没有阻塞任何所需的端口。


注意
本指南中的步骤需要root权限。一定要以root身份或sudo前缀运行以下步骤。有关权限的更多信息,请参阅我们的用户和组指南。


安装所需的程序包



安装未完成的软件包更新:



yum update


修改yum库



主要CentOS存储库中包含的Postfix版本不包含对MariaDB的支持;因此,您需要从CentOS Plus存储库安装Postfix。在此之前,请向Postfix软件包[base]和软件[updates]仓库添加排除项,以防止它被没有MariaDB支持的更新覆盖:
File excerpt: /etc/yum.repos.d/CentOS-Base.repo

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

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


安装所需的软件包:



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


这将安装Postfix邮件服务器,MariaDB数据库服务器,Dovecot IMAPPOP守护程序以及提供与身份验证相关的服务的多个支持包。
接下来,建立一个MariaDB数据库来处理虚拟域和用户。

设置MariaDB为虚拟域名和用户



配置MariaDB以在启动时启动,然后启动MariaDB



systemctl enable mariadb.service
systemctl start mariadb.service


配置MariaDB安全



运行mysql_secure_installation。您将有机会更改MariaDB root密码,删除匿名用户帐户,在localhost外禁用root登录,删除测试数据库并重新加载权限表。建议您对这些选项回答“是”:

mysql_secure_installation


启动MariaDB



mysql -u root -p


创建数据库



为您的邮件服务器创建一个数据库并切换到该数据库:

CREATE DATABASE mail;
USE mail;


修改数据库权限



创建一个名为的邮件管理用户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;


创建domains表:



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


创建一个表forwardings来处理邮件转发:



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


创建users表:



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


创建一个transport表:



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


退出MariaDB



quit


监听本地端口



通过编辑/etc/my.cnf将MariaDB绑定到本地主机(127.0.0.1),并将以下内容添加到[mysqld]文件部分:
File excerpt: /etc/my.cnf

bind-address=127.0.0.1


这是Postfix能够与数据库服务器进行通信所必需的。如果MariaDB设置为监听另一个IP地址(例如内部IP),则需要127.0.0.1Postfix配置步骤中替换此IP地址来代替。这是不建议在可公开访问的IP地址,运行MariaDB的。

重新启动数据库服务器:



systemctl restart  mariadb.service


接下来,执行额外的Postfix配置来设置与数据库的通信。

配置Postfix以使用MariaDB




注意
在接下来的四个步骤,取代mail_admin_passwordmail_admin密码输入。


创建虚拟域配置文件



为postfix创建一个虚拟域配置文件,名为/etc/postfix/mysql-virtual_domains.cf
File: /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


创建虚拟转发配置文件



Postfix创建一个虚拟转发文件,名为/etc/postfix/mysql-virtual_forwardings.cf
File: /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


创建虚拟邮箱配置文件



为Postfix创建一个虚拟邮箱配置文件,名为/etc/postfix/mysql-virtual_mailboxes.cf
File: /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


创建虚拟邮件映射文件配置文件



Postfix创建一个虚拟的电子邮件映射文件,名为/etc/postfix/mysql-virtual_email2email.cf
File: /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


为这些配置文件设置适当的权限和所有权:



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


创建邮件用户和组



为邮件处理创建一个用户和组。所有虚拟邮箱都将存储在该用户的主目录下:

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


配置postfix main.cf文件



完成Postfix配置所需的其余步骤。请确保server.example.com使用Linode的完全合格域名替换。如果您计划使用您自己的SSL证书和密钥,请/etc/pki/dovecot/private/dovecot.pem用适当的路径替换:

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'



注意
输入完以上命令后建议先检查一下,文件路径为/etc/postfix/main.cf,检查完值后再用postfix自带命令postfix check检查,排查错误。


编辑postfix master.cf文件



编辑该文件/etc/postfix/master.cf并将Dovecot服务添加到该文件的底部:

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


编辑postfix master.cf文件



取消注释从submissionand 开始的两行和在每smtps行之后开始的行块-o
/etc/postfix/master.cf文件的第一部分应该类似于以下内容:
File excerpt: /etc/postfix/master.cf

#
# Postfix master process configuration file. For details on the format
# of the file, see the master(5) manual page (command: "man 5 master").
#
# Do not forget to execute "postfix reload" after editing this file.
#
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================
smtp inet n - - - - smtpd
#smtp inet n - - - 1 postscreen
#smtpd pass - - - - - smtpd
#dnsblog unix - - - - 0 dnsblog
#tlsproxy unix - - - - 0 tlsproxy
submission inet n - - - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
smtps inet n - - - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING


Postfix配置为在引导时启动并首次启动服务:



systemctl enable postfix.service
systemctl start postfix.service


这完成了Postfix的配置。

配置Dovecot



移至/etc/dovecot/dovecot.conf备份文件:



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


配置dovecot dovecot.conf文件



将以下内容复制到现在为空的dovecot.conf文件中。example.com在第37行替换系统的域名,并在第5行和第6行替换您的ssl密钥和证书(如果有的话):
File: /etc/dovecot/dovecot.conf

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

ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
ssl_key = </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
}


创建dovecot-sql.conf.ext文件



MariaDB将用于存储密码信息,因此/etc/dovecot/dovecot-sql.conf.ext必须创建。将以下内容插入到文件中,确保mail_admin_password使用您的邮件密码进行替换:
File: /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';


修改文件权限



通过更改权限来限制对文件的访问,以允许dovecot组中的用户访问该文件,同时拒绝访问他人:

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


配置Dovecot以在启动时启动,并首次启动它:



systemctl enable dovecot.service
systemctl start dovecot.service


检查日志文件



现在检查/var/log/maillog以确保Dovecot无误地启动。您的日志应该有类似于以下内容的行:
File excerpt: /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)


测试您的POP3服务器以确保它正常运行:



yum install telnet
telnet localhost pop3


终端应输出与以下类似的结果:



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


退出telnet



输入命令quit返回到你的shell。这完成了Dovecot配置。接下来,您将确保别名配置正确。

配置邮件别名



编辑文件/etc/aliases



编辑文件/etc/aliases,确保为您的组织正确设置postmasterroot指令:
File: /etc/aliases

postmaster: root
root: postmaster@example.com


更新别名并重新启动Postfix



newaliases
systemctl restart postfix.service


这完成了别名配置。接下来,测试Postfix以确保它正常运行。

测试Postfix



测试PostfixSMTP-AUTHTLS



telnet localhost 25


在仍然连接时,发出以下命令:



ehlo localhost


您应该看到类似于以下内容的输出:



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


退出telnet



发出命令quit以终止Postfix连接。
接下来,用域和电子邮件用户填充MariaDB数据库。

设置和测试域和用户




注意
在继续之前,请修改您希望处理电子邮件的任何域的DNS记录,方法是添加指向邮件服务器的完全限定域名的MX记录。如果您希望处理该电子邮件的域的MX记录已存在,请删除它们或将它们设置为比邮件服务器更高的优先级编号。较小的优先级数字表示邮件传递的优先级较高,“0”是最高优先级。


在以下示例中,MariaDB shell用于添加对example.com域的支持,该域名将具有名为sales的电子邮件帐户。

登录到MariaDB



mysql -u root -p


创建用户



切换到mail数据库,添加对您的域的支持,并创建一个电子邮件帐户。请务必用您选择的电子邮件和强大的密码替换example.com您的域名:sales@example.com password

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


发送测试邮件



在访问任何新创建的电子邮件帐户之前,需要发送一条测试消息来创建该用户的邮箱:

yum install mailx
mailx sales@example.com


按下Ctrl+D即可完成信息。这将完成新域和电子邮件用户的配置。


注意
考虑到在单个邮件系统上托管大量虚拟域的可能性,电子邮件地址的用户名部分(即@签名之前)不足以向邮件服务器进行身份验证。当电子邮件用户向服务器进行身份验证时,他们必须向其电子邮件客户端提供以上创建的整个电子邮件地址作为其用户名


检查你的日志



测试邮件发送后,请检查邮件日志以确保邮件已发送。

检查邮件日志



检查maillog位于/var/log/maillog。您应该看到类似于以下内容的内容:
File excerpt: /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


检查dovecot日志



检查位于的Dovecot交付日志/home/vmail/dovecot-deliver.log。内容应如下所示:
File excerpt: /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


现在您可以测试以查看您的电子邮件服务器的用户将使用其电子邮件客户端看到的内容。

测试邮箱



测试目录



要测试sales@example.com邮箱,请导航到邮箱目录/home/vmail/example.com/sales/Maildir并发出以下命令:

find


您应该看到类似于以下内容的输出:



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


客户端测试



使用邮件客户端测试maillbox。对于这个测试,推荐使用mutt。如果默认情况下未安装,请使用安装yum install mutt,然后运行:

mutt -f .


系统可能会提示您创建根邮箱。这不是必需的。

检查邮件客户端是否正常



如果收件箱中有电子邮件,则PostfixDovecotMySQL已成功配置!要退出muttq
mutt

更多信息



您可能希望查阅以下资源以获取有关此主题的其他信息。尽管提供这些内容是希望它们有用,但请注意,我们不能保证外部托管材料的准确性或及时性。
- Postfix MySQL Howto
- Postfix SASL Howto
- Dovecot文档Wiki
- MySQL文档
也可以看看
- 在CentOS 6上使用Postfix,Dovecot和MySQL发送邮件
- 在CentOS 5上用Postfix,Dovecot和MySQL发送电子邮件 - 不推荐使用
- 在Debian 8上使用Postfix配置SPF和DKIM
- 在Ubuntu 16.04上安装Roundcube
- 如何在CentOS 7上安装Asterisk

安装过程中遇到的问题



权限问题



问题



具体报错如下:

2017-04-12T18:42:01.411483+02:00 serv1 postfix/proxymap[29822]: error: open /etc/postfix/mysql-virtual_forwardings.cf: Permission denied
2017-04-12T18:42:01.412600+02:00 serv1 postfix/proxymap[29822]: error: open /etc/postfix/mysql-virtual_email2email.cf: Permission denied
2017-04-12T18:42:01.412800+02:00 serv1 postfix/proxymap[29822]: error: open /etc/postfix/mysql-virtual_mailboxes.cf: Permission denied
2017-04-12T18:42:01.412959+02:00 serv1 postfix/proxymap[29822]: error: open /etc/postfix/mysql-virtual_sender_login_maps.cf: Permission denied


查看文件权限

# ls -la /etc/postfix/mysql-virtual_*
-rw-r----- 1 root postfix 231 Apr 12 18:27 /etc/postfix/mysql-virtual_client.cf
-rw-r----- 1 root postfix 221 Apr 12 18:27 /etc/postfix/mysql-virtual_domains.cf
-rw-r----- 1 root postfix 218 Apr 12 18:27 /etc/postfix/mysql-virtual_email2email.cf
-rw-r----- 1 root postfix 317 Apr 12 18:27 /etc/postfix/mysql-virtual_forwardings.cf
-rw-r----- 1 root postfix 216 Apr 12 18:27 /etc/postfix/mysql-virtual_gids.cf
-rw-r----- 1 root postfix 288 Apr 12 18:27 /etc/postfix/mysql-virtual_mailboxes.cf
-rw-r----- 1 root postfix 346 Apr 12 18:27 /etc/postfix/mysql-virtual_policy_greylist.cf
-rw-r----- 1 root postfix 252 Apr 12 18:27 /etc/postfix/mysql-virtual_recipient.cf
-rw-r----- 1 root postfix 224 Apr 12 18:27 /etc/postfix/mysql-virtual_relaydomains.cf
-rw-r----- 1 root postfix 230 Apr 12 18:27 /etc/postfix/mysql-virtual_relayrecipientmaps.cf
-rw-r----- 1 root postfix 249 Apr 12 18:27 /etc/postfix/mysql-virtual_sender.cf
-rw-r----- 1 root postfix 320 Apr 12 18:27 /etc/postfix/mysql-virtual_sender_login_maps.cf
-rw-r----- 1 root postfix 227 Apr 12 18:27 /etc/postfix/mysql-virtual_transports.cf
-rw-r----- 1 root postfix 217 Apr 12 18:27 /etc/postfix/mysql-virtual_uids.cf


解决方案



postfix set-permissions


参考


  1. Email with Postfix, Dovecot and MariaDB on CentOS 7

评论

此博客中的热门博文

certbot cloudflare申请通用域名证书

Centos7 安装 PHP7