【在用】Postfix + Dovecot + SSL + MySQL邮件服务器配置
本篇教程是书接上文,都是在上篇教程《Postfix + Dovecot + SSL邮件服务器配置》的基础之上继续操作,如果不需要MySQL的虚拟用户方式则不必继续,上一篇教程足以。
MySQL数据库安装
自行安装,这里略过,如果需要可以参考这篇文章,虽然是CentOS的,但是都差不多,也是博主以前安装的记录,只不过CentOS落幕后博主“转战”Debian罢了。
在MySQL中创建数据库postfix,并创建下面3张表
提示:表名和字段名并不是固定的,只需要和配置中的一致即可
1. 新建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=utf8mb4;
2. 新建virtual_users
表,该表邮件服务器的终端用户表,记录用户的邮件地址及密码
CREATE TABLE virtual_users (
id int(11) NOT NULL auto_increment,
domain_id int(11) NOT NULL,
email varchar(100) NOT NULL,
password varchar(106) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY email (email),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 新建virtual_aliases
表,该表是邮件服务器别名表
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=utf8mb4;
创建测试数据
1. 给virtual_domains
表插入测试数据,大致如下
INSERT INTO virtual_domains(name) VALUE('kyzy.cc');
INSERT INTO virtual_domains(name) VALUE('mail.kyzy.cc');
2. 给virtual_users
表添加用户数据,加密方式就采用md5
了
提示:也可以是其它的,之需要在后面的配置文件中选择对应的加密方式就行
INSERT INTO virtual_users(domain_id, email, password) VALUE(1, '[email protected]', md5('zhangsan123'));
INSERT INTO virtual_users(domain_id, email, password) VALUE(1, '[email protected]', md5('lisi456'));
3. 给virtual_aliases
表添加别名数据
INSERT INTO virtual_aliases(domain_id, source, destination) VALUE(1, '[email protected]', '[email protected]');
INSERT INTO virtual_aliases(domain_id, source, destination) VALUE(1, '[email protected]', '[email protected]');
注意:通过上述别名表的数据,当有人给[email protected]
发送邮件时,系统将自动将邮件转发给[email protected]
和[email protected]
,这种场景,在公司内部“发送通知”等情况下适用
调整Postfix的配置
注意:建议提前备份原来的配置文件
1. 配置main.cf
vi /etc/postfix/main.cf
将mydestination
和relay_domains
中的$myhostname
和$mydomain
以及kyzy.cc
和mail.kyzy.cc
去掉,因为已经通过MySQL进行处理了,这里如果也处理会在log中打印出Warning,意思是两处都设置了会冲突。在文件中加入以下内容,以便告诉Postfix不要使用LDA
(Local Delivery Agent)转而使用Dovecot的LMTP完成本地邮件投递:
virtual_transport = lmtp:unix:private/dovecot-lmtp
增加下面3个配置以便告诉Postfix去MySQL数据库寻找域名、用户帐号密码及邮件别名等信息
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
2. 新建mysql-virtual-mailbox-domains.cf
文件并输入如下内容
看到这里是不是想到了一些什么?
是的,无论是表名还是字段名都是随便起的,只要配置里面使用的一致就可以。
user = dbuser
password = dbpwd
hosts = dbhost
dbname = postfix
query = SELECT 1 FROM virtual_domains WHERE name='%s'
3. 新建mysql-virtual-mailbox-maps.cf
文件并输入如下内容
user = dbuser
password = dbpwd
hosts = dbhost
dbname = postfix
query = SELECT 1 FROM virtual_users WHERE email='%s'
4. 新建mysql-virtual-alias-maps.cf
文件并输入如下内容
user = dbuser
password = dbpwd
hosts = dbhost
dbname = postfix
query = SELECT destination FROM virtual_aliases WHERE source='%s'
5. 测试配置
重启 Postfix 服务
service postfix restart
如果正确,执行后返回结果应该为1
postmap -q kyzy.cc mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
如果正确,则如下命令执行后返回结果应该为1
postmap -q [email protected] mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
如果正确,则如下命令执行后返回结果应该是之前添加的别名
和帐号
postmap -q [email protected] mysql:/etc/postfix/mysql-virtual-alias-maps.cf
6. 安装postfix-mysql
如果提示找不到,则通过这里找到对应的版本,然后进入,根据里面的提示进行操作,我的是需要这个版本,最后添加软件源、更新、再次安装
apt-get update
apt-get install postfix-mysql
7. 安装dovecot-lmtpd
和dovecot-mysql
apt install dovecot-lmtpd dovecot-mysql
调整投递协议和配置
查看/etc/dovecot/dovecot.conf
文件可以知道,协议是在/usr/share/dovecot/protocols.d
(!include_try /usr/share/dovecot/protocols.d/*.protocol)中配置的,那么我们进入这个目录开启imap
, pop3
, lmtp
这三个配置,也就是创建这三个文件并添加相对应的内容,每个文件分别是:
imapd.protocol
内容
protocols = $protocols imap
pop3d.protocol
内容
protocols = $protocols pop3
lmtp.protocol
内容
protocols = $protocols lmtp
或者简单一点直接在dovecot.conf
中配制
protocols = imap pop3 lmtp
修改/etc/dovecot/conf.d/10-mail.conf
文件,找到mail_location
位置,将其指定到本地磁盘的某个路径,这个路径将来会存放收到的邮件,如下所示:
mail_location = maildir:/var/mail/vhosts/%d/%n
变量含义:
%u - username
%n - user part in user@domain, same as %u if there's no domain
%d - domain part in user@domain, empty if there's no domain
%h - home directory
找到mail_privileged_group
并修改为:
mail_privileged_group = mail
修改/etc/dovecot/conf.d/10-auth.conf
文件,找到disable_plaintext_auth
并取消注释
disable_plaintext_auth = yes
找到auth_mechanisms
并将其修改为如下值
auth_mechanisms = plain login
创建用于存储邮件的目录
因为不再使用系统用户的目录了,而是根据MySQL中配置的虚拟用户来收发邮件,所以最好单独创建目录存储这些文件
1. 在命令行种输入如下内容以查看/var/mail
的权限
ls -ld /var/mail
显示的内容大致应该是
drwxrwsr-x 2 root mail 4096 May 11 15:08 /var/mail
2. 创建/var/mail/vhosts
文件夹给每个需要启用的域名
mkdir -p /var/mail/vhosts/kyzy.cc
3. 输入如下命令以新建vmail
用户组及用户并赋权限
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/mail
4. 接下来修改一下/var/mail
目录的权限,使vmail
能够访问
chown -R vmail:vmail /var/mail
5. 修改Dovecot
相关目录的权限
chown -R vmail:dovecot /etc/dovecot
chmod -R o-rwx /etc/dovecot
配置Dovecot
1. 默认情况下,Dovecot
是允许系统用户登录使用的,我们需要将其禁用。找到文件种如下内容并将其注释
#!include auth-system.conf.ext
2. 开启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
3. 修改/etc/dovecot/conf.d/auth-sql.conf.ext
文件
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}
4. 修改/etc/dovecot/dovecot-sql.conf.ext
文件,取消文件中driver
行的注释,并将其修改为MySQL
driver = mysql
取消文件中connect
行的注释,并将其修改为如下格式
connect = host=dbhost dbname=postfix user=dbuser password=dbpwd
取消文件中default_pass_scheme
行的注释,并将其修改为MD5
之前我们存储数据库中的用户密码是MD5
加密的
default_pass_scheme = md5
取消文件中password_query
行的注释,并将起修改为如下格式
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
**5. 修改/etc/dovecot/conf.d/10-master.conf
文件
通过将端口设置为 0,以禁用
非 SSL 加密的 IMAP 和 POP3 协议)
service imap-login {
inet_listener imap {
port = 0
}
...
}
service pop3-login {
inet_listener pop3 {
port = 0
}
...
}
找到文件中的service lmtp
并将其修改为如下内容
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
...
}
找到文件中service auth
并将其修改为如下内容
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
unix_listener auth-userdb {
mode = 0600
user = vmail
#group =
}
...
user = dovecot
}
找到文件中service auth-worker
并将其修改为如下内容
service auth-worker {
user = vmail
}
6. 重新启动Dovecot
服务
service dovecot restart
注意事项
设置一个帐号,可以向MySQL
对应的表中插入数据,接下来使用邮件客户端来测试一下,请注意以下内容:
- 邮箱的全称(包括后面的
@kyzy.cc
)将作为用户名
,这一点和系统用户作为email的用户名不同
- 邮箱密码是
MySQL
数据库种对应邮箱的密码 - 邮件收发的所有协议,包括
IMAP
、POP3
、SMTP
全部都需要开启SSL
加密,如果我们设置的ssl = required
为强制验证
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭