Postfix Dovecot电子邮件配置指南
基础云服务器配置和DNS配置
基础云服务器配置
笔者使用的是 'CentOS7 SELinux 7 x64' 操作系统,所以如果不太了解的话,请配置同样系统的云虚拟机。大佬自行忽略。
笔者推荐使用本机SSH服务连接到服务器,而不是用ISP提供的网页版Remote Console
基础DNS配置
在你购买的域名下,找到DNS配置界面,添加以下几条记录
- 指向服务器的A记录 (Value配置成你的邮件的IP地址):
Type | Name | Value | TTL |
---|---|---|---|
A | example.com | xxx.xx.xxx.x | 600 |
- 指向邮件服务器的A记录 (依然使用IP自制作为Value):
Type | Name | Value | TTL |
---|---|---|---|
A | mail.example.com | xxx.xx.xxx.x | 600 |
- 指向邮件服务器的MX记录:
Type | Name | Mail Server (Value) | Priority | TTL |
---|---|---|---|---|
MX | mail.example.com | example.com | 10 | 600 |
检查防火墙设置
- 运行Firewall指令: firewall-cmd --list-ports。确认输出的列表中是否包含这些端口:465, 993, 995, 80. 如果没有输出的话,运行下面的指令分别打开这四个端口。没有输出哪个端口就说明哪个被防火墙阻挡,你就需要打开那个端口(将465替换为你需要的端口):
firewall-cmd --add-port=465/tcp --permanent
firewall-cmd --reload
- 运行IPTables指令来确认端口是否处于ACCEPT状态
iptables -nL | grep 465
iptables -nL | grep 993
iptables -nL | grep 995
iptables -nL | grep 80
设置Hosts文件
打开 /etc/hosts, 确认里面是否包含了以下两行。如果不包含或不完整,按照下面的内容修改。其中192.0.2.0是你的公共IP地址,hostname 是你的本地主机名
127.0.0.1 localhost.localdomain localhost
192.0.2.0 hostname.example.com hostname
初步安装
笔者使用Postfix作为SMTP服务器, Dovecot作为POP3和IMAP服务器, MariaDB存储用户数据
匹配版本号(大佬请忽略)
如果版本号不对导致了报错的话,或者担心新版本的配置有更新的话,可以使用和笔者一样的版本号。直接从pkgs.org下载指定版本的包,然后下面使用yum指令的时候,指定你下载的包的路径即可。大佬请自行忽略这部分!
sudo yum info postfix
sudo yum info dovecot
sudo yum info mariadb-server
sudo yum info dovecot-mysql
确认输出的版本号是否和下面的版本号匹配:
Postfix:
Version : 2.10.1
Release : 9.el7
Dovecot:
Version : 2.2.36
Release : 8.el7
MariaDB-server:
Version : 5.5.68
Release : 1.el7
dovecot-mysql:
Version : 2.2.36
Release : 8.el7
如果版本不匹配,但想要使用和笔者一样的版本,可以从pkgs.org直接下载指定版本的rpm包并安装。以下是四个rpm包在pkgs.org的链接:
Postfix 2.10.1: http://mirror.centos.org/centos/7/os/x86_64/Packages/postfix-2.10.1-9.el7.x86_64.rpm
Dovecot 2.2.36: http://mirror.centos.org/centos/7/os/x86_64/Packages/dovecot-2.2.36-8.el7.x86_64.rpm
dovecot-mysql 2.2.36: http://mirror.centos.org/centos/7/os/x86_64/Packages/dovecot-mysql-2.2.36-8.el7.x86_64.rpm
MariaDB-server 5.5.68: http://mirror.centos.org/centos/7/os/x86_64/Packages/mariadb-server-5.5.68-1.el7.x86_64.rpm
可以使用wget指令分别下载这四个包到指定的路径
安装必要的包
如果你没有下载包,想要直接安装,则运行以下指令
sudo yum install postfix dovecot mariadb-server dovecot-mysql
果你想要使用下载的包,可以将每一个服务替换成你的包的路径。例如:
sudo yum install /root/postfix-2.10.1-9.el7.x86_64.rpm
像这样将每一个包都替换成指向你使用wget指令下载的包的路径
安装和签发SSL证书
SSL证书有多种签发的方式,可以自行签发,也可以使用第三方机构的服务。笔者使用的是Cerbot的服务。(大佬自行忽略,不过在后面安装Postfix和Dovecot的时候记得把SSL证书的路径替换成自己的)
检查服务的版本号
检查版本号的指令:
yum info epel-release
yum info python2-certbot-nginx
yum info nginx
版本号
epel-release
Version : 7
Release : 14
python2-certbot-nginx
Version : 1.11.0
Release : 1.el7
nginx
Version : 1.20.1
Release : 10.el7
epel-release的下载链接:https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-14.noarch.rpm
python2-certbot-nginx的链接:https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/p/python2-certbot-nginx-1.11.0-1.el7.noarch.rpm
安装SSL证书需要的包
首先,安装epel-release,运行以下指令 (版本配置同上):
sudo yum install epel-release
然后,安装nginx服务。运行下面的指令:
sudo yum install python2-certbot-nginx nginx
签发SSL证书
运行以下指令以签发SSL证书
sudo certbot --nginx
签发过程中cerbot会要求你输入你的域名(第一次使用可能会要求你输入你的的私人电子邮件地址), 如实填写即可。下面所有的选项全部填写yes即可。 签发之后可能会报错:Could not automatically find a matching server block for example.com. Set the
server_name directive to use the Nginx installer
这个报错应该是因为你的服务器上没有Web Server (笔者个人理解不确定对不对)。这可能应该会导致你的证书无法自动更新,不过这没有问题。证书过期的时候手动更新就好了
检查SSL证书是否存在, 运行这条指令:ll /etc/letsencrypt/live/example.com, 你应该能看到目录中有下面四个文件:
lrwxrwxrwx. 1 root root 33 Aug 31 16:33 cert.pem
lrwxrwxrwx. 1 root root 34 Aug 31 16:33 chain.pem
lrwxrwxrwx. 1 root root 38 Aug 31 16:33 fullchain.pem
lrwxrwxrwx. 1 root root 36 Aug 31 16:33 privkey.pem
文件存在,即说明SSL证书已经签发。
配置MariaDB数据库
笔者使用MariaDB数据库,存储域名,用户以及密码等等信息
配置MariaDB数据库的基础配置
首先,运行这条指令启动MariaDB服务:
sudo systemctl start mariadb
然后运行这条指令:
sudo mysql_secure_installation
这条指令可以帮助使用者初始化MariaDB数据库。在过程中设置自己的root密码,然后记录下来 (注意不要把root密码丢了)。其他的选项一律填yes就可以了。
创建域名和用户数据表格
首先,运行这条指令创建mailserver数据库:
sudo mysqladmin -u root -p create mailserver
输入你刚才设置的root密码。
然后,登入MySQL. 使用这条指令
sudo mysql -u root -p
登入之后,运行以下指令,创建一个mailuser的用户(给Postfix和Dovecot查找的时候使用),并赋予查找这个数据库的权限。将指令中最后面部分的mailuserpass设置成自己需要的密码,并记录。完成后运行flush命令
GRANT SELECT ON mailserver.* TO 'mailuser'@'127.0.0.1' IDENTIFIED BY 'mailuserpass';
FLUSH PRIVILEGES;
使用这条指令
USE mailserver
选择到mailserver数据库里面。首先,需要创建一个针对域名需要用到的表。直接输入以下指令即可
CREATE TABLE `virtual_domains` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
创建一个服务于电子邮件地址和密码表. 直接输入以下指令:
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;
创建alias表:
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;
添加用户和密码的数据
输入以下指令,向virtual_domains这个表中,添加数据。将指令中的example.com和hostname分别替换为你的域名和你的主机名。
INSERT INTO `mailserver`.`virtual_domains`
(`id` ,`name`)
VALUES
('1', 'example.com'),
('2', 'hostname.example.com'),
('3', 'hostname'),
('4', 'localhost.example.com');
然后,在virtual_users表中,分别创建email1和email2两个用户用于测试。
INSERT INTO `mailserver`.`virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
('1', '1', ENCRYPT('password', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'email1@example.com'),
('2', '1', ENCRYPT('password', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'email2@example.com');
确认数据库是否配置正确
分别运行下面的指令,然后检查输出的表是否正确:
SELECT * FROM mailserver.virtual_domains;
SELECT * FROM mailserver.virtual_users;
最后使用exit
指令登出MariaDB数据库。
配置Postfix服务器
Postfix 是一种电子邮件服务器,它是由任职于IBM华生研究中心(T.J. Watson Research Center)的荷兰籍研究员Wietse Venema为了改良sendmail邮件服务器而产生的。最早在1990年代晚期出现,是一个开放源代码的软件。
配置main.cf
首先,打开/etc/postfix/main.cf
文件,按照下面的内容进行配置。推荐使用vim编辑器。可以直接搜索每一个参数,然后进行配置。这里注意,有一些地方可能已经有默认的配置被取消注释了。在配置的时候,如果选择取消正确配置的注释,那么请将错误的配置注释掉。重点关注inet_interfaces的配置。
vim /etc/postfix/main.cf
之后打开或创建都用vim
命令↑
smtpd_banner = $myhostname ESMTP $mail_name (CentOS)
biff = no
append_dot_mydomain = no
readme_directory = no
smtpd_tls_cert_file=/etc/letsencrypt/live/example.com/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/example.com/privkey.pem
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtpd_sasl_security_options = noanonymous, noplaintext
smtpd_sasl_tls_security_options = noanonymous
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = example.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydomain = example.com
myorigin = $mydomain
mydestination = localhost, localhost.$mydomain
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
virtual_transport = lmtp:unix:private/dovecot-lmtp
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,
mysql:/etc/postfix/mysql-virtual-email2email.cf
注意,上述配置文件不是完整文件,请搜索每一个参数,如果不存在的参数则自行添加即可。
创建并配置main.cf中声明的文件
首先,创建/etc/postfix/mysql-virtual-mailbox-domains.cf
文件。并在文件中添加以下内容。将mailuserpass换成上面设置的mailuser的密码 (注意不是root密码)。之后打开与创建都是同意操作
vim /etc/postfix/mysql-virtual-mailbox-domains.cf
user = mailuser
password = mailuserpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'
然后,创建/etc/postfix/mysql-virtual-mailbox-maps.cf
同样的操作
user = mailuser
password = mailuserpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_users WHERE email='%s'
然后创建/etc/postfix/mysql-virtual-alias-maps.cf
同样的操作
user = mailuser
password = mailuserpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM virtual_aliases WHERE source='%s'
然后创建/etc/postfix/mysql-virtual-email2email.cf
同样的操作
user = mailuser
password = mailuserpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT email FROM virtual_users WHERE email='%s'
检查main.cf的配置是否正确
首先,重启Postfix
sudo systemctl restart postfix
运行以下两条指令确认Postfix是否能够查找数据库中的表。如果没有问题,指令应该返回'1'。
sudo postmap -q example.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
sudo postmap -q email1@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
配置master.cf
打开 /etc/postfix/master.cf
这个文件,然后按照下面的内容进行配置。记住,不要重复参数。
smtp inet n - 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_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
-o smtpd_reject_unlisted_recipient=no
-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_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
运行
sudo chmod -R o-rwx /etc/postfix
然后重启Postfix
sudo systemctl restart postfix
配置Dovecot服务器
Dovecot 是一个开源的 IMAP 和 POP3 邮件服务器,支持 Linux/Unix 系统。POP / IMAP 是 MUA 从邮件服务器中读取邮件时使用的协议。其中, POP3协议是从邮件服务器中下载邮件存起来,IMAP4 则是将邮件留在服务器端直接对邮件进行管理、操作。Dovecot 是一个比较新的软件,由 Timo Sirainen 开发,最初发布于 2002年7月。作者将安全性考虑在第一,所以 Dovecot 在安全性方面比较出众。另外,Dovecot 支持多种认证方式,所以在功能方面也比较符合一般的应用
配置基本配置文件
首先,打开/etc/dovecot/dovecot.conf
然后将下面的两行参数取消注释
protocols = imap pop3 lmtp
listen = *, ::
然后打开/etc/dovecot/conf.d/10-mail.conf
, 配置下面的参数
mail_location = maildir:/var/mail/vhosts/%d/%n
mail_privileged_group = mail
运行
sudo mkdir -p /var/mail/vhosts/example.com
创建文件夹。注意将example.com替换成你的域名。然后运行下面的指令,创建vmail用户,并赋予它访问权限
sudo groupadd -g 5000 vmail
sudo useradd -g vmail -u 5000 vmail -d /var/mail/
sudo chown -R vmail:vmail /var/mail/
打开/etc/dovecot/conf.d/10-auth.conf
并配置以下参数:
disable_plaintext_auth = yes
auth_mechanisms = plain login
!include auth-system.conf.ext
!include auth-sql.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=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}
创建/etc/dovecot/dovecot-sql.conf.ext
然后在里面输入一下内容。注意将密码替换成自己的。
driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=mailuser password=mailuserpass
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
运行以下指令,赋予Dovecot访问权限:
sudo chown -R vmail:dovecot /etc/dovecot
sudo chmod -R o-rwx /etc/dovecot
配置master.conf
打开/etc/dovecot/conf.d/10-master.conf
这个文件,分别找到下面5个服务,并按照下面给定的参数进行配置
service imap-login {
inet_listener imap {
port = 0
}
inet_listener imaps {
port = 993
ssl = yes
}
}
service pop3-login {
inet_listener pop3 {
port = 0
}
inet_listener pop3s {
port = 995
ssl = yes
}
}
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
#mode = 0666i
mode = 0600
user = postfix
group = postfix
}
}
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
unix_listener auth-userdb {
mode = 0600
user = vmail
}
user = dovecot
}
service auth-worker {
user = vmail
}
打开:/etc/dovecot/conf.d/10-ssl.conf
配置下面的参数:
ssl = required
ssl_cert = </etc/letsencrypt/live/example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/example.com/privkey.pem
最后重新启动Dovecot:
sudo systemctl restart dovecot
邮件服务器初步测试
到目前为止,如果配置没有问题,发送本地邮件已经没有任何问题了。笔者建议在这里先进性一次MailX测试,已确认上述配置是否正确。
MailX本地传输邮件测试
安装MailX并发送邮件 (MailX不需要关心版本问题,直接安装即可)
yum install mailx
mail email1@example.com
第二条指令会从root用户向你的email1账户发送邮件。随便发送任何内容都可以。
然后使用cd指令,进入到文件夹
cd /var/mail/vhosts/example.com/email1。
进入之后,输入find指令, 查看是否输出以下内容
./dovecot-uidvalidity
./new
./maildirfolder
./dovecot.index.cache
./cur
./cur/1539202420.M440788P27259.mail,S=450,W=465:2,S
./dovecot.index.log
./dovecot-uidlist
./dovecot-uidvalidity.5bbe5d50
./tmp
如果成功看到了这些内容,那么本地测试就已经成功了
邮件客户端接收邮件测试
本地测试成功之后,还需要测试邮件客户端是否能够收到邮件。这里推荐使用FoxMail进行测试。前往FoxMail的官方网站,下载FoxMail的客户端到自己的PC (看清楚了,别装到服务器上去)。
下载安装完成之后,选择登录其他邮件。地址输入email1@example.com, 密码输入你的第一个用户的密码 (在MariaDB中配置过)。登录的时候会要求你填写一些设置。按照下面的示例填写,或者可以按照你自己的DNS配置填写。注意一定要勾选SSL选项
这时你应该能够从收件箱中看到你刚刚发送的测试邮件
其他DNS和签名配置
只有这样的配置是没有办法向外部发送邮件,也没有办法接收外部邮件的。如果需要收发外部邮件,还需要进行以下配置。
配置SPF记录
回到一开始的DNS记录配置界面,添加下面这条记录 (将xxx.xx.xxx.x替换为你的IP地址)
Type | Name | TXT Value | TTL |
---|---|---|---|
TXT | @ | v=spf1 ip4:xxx.xx.xxx.x ~all | 600 |
配置反向DNS记录 (PTR记录)
现在,由于有大量的垃圾邮件,很多邮件服务器都会要求邮件发送方配置反向DNS记录,也就是PTR记录。PTR记录并不是由你的域名提供商提供,而是由ISP提供,也就是你的云服务器提供商。如果你的云服务器提供商并没有在设置界面允许你配置反向DNS记录,那么你需要联系它们的客服来进行配置。
找到反向DNS记录配置的页面
需要注意的有两点:反向DNS记录的生效时间远远超过普通DNS记录。配置完反向DNS记录可能需要将近一个小时才能生效。另外,如果你的DNS记录中,配置的是smtp.example.com, 那么你需要将反向DNS记录配置为smtp.example.com
配置DKIM记录
现在,很多的邮件服务器都会要求邮件发送方发送的每一封邮件中,都有DKIM签名。如果没有DKIM签名,有很大概率你发出的邮件会被拒收
在服务器配置DKIM签名
首先,使用
sudo yum install opendkim
安装OpenDKIM. 这一步不需要考虑版本的问题。
安装完成之后打开配置文件/etc/opendkim.conf
按照下图进行配置
找到Mode v, 并改成Mode sv。然后找到下面所演示的参数,直接取消注释即可。
最后,在文件尾部,加上下面两行内容
Domain example.com
RequireSafeKeys False
然后,打开/etc/opendkim/SigningTable
这个文件,在最后一行,加上如下配置:
*@example.com default._domainkey.example.com
然后,打开/etc/opendkim/KeyTable
文件,并在文件末尾添加下面一行内容:
default._domainkey.example.com example.com:selector:/etc/opendkim/keys/yourdomain.com/default.private
打开/etc/opendkim/TrustedHosts
添加*.example.com, 如下图:
在DNS中配置DKIM记录
在服务器中创建文件:
sudo mkdir /etc/opendkim/keys/example.com
然后输入下面两条指令生成Key并输出:
sudo opendkim-genkey -b 1024 -d example.com -D /etc/opendkim/keys/example.com -s default -v
sudo chown opendkim:opendkim /etc/opendkim/keys -R
sudo cat /etc/opendkim/keys/example.com/default.txt
然后会输出如下内容。将内容复制到剪贴板。
打开DNS配置界面,添加如下记录。Value粘贴刚刚复制的内容,但是注意将中间的引号和空格删掉(那是由于换行所添加的引号,如示例)
type | Name | TXT Value | TTL |
---|---|---|---|
TXT | default._domainkey.example.com | v=DKIM1; k=rsa;p=..... | 600 |
配置Postfix使用DKIM签名
打开文件/etc/postfix/main.cf
在结尾加入如下内容:
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
最后重启Postfix和OpenDKIM:
sudo service opendkim restart
sudo service postfix restart
`这样一样来就全部配置完成了!(撒花~~)
可以使用FoxMail发送一封外部邮件,看看有没有问题`
打开更详细的日志
如果配置的有问题,可以根据下面的步骤打开更详细的日志,来锁定配置的问题。
打开Dovecot的Verbose Logs
打开/etc/dovecot/conf.d/10-logging.conf
找到下面的参数,取消注释并配置为yes
auth_verbose = yes
mail_debug = yes
verbose_ssl = yes
然后重启Dovecot
sudo systemctl restart dovecot。
打开Postfix的Verbose Logs
打开/etc/postfix/master.cf
, 在下面一行中加上 -v:
smtp inet n - - - - smtpd -v
smtps同理。完成后,重启Postfix
sudo systemctl restart postfix
参考链接:
https://blog.51cto.com/kusorz/1703769
https://www.linode.com/docs/guides/email-with-postfix-dovecot-and-mariadb-on-centos-7/
https://www.linode.com/docs/guides/troubleshooting-problems-with-postfix-dovecot-and-mysql/
https://baike.baidu.com/item/postfix/10077421
https://baike.baidu.com/item/dovecot/3523768
https://easydmarc.com/blog/how-to-configure-dkim-opendkim-with-postfix/
https://www.vultr.com/docs/how-to-create-reverse-dns-or-ptr-records-in-the-vultr-control-panel/
版权声明:本文为岁月倾城197博主原创文章,遵循CC 4.0 BY-SA 版权协议
原文链接:https://blog.csdn.net/newtypeofc/article/details/132612851