CentOS7 下搭建邮件服务器 (dovecot + postfix + SSL)
花了基本上两天的时间去配置 CentOS7 下的邮件服务器。其中艰辛太多了,一定得总结下。
本文的目的在于通过一系列配置,在 CentOS 7 下搭建 dovecot + postfix + SSL 服务器,并且能够通过邮件客户端(本文中是 Airmail)进行收发邮件。
前提条件
- 你得有个主机或者 VPS
- 你有一个主域名比如 fancycoding.com 还有一个二级域名比如 mail.fancycoding.com
- 二级域名的 SSL 证书。
配置你的 DNS 记录
- 确认主域名有 A 记录指向服务器 IP
- 添加一个邮件二级域名比如 mail.fancycoding.com 指向服务器 ip
- 主域名下添加一则 MX 记录指向邮件二级域名 比如 mail.fancycoding.com。如果你作为邮件服务器的域名没有多个,那么 MX 优先级可以随便写(反正只有一个),最高 1,最低 50,当优先级高的解析无效时,就会去解析低的。
- 添加一则 txt 记录作为 SPF (Sender Policy Framework)。关于 SPF 的格式可以去 http://www.openspf.org/SPF_Record_Syntax 查看。 比如我设置的是
1 | v=spf1 a mx ~all |
就是除了我的 A 记录和 MX 记录外,如果有其他域发出邮件的话,那都是伪造的。
这些步骤完成后,可以用以下命令检测是否生效
1 | dig MX yourdomain +short @ns |
比如我的域名是放在 dnspod 的,那么按照上图配置后,应该是这样:
1 | Robin-MacdeMac-mini ~$dig MX fancycoding.com +short @f1g1ns1.dnspod.net |
安装 Postfix
以下操作最好在 root 权限下进行。不然每次都要 sudo 很麻烦不是么。
1 | yum -y install postfix |
sendmail 是 centos 默认安装的,超级难用,可以放心删掉。
1 | vim /etc/postfix/main.cf |
默认的应该有很大一堆,不用管它。在文件最底部写入以下内容
这里假设你的:
域名证书私钥在 /etc/ssl/private/mail.fancycoding.key
公钥在 /etc/ssl/certs/mail.fancycoding.crt
CA 证书在 /etc/ssl/certs/cacert.pem
1 | myhostname = mail.fancycoding.com |
再打开 /etc/postfix/master.cf:
1 | vim /etc/postfix/master.cf |
找到
1 | #smtp inet n - n - - smtpd |
取消其前面的注释”#”,然后找到 submission 这一行,同样取消前面的注释,并添加如下:
1 | submission inet n - - - - smtpd |
特别注意 smtpd_recipient_restrictions 不要写错了,每个逗号之间都是一个单词,没有空格。
接下来配置你的 aliases,这个是邮件用户名的别名。比如发送个 [email protected] 的邮件,会自动转道 [email protected]。
1 | vim /etc/aliases |
可以看到已经设置了很多的别名了。如果你想把这些人都转发给一个真实的用户,比如 mike,那么就在最底下添加一行:
1 | root:mike |
安装 Dovecot
1 | -y install postfix |
进入 /etc/dovecot/dovecot.conf
1 | vim /etc/dovecot/dovecot.conf |
在最下面添加以下内容:
1 | protocols = imap pop3 |
开启所有服务
1 | newaliases |
看下 log
1 | cat /var/log/maillog |
如果你看到如下一行且没有 warning 或者 error,那就大功告成了:
Sep 10 22:54:51 fancycoding dovecot: master: Dovecot v2.2.10 starting up for imap, pop3 (core dumps disabled)
测试邮件发送与接收
1 | mail -s TestTitle [email protected] |
之后会进入交互模式,随便输入点东西,然后按 Ctrl+D,则会开始发送。
如果许久没有收到发来的邮件,那可能得看一下 log 有啥报错没有了。
如果提示没有 mail 这个指令,那么
1 | yum -y install mailx |
你也可以给你的用户发邮件,比如我用 qq 邮箱发给 [email protected],那么会看到 log 里面有这样的记录
1 | Sep 10 23:17:14 fancycoding postfix/smtpd[27682]: connect from smtpbgsg2.qq.com[54.254.200.128] |
可以看到,qq 的 smtp 服务器 smtpbgsg2.qq.com 连接到我们的服务器上,原目标是 [email protected],经过别名转换后发送到了 [email protected]。
那么用 mail 指令就能看到新邮件了:
1 | [root@fancycoding ~]# mail |
用邮件客户端连接
不想发邮件的时候还用命令行对吧,也不想收邮件的时候要 ssh 登录然后用指令查询是吧。那么我们之前做的那么多,不就是为了用邮件客户端连接我们的邮件服务器吗?
比如我要新建一个名字为 robin 的用户,但这个用户我禁止所有人登录:
1 | useradd -s /sbin/nologin username |
打开邮件客户端,新建账户,这里以 Airmail 为例:
如果一路顺风,你就可以用邮件客户端进行收发邮件啦。
如果有朋友找你开通邮箱,那么你只需要用 useradd 添加一个用户就好了~是不是很方便!
FAQ:
我出问题了,但是不知道是什么问题,怎么办
tail /var/log/maillog
Error: chown(/home/user/mail/.imap/INBOX, group=12(mail)) failed: Operation not permitted (egid=1000(user)
两个解决办法:
- sudo chmod 0600 /var/mail/*
- 在 /etc/dovecot/dovecot.conf 加入
mail_access_groups=mail
Recipient address rejected: Access denied (in reply to RCPT TO command)
netstat -tap
看一下端口是否都正常/etc/postfix/main.cf 中
- 检查 myorigin 是否是你的二级域名,而不是某些教程中的 /etc/mailname
- 确保 home_mailbox 没有被定义
别人无法发邮件给创建的邮箱,提示 554 5.7.1: Recipient address rejected: Access denied 。
这个问题就有很多了,有可能是 MX 解析没弄对,MX 被其他域名所接受,spf 没弄对等等。
确保 dig 出来的域名以这样的形式结尾,而不是显示
xxx handle by xxx.domain.com
mail.fancycoding.com has address 107.170.242.137
## 写在后面
这篇看似简单的教程,实际上可让我把 google 都翻烂了。用了整整 2 天的时间来配置。
直到自己把配置的 80% 的内容都弄明白了,才基本上算到位了。回想起来,还不如好好看下 dovecot 和 postfix 的 wiki 之后,再来做这些事。网上很多教程实际上已经过时,或者不适用于 CentOS。
最后,笔者希望通过这篇文章,让你能一步到位,少走弯路!
如果有问题,欢迎留言。
CentOS7 下搭建邮件服务器 (dovecot + postfix + SSL)
https://robinxb.com/posts/2015/centos7-mail-server-with-dovecot-postfix-ssl/