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 2 |
dig MX yourdomain +short @ns host your.subdomain ns |
比如我的域名是放在dnspod的,那么按照上图配置后,应该是这样:
1 2 3 4 5 6 7 8 9 |
Robin-MacdeMac-mini ~$dig MX fancycoding.com +short @f1g1ns1.dnspod.net 50 mail.fancycoding.com. Robin-MacdeMac-mini ~$host mail.fancycoding.com f1g1ns1.dnspod.net Using domain server: Name: f1g1ns1.dnspod.net Address: 119.167.195.3#53 Aliases: mail.fancycoding.com has address 107.170.242.137 |
安装Postfix
以下操作最好在root权限下进行。不然每次都要sudo很麻烦不是么。
1 2 |
yum -y install postfix yum remove sendmail |
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
myhostname = mail.fancycoding.com mydomain = fancycoding.com myorigin = mail.fancycoding.com mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128, 192.168.1.0/24 inet_interfaces = all mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain smtpd_sasl_auth_enable = yes smtpd_sasl_type = cyrus smtpd_sasl_security_options = noanonymous broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination smtpd_tls_auth_only = no smtp_use_tls = yes smtpd_use_tls = yes smtp_tls_note_starttls_offer = yes smtpd_tls_key_file = /etc/ssl/private/mail.fancycoding.key smtpd_tls_cert_file = /etc/ssl/certs/mail.fancycoding.crt smtpd_tls_CAfile = /etc/ssl/certs/cacert.pem smtpd_tls_received_header = yes smtpd_tls_session_cache_timeout = 3600s |
再打开/etc/postfix/master.cf:
1 |
vim /etc/postfix/master.cf |
找到
1 |
#smtp inet n - n - - smtpd |
取消其前面的注释”#”,然后找到submission这一行,同样取消前面的注释,并添加如下:
1 2 3 4 5 6 7 8 9 |
submission inet n - - - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_wrappermode=no -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth |
特别注意smtpd_recipient_restrictions不要写错了,每个逗号之间都是一个单词,没有空格。
接下来配置你的aliases,这个是邮件用户名的别名。比如发送个webmaster@yourdomain.com的邮件,会自动转道root@youdomain.com。
1 |
vim /etc/aliases |
可以看到已经设置了很多的别名了。如果你想把这些人都转发给一个真实的用户,比如mike,那么就在最底下添加一行:
1 |
root:mike |
安装Dovecot
1 |
-y install postfix |
进入/etc/dovecot/dovecot.conf
1 |
vim /etc/dovecot/dovecot.conf |
在最下面添加以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
protocols = imap pop3 mail_location = mbox:~/mail:INBOX=/var/mail/%u pop3_uidl_format = %08Xu%08Xv service auth { unix_listener /var/spool/postfix/private/auth { group = postfix mode = 0660 user = postfix } } ssl=required ssl_cert = </etc/ssl/certs/mail.fancycoding.crt ssl_key = </etc/ssl/private/mail.fancycoding.key
|
开启所有服务
1 2 3 |
newaliases service postfix restart service dovecot restart |
看下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 sombody@someone.com |
之后会进入交互模式,随便输入点东西,然后按Ctrl+D,则会开始发送。
如果许久没有收到发来的邮件,那可能得看一下log有啥报错没有了。
如果提示没有mail这个指令,那么
1 |
yum -y install mailx |
你也可以给你的用户发邮件,比如我用qq邮箱发给webmaster@fancycoding.com,那么会看到log里面有这样的记录
1 2 3 4 5 6 |
Sep 10 23:17:14 fancycoding postfix/smtpd[27682]: connect from smtpbgsg2.qq.com[54.254.200.128] Sep 10 23:17:16 fancycoding postfix/smtpd[27682]: B334A61941: client=smtpbgsg2.qq.com[54.254.200.128] Sep 10 23:17:17 fancycoding postfix/cleanup[27686]: B334A61941: message-id=<tencent_1BB3D41C7EDAF8ED30A8BF1D@qq.com> Sep 10 23:17:17 fancycoding postfix/qmgr[26975]: B334A61941: from=<84084888@qq.com>, size=2050, nrcpt=1 (queue active) Sep 10 23:17:17 fancycoding postfix/local[27687]: B334A61941: to=<root@mail.fancycoding.com>, orig_to=<webmaster@fancycoding.com>, relay=local, delay=0.81, delays=0.81/0/0/0, dsn=2.0.0, status=sent (delivered to mailbox) Sep 10 23:17:17 fancycoding postfix/qmgr[26975]: B334A61941: removed |
可以看到,qq的smtp服务器smtpbgsg2.qq.com连接到我们的服务器上,原目标是webmaster@fancycoding.com,经过别名转换后发送到了root@mail.fancycoding.com。
那么用mail指令就能看到新邮件了:
1 2 3 4 5 |
[root@fancycoding ~]# mail Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/root": 1 message 1 new >N 1 、Darkness Wed Sep 10 23:17 62/2153 "HI_WEBMASTER_TITLE" & |
用邮件客户端连接
不想发邮件的时候还用命令行对吧,也不想收邮件的时候要ssh登录然后用指令查询是吧。那么我们之前做的那么多,不就是为了用邮件客户端连接我们的邮件服务器吗?
比如我要新建一个名字为robin的用户,但这个用户我禁止所有人登录:
1 2 |
useradd -s /sbin/nologin username passwd 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.commail.fancycoding.com has address 107.170.242.137
https://www.fancycoding.com/centos7-mail-server-with-dovecot-postfix-ssl/
CentOS7下搭建邮件服务器(dovecot + postfix + SSL)的更多相关文章
- 搭建邮件服务器 使用Postfix与Dovecot
首先需要从yum中下载安装三个服务:bind-chroot postfix dovecot 配置文件依次: /etc/named.conf 下载安装完后要开启的服务:named ...
- 在Centos7下搭建Git服务器
① 安装 Git ② 服务器端创建 git 用户,用来管理 Git 服务,并为 git 用户设置密码 ③ 服务器端创建 Git 仓库 ④ 客户端 clone 远程仓库 ⑤ 客户端创建 SSH 公钥和私 ...
- Centos7下搭建NFS服务器与连接详解
一,环境介绍 本实验使用了两台centos7虚拟机,其中 服务器:192.168.1.188 客户端:192.168.1.189 二,实验步骤 192.168.1.1 ...
- Centos下搭建邮件服务器
一.协议 SMTP:用于发送邮件 POP3:用于接收邮件,接收后会将服务器上邮件删除 IMAP:用于接收邮件,接收后不会删除服务器邮件 二.几个重要的角色 MUA:可以理解为收取邮件的工具,比如thu ...
- centos7下搭建NFS服务器
NFS是Network File System的缩写,即网络文件系统.客户端通过挂载的方式将NFS服务器端共享的数据目录挂载到本地目录下. nfs为什么需要RPC?因为NFS支持的功能很多,不同功能会 ...
- centos7下搭建solr服务器
1.Solr的环境 Solr是java开发. 需要安装jdk. 安装环境Linux. 需要安装Tomcat. 1.2. 搭建步骤 第一步:把solr 的压缩包上传到Linux系统 第二步:解压solr ...
- CentOS7下搭建SVN服务器
(1).安装SVN 1)安装SVN [root@youxi1 ~]# yum -y install subversion mod_dav_svn [root@youxi1 ~]# cat /etc/s ...
- CentOS7下搭建Tomcat服务器
Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选.Tomcat 和 IIS ...
- 最新ubuntu搭建公网个人邮件服务器(基于postfix,dovecot,mysql)
最近做了一个应用,需要用邮件发通知,但是免费的邮箱每天发信数量是有限制的,所以呢就想着搭建一个自己的邮件服务器,能够实现邮件的发送和接收即可,其中大概花了一个星期找资料,测试,终于成功了,写个教程 ...
随机推荐
- 使用 python 实现 wc 命令程序的基本功能
这里使用了 python 的基本代码实现了 Linux 系统下 wc 命令程序的基本功能. #!/usr/bin/env python #encoding: utf-8 # Author: liwei ...
- 基于Ubuntu14.04系统的nvidia tesla K40驱动和cuda 7.5安装笔记
基于Ubuntu14.04系统的nvidia tesla K40驱动和cuda 7.5安装笔记 飞翔的蜘蛛人 注1:本人新手,文章中不准确的地方,欢迎批评指正 注2:知识储备应达到Linux入门级水平 ...
- FeWeb基础之JavaScript简介
FeWeb基础之JavaScript简介 1.JavaScript的基本介绍 JavaScript是一种基于对象和事件驱动并具有安全性能的脚本语言,它是通过嵌入或调入在标准的HTML语言中实现的.Ja ...
- 从人类社会的角度看OO(独家视角)
引言 在OO的工作中,我们一定会涉及到类,抽象类和接口.那么类和抽象类以及接口到底扮演的什么角色? 本文主要是从人类社会的角度阐述类与抽象类以及接口的"社会"关系,从而让我们抛弃书 ...
- MySQL Database on Azure新功能
本月中国版的MySQL Database on Azure发布了两项新功能: 1.主从复制——只读实例 在这之前Azure上的MySQL数据库也是支持主从复制的,但是只能作为on-premises部署 ...
- C#学习笔记-数据的传递以及ToolStripProgressBar
代码: 方法一:窗体的代码-->可以直接通过预设的Click事件来实现控制进度条. public partial class Form1 : Form { public Form1() { In ...
- 虚基类&虚继承
发现这个月准备竞赛完全没有更新哎... 改了下某华大一c++测试题...网上对虚继承讲的要么太繁琐要么不到位,自力更生 #include<iostream> #include<fst ...
- size_t和size_type
size_t和size_type是为了独立于及其而定义的类型,因为比如在一台电脑上int为2b,而另一台电脑上是4b,这样就给程序的可移植性带来了麻烦.为了解决这个问题,在库内定义了如上类型,其实si ...
- C#事件学习
通过代码触发事件(第10章).由对象触发的事件(Timer每隔Interval指定时间,就触发Tick事件,第8章使用Timer). 目录: 避免递归事件 访问对象的事件 使用事件参数 创建事件处理程 ...
- 总结javascript中的全局变量和局部变量的区别以及声明函数和调用函数的区别
<!DOCTYPE html> <html> <head lang="en"> <meta charset="utf-8&quo ...