Postfix+Dovecot+MySQL搭建邮件服务器
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)
网上有很多使用Postfix搭建邮件服务器的文章,但目前貌似没有看到较为完整的一篇。本例将尝试在Ubuntu系统中使用Postfix+Dovecot+MySQL搭建邮件服务器。
目录[-]
- 开始之前
- 工作原理
- 服务器接收邮件的过程
- 用户查收邮件的过程
- 用户发送邮件的过程
- DNS配置
- SSL证书
- 修改hostname
- MySQL安装及配置
- MySQL安装
- 新建数据库及用户
- 新建表格
- 插入数据
- 测试数据
- Postfix安装及配置
- Postfix的安装
- Postfix的配置
- Dovecot安装及配置
- Dovecot的安装
- Dovecot的配置
- 修改/etc/dovecot/dovecot.conf文件
- 修改/etc/dovecot/conf.d/10-mail.conf文件
- 修改/etc/dovecot/conf.d/10-auth.conf文件
- 修改/etc/dovecot/conf.d/auth-sql.conf.ext文件
- 修改/etc/dovecot/dovecot-sql.conf.ext文件
- 修改/etc/dovecot/conf.d/10-master.conf文件
- 修改/etc/dovecot/conf.d/10-ssl.conf文件
- 测试邮件服务器是否正常
说到邮件服务器,网上有许多不同解决方案。Window操作系统下常见的邮件服务器有hMailServer、MailEnable、EVOMailServer、Apache James(纯Java跨平台)等。
而在Linux/Unix系统中常用的邮件服务器也有不少选择,最经典也是最常见的莫过于Postfix。这篇文章将会讲述如何在Ubuntu系统之下,通过Postfix、Dovecot、MySQL整合实现普通意义上「邮件服务器」的大部分功能。
开始之前
配置邮件服务器并不是一项简单的工作,其过程不仅需要一定的技术能力,同时也需要大家具有一定的耐心,同时也需要大家非常细心。为了能够「看懂」并「最终实践」这篇文章,大家还需要了解或掌握以下知识:
- Postfix: 是一个标准的MTA「Mail Transfer Agent」服务器,它负责通过SMTP协议管理发送到本机的邮件以及由本机发向外界的邮件。在本例中,Postfix会把邮件的本地投递工作「接受到邮件之后将邮件存档到本地磁盘」交给Dovecot的LMTP服务「Local Mail Transfer Protocol service」处理。当然,当大家想通过服务器向外界发送邮件时,Postfix还将负责验证权限以确保服务器不被滥用。「很多邮件服务器根本没有对SMTP做用户验证,这将导致任何匿名用户都可以通过服务器向外界发送邮件,从而使得服务器变成垃圾中转站」
- Dovecot: 是一个非常优秀的IMAP/POP服务器用以接收外界发送到本机的邮件。通常,Dovecot的工作内容包括:验证用户身份以确保邮件不会被泄露。在本例中,Dovecot将负责所有的「身份验证」工作,我们会配置Dovecot查询本地的MySQL数据库以确认用户身份
- MySQL: 不必多说,它将存储所有的用户信息,其中包括:需要监听的域名信息、用户邮箱地址、登录密码、邮箱别名「alias」等
- Ubuntu: 本例中的OS将选择Ubuntu14.10作为标准,其他Linux发行版的相关操作不在描述
工作原理
服务器接收邮件的过程
在开始讲述本例的内容之前,我们先来看看Postfix+Dovecot+MySQL是如何相互协作以实现邮件服务器的各项功能。我们假设 张三通过oschina.net的邮箱zhangsan@oschina.net
发送一份邮件给 李四lisi@mydomain.com
,则服务器接收邮件的过程大致如下图所示:
zhangsan@oschina.net
发送邮件到lisi@mydomain.com
- oschina.net服务器会通过DNS查询mydomain.com的MX记录并找到Postfix所在的服务器
- 邮件被发送给Postfix
- Postfix转向MySQL求助,以查询mydomain.com是不是需要处理的域名
- MySQL返回确认信息给Postfix
- Postfix将接受到的邮件投递给Dovecot的LMTP服务以便做处理
- Dovecot将邮件内容保存到
lisi@mydomain.com
用户对应的磁盘路径
用户查收邮件的过程
上述例子中我们看到了服务器接收邮件的过程,接下来我们看看,当大家通过用户名密码登录邮箱查看邮件时,会发生什么事情:
- 邮件客户端 to Dovecot:尊敬的Dovecot大人,您好!我阔以建立一个IMAP加密连接吗?
- Dovecot to 邮件客户端:当然阔以。这是我的SSL证书,请您告诉我帐号和密码!
- 邮件客户端 to Dovecot:好滴!这是我的用户名和密码,千万不要告诉别人哦!
- Dovecot to MySQL:Hi 美女!请问下,这个用户名和密码是正确的嘛?
- MySQL to Dovecot:好的,请稍后!呃……这个用户名和密码是正确的哦!
- Dovecot打开存放在本地磁盘/var/mail/mydomain.com/llisi的mailbox
- Dovecot获取到最新的邮件及其他相关信息
- Dovecot将邮件及其相关的其他信息通过IMAP协议发送给客户端
用户发送邮件的过程
查收了最新的邮件之后,李四lisi@mydomain.com
发现张三给他发来了邮件。现在,李四回复一封邮件给张三,会发生什么事情:
- 邮件客户端 to Postfix:尊敬的Postfix大人,您好!我阔以建立一个安全的SMTP连接嘛?
- Postfix to 邮件客户端:说人话!可以就是可以,干嘛要说「阔以」啊!你丫贱啊,找抽啊!想建立SMTP连接可以,不过要加密。这是我的SSL证书,告诉我你的帐号和密码,你个贱人!
- 邮件客户端 to Postfix:对不起,大人,我错鸟!这是我的帐号和密码,不要告诉别人哦!
- Postfix to Dovecot:Hi 帅哥,帮我查一下这个帐号和密码!
- Dovecot to MySQL:Hi 美女,这个帐号和密码是正确的呢?!还是正确的呢?!还是……
- MySQL to Dovecot:好啦,你乖啦!我查过啦,这个帐号密码是正确的啦!表卖萌哦,Dovecot君!
- Dovecot to Postfix:大锅,则个帐号密码斯正缺滴!
- Postfix to 邮件客户端:贱人,过来!你给的帐号密码是正确的,允许你发送邮件!
- 邮件客户端将编写好的邮件通过SMTP协议发送给Postfix
- Postfix将收到的邮件转发给对方
以上,大家已经看到邮件收、发的整个过程。接下来看看如何才能成功配置邮件服务器。
DNS配置
首先,你需要有一个域名。本例中假定我们的域名为mydomain.com
,以此为基础去做后续的所有工作。请注意:在DNS相关配置没有成功之前,请勿尝试后续的操作。即使你配置好了Postifx,只要DNS相关配置没有成功,邮件服务器一样不能正常工作。
其次,登录域名管理系统「强烈推荐使用DNSPod做域名管理」,新增几条MX记录指向你的邮件服务器。
第三,关于TTL设置。在测试邮件服务器的过程中,大家大可把TTL时间设置的短一点,这样可以让DNS服务器在很短的时间之内就起作用。当测试阶段过后,请即使将TTL时间设置成较大的值。什么?你问为什么要这样?自己去Google一下看看吧!TTL设置的太短会带来什么安全隐患。
设置完以后,DNS的MX记录及TTL时间大致如下:
1 2 3 4 |
mydomain<span class="hljs-class">.com</span> MX <span class="hljs-number" style="color: #3387cc;">10</span> mydomain<span class="hljs-class">.com</span> mydomain<span class="hljs-class">.com</span> MX <span class="hljs-number" style="color: #3387cc;">10</span> <span class="hljs-number" style="color: #3387cc;">12.34</span>.<span class="hljs-number" style="color: #3387cc;">56.78</span> mail<span class="hljs-class">.mydomain</span><span class="hljs-class">.com</span> MX <span class="hljs-number" style="color: #3387cc;">10</span> <span class="hljs-number" style="color: #3387cc;">12.34</span>.<span class="hljs-number" style="color: #3387cc;">56.78</span> |
SSL证书
关于SSL认证的问题,大家可以根据自己的情况做决定。有人偏向于购买第三方权威的SSL认证,也有人使用OpenSSL自己制作签名。当然,上述两种方法本质上是没有什么区别的,唯一的区别在于:如果是自己制作的SSL证书,大部分的邮件客户端都会弹出提示框询问是否信任等。
修改hostname
哈,终于进入了正题。现在,请大家打开终端「window系统用户可以选择使用putty等ssh工具连接服务器」并连接自己的服务器。
1 2 |
<span class="hljs-title" style="color: #e28964;">ssh</span> username@<span class="hljs-number" style="color: #3387cc;">12.34.56.78</span> |
连接成功以后,请第一时间执行下述命令切换到root用户:
1 2 |
sudo <span class="hljs-operator">-s</span> |
请注意
为什么要切换到root用户?纯属个人爱好,因为我很懒,懒得每次执行命令时在命令的前面带上sudo
这样的参数,因此直接切换到root用户好了。
接下来,在命令行中输入如下命令查看hostname:
1 2 |
<span class="hljs-title" style="color: #e28964;">hostname</span> |
接着,在命令行输入如下命令查看FQDN「fully-qualified domain name」:
1 2 |
hostname <span class="hljs-operator">-f</span> |
将上述两个名称记录下来,安装postfix时你将会使用到。
当然,上述的机器名是可以随时修改的,如果你想要修改,可以直接通过vi编辑器打开/etc/hostname
文件,并将自己想要的机器名写入其中并保存即可
MySQL安装及配置
本例中我们使用MySQL数据库保存Postfix需要服务的虚拟域名、用户帐号及密码、邮件别名三个重要的信息。
请注意:
其实Postfix和Dovecot是完全可以不使用数据库的,二者都可以通过各种配置文件完成「零数据库」的邮件服务器。但是,既然可以使用数据库这么方便,为什么不用呢?将这些需要配置的信息存储在数据库中「如:用户帐号及密码等」,对今后的维护来说是非常方便的事情。不是么?!
MySQL安装
在Ubuntu种安装软件,是再简单不过的事情了。安装MySQL请在命令行中执行如下命令:
1 2 |
apt-get <span class="hljs-operator"><span class="hljs-keyword" style="color: #e28964;">install</span> mysql-<span class="hljs-keyword" style="color: #e28964;">server</span> </span> |
安装过程中会需要你输入两次MySQL的root口令,请牢记该口令
新建数据库及用户
接下来,我们需要新建一个MySQL用户及一个数据库:
- 使用root口令登录MySQL
12mysql -u root -<span class="hljs-tag" style="color: #89bdff;">p</span> - 输入root口令
- 新建一个数据库,名称叫做mailserver:
12<span class="hljs-operator"><span class="hljs-keyword" style="color: #e28964;">create</span> <span class="hljs-keyword" style="color: #e28964;">database</span> mailserver <span class="hljs-built_in">character</span> <span class="hljs-keyword" style="color: #e28964;">set</span> utf8;</span> - 输入如下命令以新建一个用户mailserver,并指定密码为mailserver123:
12<span class="hljs-operator"><span class="hljs-keyword" style="color: #e28964;">create</span> <span class="hljs-keyword" style="color: #e28964;">user</span> mailserver@<span class="hljs-string" style="color: #65b042;">'localhost'</span> <span class="hljs-keyword" style="color: #e28964;">identified</span> <span class="hljs-keyword" style="color: #e28964;">by</span> <span class="hljs-string" style="color: #65b042;">'mailserver123'</span>;</span> - 将数据库mailserver的所有权限赋给用户mailserver:
12<span class="hljs-operator"><span class="hljs-keyword" style="color: #e28964;">grant</span> <span class="hljs-keyword" style="color: #e28964;">all</span> <span class="hljs-keyword" style="color: #e28964;">on</span> mailserver.* <span class="hljs-keyword" style="color: #e28964;">to</span> mailserver@<span class="hljs-string" style="color: #65b042;">'localhost'</span> <span class="hljs-keyword" style="color: #e28964;">identified</span> <span class="hljs-keyword" style="color: #e28964;">by</span> <span class="hljs-string" style="color: #65b042;">'mailserver123'</span>;</span> - 退出root用户:
12<span class="hljs-keyword" style="color: #e28964;">exit</span>; - 使用mailserver用户登录:
12mysql -u mailserver -<span class="hljs-tag" style="color: #89bdff;">p</span> - 输入mailserver帐号的口令
- 将默认数据库切换为mailserver数据库:
12<span class="hljs-keyword" style="color: #e28964;">use</span> <span class="hljs-title" style="color: #89bdff;">mailserver</span>;
新建表格
- 输入如下SQL语句以新建
virtual_domains
表,该表是本地服务器用以接收邮件的域名:
123456<span class="hljs-operator"><span class="hljs-keyword" style="color: #e28964;">CREATE</span> <span class="hljs-keyword" style="color: #e28964;">TABLE</span> <span class="hljs-string" style="color: #65b042;">`virtual_domains`</span> (<span class="hljs-string" style="color: #65b042;">`id`</span> <span class="hljs-built_in">int</span>(<span class="hljs-number" style="color: #3387cc;">11</span>) <span class="hljs-keyword" style="color: #e28964;">NOT</span> <span class="hljs-literal">NULL</span> auto_increment,<span class="hljs-string" style="color: #65b042;">`name`</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number" style="color: #3387cc;">50</span>) <span class="hljs-keyword" style="color: #e28964;">NOT</span> <span class="hljs-literal">NULL</span>,<span class="hljs-keyword" style="color: #e28964;">PRIMARY</span> <span class="hljs-keyword" style="color: #e28964;">KEY</span> (<span class="hljs-string" style="color: #65b042;">`id`</span>))<span class="hljs-keyword" style="color: #e28964;">ENGINE</span>=<span class="hljs-keyword" style="color: #e28964;">InnoDB</span> <span class="hljs-keyword" style="color: #e28964;">DEFAULT</span> <span class="hljs-keyword" style="color: #e28964;">CHARSET</span>=utf8;</span> - 输入如下SQL语句以新建
virtual_users
表,该表邮件服务器的终端用户表,记录用户的邮件地址及密码「千万不要保存明文密码」:
12345678910<span class="hljs-operator"><span class="hljs-keyword" style="color: #e28964;">CREATE</span> <span class="hljs-keyword" style="color: #e28964;">TABLE</span> <span class="hljs-string" style="color: #65b042;">`virtual_users`</span> (<span class="hljs-string" style="color: #65b042;">`id`</span> <span class="hljs-built_in">int</span>(<span class="hljs-number" style="color: #3387cc;">11</span>) <span class="hljs-keyword" style="color: #e28964;">NOT</span> <span class="hljs-literal">NULL</span> auto_increment,<span class="hljs-string" style="color: #65b042;">`domain_id`</span> <span class="hljs-built_in">int</span>(<span class="hljs-number" style="color: #3387cc;">11</span>) <span class="hljs-keyword" style="color: #e28964;">NOT</span> <span class="hljs-literal">NULL</span>,<span class="hljs-string" style="color: #65b042;">`password`</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number" style="color: #3387cc;">106</span>) <span class="hljs-keyword" style="color: #e28964;">NOT</span> <span class="hljs-literal">NULL</span>,<span class="hljs-string" style="color: #65b042;">`email`</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number" style="color: #3387cc;">100</span>) <span class="hljs-keyword" style="color: #e28964;">NOT</span> <span class="hljs-literal">NULL</span>,<span class="hljs-keyword" style="color: #e28964;">PRIMARY</span> <span class="hljs-keyword" style="color: #e28964;">KEY</span> (<span class="hljs-string" style="color: #65b042;">`id`</span>),<span class="hljs-keyword" style="color: #e28964;">UNIQUE</span> <span class="hljs-keyword" style="color: #e28964;">KEY</span> <span class="hljs-string" style="color: #65b042;">`email`</span> (<span class="hljs-string" style="color: #65b042;">`email`</span>),<span class="hljs-keyword" style="color: #e28964;">FOREIGN</span> <span class="hljs-keyword" style="color: #e28964;">KEY</span> (domain_id) <span class="hljs-keyword" style="color: #e28964;">REFERENCES</span> virtual_domains(id) <span class="hljs-keyword" style="color: #e28964;">ON</span> <span class="hljs-keyword" style="color: #e28964;">DELETE</span> <span class="hljs-keyword" style="color: #e28964;">CASCADE</span>)<span class="hljs-keyword" style="color: #e28964;">ENGINE</span>=<span class="hljs-keyword" style="color: #e28964;">InnoDB</span> <span class="hljs-keyword" style="color: #e28964;">DEFAULT</span> <span class="hljs-keyword" style="color: #e28964;">CHARSET</span>=utf8;</span> - 输入如下SQL语句以新建
virtual_aliases
表,该表是邮件服务器别名表「邮件服务器种的别名alias
的概念大家可以Google一番」:
123456789<span class="hljs-operator"><span class="hljs-keyword" style="color: #e28964;">CREATE</span> <span class="hljs-keyword" style="color: #e28964;">TABLE</span> <span class="hljs-string" style="color: #65b042;">`virtual_aliases`</span> (<span class="hljs-string" style="color: #65b042;">`id`</span> <span class="hljs-built_in">int</span>(<span class="hljs-number" style="color: #3387cc;">11</span>) <span class="hljs-keyword" style="color: #e28964;">NOT</span> <span class="hljs-literal">NULL</span> auto_increment,<span class="hljs-string" style="color: #65b042;">`domain_id`</span> <span class="hljs-built_in">int</span>(<span class="hljs-number" style="color: #3387cc;">11</span>) <span class="hljs-keyword" style="color: #e28964;">NOT</span> <span class="hljs-literal">NULL</span>,<span class="hljs-string" style="color: #65b042;">`source`</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number" style="color: #3387cc;">100</span>) <span class="hljs-keyword" style="color: #e28964;">NOT</span> <span class="hljs-literal">NULL</span>,<span class="hljs-string" style="color: #65b042;">`destination`</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number" style="color: #3387cc;">100</span>) <span class="hljs-keyword" style="color: #e28964;">NOT</span> <span class="hljs-literal">NULL</span>,<span class="hljs-keyword" style="color: #e28964;">PRIMARY</span> <span class="hljs-keyword" style="color: #e28964;">KEY</span> (<span class="hljs-string" style="color: #65b042;">`id`</span>),<span class="hljs-keyword" style="color: #e28964;">FOREIGN</span> <span class="hljs-keyword" style="color: #e28964;">KEY</span> (domain_id) <span class="hljs-keyword" style="color: #e28964;">REFERENCES</span> virtual_domains(id) <span class="hljs-keyword" style="color: #e28964;">ON</span> <span class="hljs-keyword" style="color: #e28964;">DELETE</span> <span class="hljs-keyword" style="color: #e28964;">CASCADE</span>)<span class="hljs-keyword" style="color: #e28964;">ENGINE</span>=<span class="hljs-keyword" style="color: #e28964;">InnoDB</span> <span class="hljs-keyword" style="color: #e28964;">DEFAULT</span> <span class="hljs-keyword" style="color: #e28964;">CHARSET</span>=utf8</span>
插入数据
为了便于查看结果,接下来给上述三张表种插入一些测试数据:
- 给
virtual_domains
表插入测试数据,大致如下:123<span class="hljs-operator"><span class="hljs-keyword" style="color: #e28964;">insert</span> <span class="hljs-keyword" style="color: #e28964;">into</span> virtual_domains(id,name) <span class="hljs-keyword" style="color: #e28964;">values</span>(<span class="hljs-number" style="color: #3387cc;">1</span>,<span class="hljs-string" style="color: #65b042;">'mail.mydomain.com'</span>);</span><span class="hljs-operator"><span class="hljs-keyword" style="color: #e28964;">insert</span> <span class="hljs-keyword" style="color: #e28964;">into</span> virtual_domains(id,name) <span class="hljs-keyword" style="color: #e28964;">values</span>(<span class="hljs-number" style="color: #3387cc;">2</span>,<span class="hljs-string" style="color: #65b042;">'mydomain.com'</span>);</span>请注意:
上述表种id字段是自增列,可以不赋值。但无论如何,接下来的两张表种我们将需要上述表种的逐渐列id的值。比如:我将要添加mydomain.com域名下的邮箱帐号,而mydomain.com在virtual_domains
表种的id值为2。 - 给
virtual_users
表添加用户数据:
1234567<span class="hljs-operator"><span class="hljs-keyword" style="color: #e28964;">insert</span> <span class="hljs-keyword" style="color: #e28964;">into</span> virtual_users(id,domain_id,<span class="hljs-keyword" style="color: #e28964;">password</span>,email)<span class="hljs-keyword" style="color: #e28964;">values</span> (<span class="hljs-number" style="color: #3387cc;">1</span>,<span class="hljs-number" style="color: #3387cc;">2</span>,<span class="hljs-keyword" style="color: #e28964;">ENCRYPT</span>(<span class="hljs-string" style="color: #65b042;">'zhangsan123456'</span>, <span class="hljs-keyword" style="color: #e28964;">CONCAT</span>(<span class="hljs-string" style="color: #65b042;">'$7$'</span>, <span class="hljs-keyword" style="color: #e28964;">SUBSTRING</span>(<span class="hljs-keyword" style="color: #e28964;">SHA</span>(<span class="hljs-keyword" style="color: #e28964;">RAND</span>()), -<span class="hljs-number" style="color: #3387cc;">16</span>))),<span class="hljs-string" style="color: #65b042;">'zhangsan@mydomain.com'</span>);</span><span class="hljs-operator"><span class="hljs-keyword" style="color: #e28964;">insert</span> <span class="hljs-keyword" style="color: #e28964;">into</span> virtual_users(id,domain_id,<span class="hljs-keyword" style="color: #e28964;">password</span>,email)<span class="hljs-keyword" style="color: #e28964;">values</span> (<span class="hljs-number" style="color: #3387cc;">2</span>,<span class="hljs-number" style="color: #3387cc;">2</span>,<span class="hljs-keyword" style="color: #e28964;">ENCRYPT</span>(<span class="hljs-string" style="color: #65b042;">'123456lisi'</span>, <span class="hljs-keyword" style="color: #e28964;">CONCAT</span>(<span class="hljs-string" style="color: #65b042;">'$7$'</span>, <span class="hljs-keyword" style="color: #e28964;">SUBSTRING</span>(<span class="hljs-keyword" style="color: #e28964;">SHA</span>(<span class="hljs-keyword" style="color: #e28964;">RAND</span>()), -<span class="hljs-number" style="color: #3387cc;">16</span>))),<span class="hljs-string" style="color: #65b042;">'lisi@mydomain.com'</span>);</span> - 给
virtual_aliases
表添加别名数据:
123456<span class="hljs-operator"><span class="hljs-keyword" style="color: #e28964;">insert</span> <span class="hljs-keyword" style="color: #e28964;">into</span> virtual_aliases(id,domain_id,source,destination)<span class="hljs-keyword" style="color: #e28964;">values</span> (<span class="hljs-number" style="color: #3387cc;">1</span>,<span class="hljs-number" style="color: #3387cc;">2</span>,<span class="hljs-string" style="color: #65b042;">'all@mydomain.com'</span>,<span class="hljs-string" style="color: #65b042;">'zhangsan@mydomain.com'</span>);</span><span class="hljs-operator"><span class="hljs-keyword" style="color: #e28964;">insert</span> <span class="hljs-keyword" style="color: #e28964;">into</span> virtual_aliases(id,domain_id,source,destination)<span class="hljs-keyword" style="color: #e28964;">values</span> (<span class="hljs-number" style="color: #3387cc;">1</span>,<span class="hljs-number" style="color: #3387cc;">2</span>,<span class="hljs-string" style="color: #65b042;">'all@mydomain.com'</span>,<span class="hljs-string" style="color: #65b042;">'lisi@mydomain.com'</span>);</span>请注意:
通过上述别名表的数据,当有人给all@mydomain.com
发送邮件时,系统将自动将邮件转发给zhangsan@mydomain.com
和lisi@mydomain.com
这种场景,在公司内部「发送通知」等情况下适用
测试数据
写几个SQL查询语句查看下结果吧
1 2 3 4 |
<span class="hljs-operator"><span class="hljs-keyword" style="color: #e28964;">select</span> * <span class="hljs-keyword" style="color: #e28964;">from</span> virtual_domains;</span> <span class="hljs-operator"><span class="hljs-keyword" style="color: #e28964;">select</span> * <span class="hljs-keyword" style="color: #e28964;">from</span> virtual_users;</span> <span class="hljs-operator"><span class="hljs-keyword" style="color: #e28964;">select</span> * <span class="hljs-keyword" style="color: #e28964;">from</span> virtual_aliases;</span> |
Postfix安装及配置
Postfix是邮件发送的核心服务器,所有向内、向外投递的邮件都需要经过Postfix通过SMTP协议完成。接下来的内容,大家需要修改Postfix相关的一些参数,它们是:
- 告诉Postfix如何连接MySQL数据库,并让Postfix通过数据库种的表确定收发邮件的域名、用户帐号及密码、邮件别名等
- 告诉Postfix将收到的邮件转发给Dovecot的LMTP服务以完成本地投递
- 告诉Postfix所有的连接都需要STARTTLS加密,如果有必要「废话啊,当然必须这样」
- 开放本地端口25、465、587之一或全部
Postfix的安装
在命令行种执行以下命令以安装Postfix:
1 2 |
apt-<span class="hljs-keyword" style="color: #e28964;">get</span> install <span class="hljs-keyword" style="color: #e28964;">postfix</span> <span class="hljs-keyword" style="color: #e28964;">postfix</span>-mysql |
安装过程中需要选择Postfix的类型,请选择Internet Site
:
Postfix安装过程中还会需要输入System mail name,这里请输入你要收发邮件的域名地址「随便写也可以,反正后面需要修改配置文件」
Postfix的配置
- 备份Postfix的配置文件
/etc/postfix/main.cf
,先!
12cp /etc/postfix/main<span class="hljs-class">.cf</span> /etc/postfix/main<span class="hljs-class">.cf_backup_20150511</span>请注意
任何时候,对任何配置进行修改之前,先做好备份总是非常必要的
同时,这也是一个非常良好的操作习惯 - 使用vi编辑器打开
/etc/postfix/main.cf
文件
12vi /etc/postfix/main<span class="hljs-class">.cf</span> - 打开之后,按下
i
键进入编辑模式 - 鉴于我们没有打算使用Postfix做用户的权限验证「上述几个图种已经展示清楚」,我们将要把Postfix默认的用户验证参数屏蔽,因此请在如下几行前边加入
#
符号以注释:
123456# <span class="hljs-class">TLS</span> parameters<span class="hljs-symbol" style="color: #3387cc;">#smtpd_tls_cert_file</span>=/etc/ssl/certs/ssl-cert-snakeoil.pem<span class="hljs-symbol" style="color: #3387cc;">#smtpd_tls_key_file</span>=/etc/ssl/private/ssl-cert-snakeoil.key <span class="hljs-symbol" style="color: #3387cc;">#smtpd_use_tls</span>=yes<span class="hljs-symbol" style="color: #3387cc;">#smtpd_tls_session_cache_database</span> = <span class="hljs-method">btree:</span><span class="hljs-char">${</span>data_directory}/smtpd_scache<span class="hljs-symbol" style="color: #3387cc;">#smtp_tls_session_cache_database</span> = <span class="hljs-method">btree:</span><span class="hljs-char">${</span>data_directory}/smtp_scache - 复制如下内容,并将其插入到上述注释代码之后:
1234567891011<span class="hljs-constant">smtpd_tls_cert_file</span>=/etc/dovecot/dovecot.pem<span class="hljs-constant">smtpd_tls_key_file</span>=/etc/dovecot/private/dovecot.pem<span class="hljs-constant">smtpd_use_tls</span>=yes<span class="hljs-constant">smtpd_tls_auth_only</span> = yes<span class="hljs-comment" style="font-style: italic; color: #aeaeae;">#Enabling SMTP for authenticated users, and handing off authentication to Dovecot </span><span class="hljs-constant">smtpd_sasl_type</span> = dovecot<span class="hljs-constant">smtpd_sasl_path</span> = private/auth<span class="hljs-constant">smtpd_sasl_auth_enable</span> = yes<span class="hljs-constant">smtpd_recipient_restrictions</span> = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination请注意:
上述几个参数的含义,请参照Postfix配置文档 - 按照如下方式修改
mydestination
一行的值:
12<span class="hljs-attribute">mydestination </span>=<span class="hljs-string" style="color: #65b042;"> localhost</span>请注意:
将mydestination
的值修改为localhost,以便Postfix能够通过MySQL表中相关数据决定需要接受/发送邮件的域名,这样更具有通用性 - 在文档种加入以下内容,以便告诉Postfix不要使用LDA「Local Delivery Agent」转而使用Dovecot的LMTP完成本地邮件投递:
123#Handing off local delivery <span class="hljs-keyword" style="color: #e28964;">to</span> Dovecot's LMTP, <span class="hljs-keyword" style="color: #e28964;">and</span> telling it where <span class="hljs-keyword" style="color: #e28964;">to</span> store mailvirtual_transport = lmtp:unix:<span class="hljs-keyword" style="color: #e28964;">private</span>/dovecot-lmtp - 在文档中加入以下内容,以便告诉Postfix去MySQL数据库种寻找域名、用户帐号密码及邮件别名等信息:
12345<span class="hljs-id">#Virtual</span> domains, users, and aliasesvirtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains<span class="hljs-class">.cf</span>virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps<span class="hljs-class">.cf</span>virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps<span class="hljs-class">.cf</span> - 最终,修改完成以后的
/etc/postfix/main.cf
文件大致应该如下:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061<span class="hljs-comment" style="font-style: italic; color: #aeaeae;"># See /usr/share/postfix/main.cf.dist for a commented, more complete version </span><span class="hljs-comment" style="font-style: italic; color: #aeaeae;"># Debian specific: Specifying a file name will cause the first </span><span class="hljs-comment" style="font-style: italic; color: #aeaeae;"># line of that file to be used as the name. The Debian default </span><span class="hljs-comment" style="font-style: italic; color: #aeaeae;"># is /etc/mailname. </span><span class="hljs-comment" style="font-style: italic; color: #aeaeae;">#myorigin = /etc/mailname </span><span class="hljs-variable" style="color: #3e87e3;">smtpd_banner =</span> $myhostname ESMTP $mail_name (Ubuntu)<span class="hljs-variable" style="color: #3e87e3;">biff =</span> no<span class="hljs-comment" style="font-style: italic; color: #aeaeae;"># appending .domain is the MUA's job. </span><span class="hljs-variable" style="color: #3e87e3;">append_dot_mydomain =</span> no<span class="hljs-comment" style="font-style: italic; color: #aeaeae;"># Uncomment the next line to generate "delayed mail" warnings </span><span class="hljs-comment" style="font-style: italic; color: #aeaeae;">#delay_warning_time = 4h </span><span class="hljs-variable" style="color: #3e87e3;">readme_directory =</span> no<span class="hljs-comment" style="font-style: italic; color: #aeaeae;"># TLS parameters </span><span class="hljs-comment" style="font-style: italic; color: #aeaeae;">#smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem </span><span class="hljs-comment" style="font-style: italic; color: #aeaeae;">#smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key </span><span class="hljs-comment" style="font-style: italic; color: #aeaeae;">#smtpd_use_tls=yes </span><span class="hljs-comment" style="font-style: italic; color: #aeaeae;">#smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache </span><span class="hljs-comment" style="font-style: italic; color: #aeaeae;">#smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache </span><span class="hljs-variable" style="color: #3e87e3;">smtpd_tls_cert_file=</span>/etc/dovecot/dovecot.pem<span class="hljs-variable" style="color: #3e87e3;">smtpd_tls_key_file=</span>/etc/dovecot/private/dovecot.pem<span class="hljs-variable" style="color: #3e87e3;">smtpd_use_tls=</span>yes<span class="hljs-variable" style="color: #3e87e3;">smtpd_tls_auth_only =</span> yes<span class="hljs-comment" style="font-style: italic; color: #aeaeae;">#Enabling SMTP for authenticated users, and handing off authentication to Dovecot </span><span class="hljs-variable" style="color: #3e87e3;">smtpd_sasl_type =</span> dovecot<span class="hljs-variable" style="color: #3e87e3;">smtpd_sasl_path =</span> private/auth<span class="hljs-variable" style="color: #3e87e3;">smtpd_sasl_auth_enable =</span> yes<span class="hljs-variable" style="color: #3e87e3;">smtpd_recipient_restrictions =</span>permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination<span class="hljs-comment" style="font-style: italic; color: #aeaeae;"># See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for </span><span class="hljs-comment" style="font-style: italic; color: #aeaeae;"># information on enabling SSL in the smtp client. </span><span class="hljs-variable" style="color: #3e87e3;">myhostname =</span> host.mydomain.com<span class="hljs-variable" style="color: #3e87e3;">alias_maps =</span> hash:/etc/aliases<span class="hljs-variable" style="color: #3e87e3;">alias_database =</span> hash:/etc/aliases<span class="hljs-variable" style="color: #3e87e3;">myorigin =</span> /etc/mailname<span class="hljs-comment" style="font-style: italic; color: #aeaeae;">#mydestination = example.com, hostname.mydomain.com,localhost.mydomain.com, localhost </span><span class="hljs-variable" style="color: #3e87e3;">mydestination =</span> localhost<span class="hljs-variable" style="color: #3e87e3;">relayhost =</span><span class="hljs-variable" style="color: #3e87e3;">mynetworks =</span> <span class="hljs-number" style="color: #3387cc;">127.0</span>.<span class="hljs-number" style="color: #3387cc;">0.0</span>/<span class="hljs-number" style="color: #3387cc;">8</span> [::ffff:<span class="hljs-number" style="color: #3387cc;">127.0</span>.<span class="hljs-number" style="color: #3387cc;">0.0</span>]/<span class="hljs-number" style="color: #3387cc;">104</span> [::<span class="hljs-number" style="color: #3387cc;">1</span>]/<span class="hljs-number" style="color: #3387cc;">128</span><span class="hljs-variable" style="color: #3e87e3;">mailbox_size_limit =</span> <span class="hljs-number" style="color: #3387cc;">0</span><span class="hljs-variable" style="color: #3e87e3;">recipient_delimiter =</span> +<span class="hljs-variable" style="color: #3e87e3;">inet_interfaces =</span> all<span class="hljs-comment" style="font-style: italic; color: #aeaeae;">#Handing off local delivery to Dovecot's LMTP, and telling it where to store mail </span><span class="hljs-variable" style="color: #3e87e3;">virtual_transport =</span> lmtp:unix:private/dovecot-lmtp<span class="hljs-comment" style="font-style: italic; color: #aeaeae;">#Virtual domains, users, and aliases </span><span class="hljs-variable" style="color: #3e87e3;">virtual_mailbox_domains =</span> mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf<span class="hljs-variable" style="color: #3e87e3;">virtual_mailbox_maps =</span> mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf<span class="hljs-variable" style="color: #3e87e3;">virtual_alias_maps =</span> mysql:/etc/postfix/mysql-virtual-alias-maps.cf - 按下
ESC
键并输入如下内容以保存并退出
12<span class="hljs-function_or_atom">wq</span><span class="hljs-exclamation_mark">!</span> - 新建
/etc/postfix/mysql-virtual-mailbox-domains.cf
文件并输入如下内容:
123456<span class="hljs-variable" style="color: #3e87e3;">user =</span> mailserver<span class="hljs-variable" style="color: #3e87e3;">password =</span> mailserver123<span class="hljs-variable" style="color: #3e87e3;">hosts =</span> <span class="hljs-number" style="color: #3387cc;">127.0</span>.<span class="hljs-number" style="color: #3387cc;">0.1</span><span class="hljs-variable" style="color: #3e87e3;">dbname =</span> mailserver<span class="hljs-variable" style="color: #3e87e3;">query =</span> SELECT <span class="hljs-number" style="color: #3387cc;">1</span> FROM virtual_domains WHERE <span class="hljs-variable" style="color: #3e87e3;">name=</span>'%s' - 重启Postfix服务
12<span class="hljs-keyword" style="color: #e28964;">service</span> postfix <span class="hljs-literal">restart</span> - 测试上述内容是否正确,如果上述内容配置正确,则如下命令执行后返回结果应该为
1
:
12postmap -<span class="hljs-tag" style="color: #89bdff;">q</span> mydomain<span class="hljs-class">.com</span> mysql:/etc/postfix/mysql-virtual-mailbox-domains<span class="hljs-class">.cf</span> - 新建
/etc/postfix/mysql-virtual-mailbox-maps.cf
文件并输入如下内容:
123456<span class="hljs-variable" style="color: #3e87e3;">user =</span> mailserver<span class="hljs-variable" style="color: #3e87e3;">password =</span> mailserver123<span class="hljs-variable" style="color: #3e87e3;">hosts =</span> <span class="hljs-number" style="color: #3387cc;">127.0</span>.<span class="hljs-number" style="color: #3387cc;">0.1</span><span class="hljs-variable" style="color: #3e87e3;">dbname =</span> mailserver<span class="hljs-variable" style="color: #3e87e3;">query =</span> SELECT <span class="hljs-number" style="color: #3387cc;">1</span> FROM virtual_users WHERE <span class="hljs-variable" style="color: #3e87e3;">email=</span>'%s' - 重启Postfix服务
12<span class="hljs-keyword" style="color: #e28964;">service</span> postfix <span class="hljs-literal">restart</span> - 测试上述配置是否正确,如果上述内容配置正确,则如下命令执行后返回结果应该为
1
:
12postmap -<span class="hljs-tag" style="color: #89bdff;">q</span> lisi@mydomain<span class="hljs-class">.com</span> mysql:/etc/postfix/mysql-virtual-mailbox-maps<span class="hljs-class">.cf</span> - 新建
/etc/postfix/mysql-virtual-alias-maps.cf
文件并输入如下内容:
123456<span class="hljs-variable" style="color: #3e87e3;">user =</span> mailserver<span class="hljs-variable" style="color: #3e87e3;">password =</span> mailserver123<span class="hljs-variable" style="color: #3e87e3;">hosts =</span> <span class="hljs-number" style="color: #3387cc;">127.0</span>.<span class="hljs-number" style="color: #3387cc;">0.1</span><span class="hljs-variable" style="color: #3e87e3;">dbname =</span> mailserver<span class="hljs-variable" style="color: #3e87e3;">query =</span> SELECT destination FROM virtual_aliases WHERE <span class="hljs-variable" style="color: #3e87e3;">source=</span>'%s' - 重启Postfix服务
12<span class="hljs-keyword" style="color: #e28964;">service</span> postfix <span class="hljs-literal">restart</span> - 测试上述配置是否正确,如果上述配置正确,则如下命令执行后返回结果应该是之前添加的别名帐号:
12postmap -<span class="hljs-tag" style="color: #89bdff;">q</span> all@mydomain<span class="hljs-class">.com</span> mysql:/etc/postfix/mysql-virtual-alias-maps<span class="hljs-class">.cf</span> - 使用vi编辑器打开
/etc/postfix/master.cf
文件「请注意修改之前先备份」,找到submission
和smtps
所在的两行,并将其注释去掉。这样做的目的是允许Postfix通过587和465端口发送邮件 - 重启Postfix服务
12<span class="hljs-keyword" style="color: #e28964;">service</span> postfix <span class="hljs-literal">restart</span>
搞定,Postfix服务器应该配置完成了。相信到这里的时候,已经吓走了90%以上的朋友,剩下的10%朋友们,你们是好样的。
Dovecot安装及配置
Dovecot在本例中充当IMAP、POP服务器的角色,同时它也将负责用户登录时用户身份的验证「Dovecot会将真正的验证工作交给MySQL处理」。因为使用SSL,Dovecot将会使用993「IMAP协议」及995「POP协议」与外界交流,若服务器有iptable之类的玩意儿,请开放相关端口。
这部分的内容配置起来相对简单,但是需要配置的文件繁多。大体上,我们需要配置如下的信息:
- 开启Dovecot的IMAP、POP3、LMTP协议
- 告知Dovecot本地邮件的投档路径
- 连接Dovecot和MySQL数据库以验证用户身份
- 配置SSL加密相关信息
Dovecot的安装
通过如下命令安装Dovecot最新版:
1 2 |
apt-<span class="hljs-keyword" style="color: #e28964;">get</span> install dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql |
Dovecot的配置
需要修改的配置文件有:
/etc/dovecot/dovecot.conf
Dovecot的主配置文件/etc/dovecot/conf.d/10-mail.conf
Dovecot将要操作的磁盘路径相关配置信息/etc/dovecot/conf.d/10-auth.conf
用户验证相关配置信息/etc/dovecot/conf.d/auth-sql.conf.ext
SQL-Type验证相关配置信息/etc/dovecot/dovecot-sql.conf.ext
Dovecot与数据库连接相关配置信息/etc/dovecot/conf.d/10-master.conf
Dovecot本地socket相关配置信息/etc/dovecot/conf.d/10-ssl.conf
关于SSL的相关配置信息
请注意:
在修改上述文件之前,请一定先做好备份以方便恢复
修改/etc/dovecot/dovecot.conf
文件
使用vi编辑器打开/etc/dovecot/dovecot.conf
文件并在文件种加入如下内容:
1 2 3 4 5 6 |
!include conf.d/<span class="hljs-keyword" style="color: #e28964;">*</span>.conf <span class="hljs-comment" style="font-style: italic; color: #aeaeae;"># Enable installed </span> protocols!include_try /usr/share/dovecot/protocols.d/<span class="hljs-keyword" style="color: #e28964;">*</span>.protocol protocols = imap pop3 lmtp |
如果以上内容已经存在,只需要把该行的#
号去掉即可
上述内容大致的意思是:告诉Dovecot启用所有.conf
文件;并开启Dovecot的imap、pop3、lmtp等相关协议使之正常工作
修改/etc/dovecot/conf.d/10-mail.conf
文件
打开文件并找到mail_location
相关信息,将其指定到本地磁盘的某个路径,这个路径将来会存放收到的邮件,如下所示:
1 2 |
mail_location = <span class="hljs-string" style="color: #65b042;">maildir:</span><span class="hljs-regexp" style="color: #e9c062;">/var/</span>mail<span class="hljs-regexp" style="color: #e9c062;">/vhosts/</span>%d/%n |
同时,找到文件中mail_privileged_group
相关信息并将起修改为:
1 2 |
<span class="hljs-attribute">mail_privileged_group </span>=<span class="hljs-string" style="color: #65b042;"> mail </span> |
保存文件并退出
在命令行种输入如下内容以查看/var/mail
路径的权限:
1 2 |
<span class="hljs-keyword" style="color: #e28964;">ls</span> -ld /<span class="hljs-keyword" style="color: #e28964;">var</span>/mail |
显示的内容大致应该是:
1 2 |
drwxrwsr-x <span class="hljs-number" style="color: #3387cc;">2</span> root mail <span class="hljs-number" style="color: #3387cc;">4096</span> May <span class="hljs-number" style="color: #3387cc;">11</span> <span class="hljs-number" style="color: #3387cc;">15</span>:<span class="hljs-number" style="color: #3387cc;">08</span> /<span class="hljs-keyword" style="color: #e28964;">var</span>/mail |
创建/var/mail/vhosts/
文件夹给每个需要启用的域名:
1 2 |
mkdir -<span class="hljs-tag" style="color: #89bdff;">p</span> /var/mail/vhosts/mydomain<span class="hljs-class">.com</span> |
输入如下命令以新建vmail
用户组及用户并赋权限
1 2 3 |
groupadd -<span class="hljs-keyword" style="color: #e28964;">g</span> 5000 vmail useradd -<span class="hljs-keyword" style="color: #e28964;">g</span> vmail -<span class="hljs-keyword" style="color: #e28964;">u</span> 5000 vmail -<span class="hljs-keyword" style="color: #e28964;">d</span> /<span class="hljs-keyword" style="color: #e28964;">var</span>/mail |
接下来修改一下/var/mail/
目录的权限,使vmail
能够访问:
1 2 |
chown -R <span class="hljs-string" style="color: #65b042;">vmail:</span>vmail <span class="hljs-regexp" style="color: #e9c062;">/var/</span>mail |
修改/etc/dovecot/conf.d/10-auth.conf
文件
找到文件中disable_plaintext_auth
并取消注释
1 2 |
<span class="hljs-setting">disable_plaintext_auth = <span class="hljs-value"><span class="hljs-keyword" style="color: #e28964;">yes</span></span></span> |
找到文件中auth_mechanisms
并将其修改为如下值:
1 2 |
<span class="hljs-attribute">auth_mechanisms </span>=<span class="hljs-string" style="color: #65b042;"> plain login </span> |
默认情况下,Dovecot是允许Ubuntu系统用户登录使用的,我们需要将其禁用。找到文件种如下内容并将其注释:
1 2 |
<span class="hljs-shebang" style="color: #89bdff;">#!include auth-system.conf.ext</span> |
开启Dovecot的MySQL支持,取消!include auth-sql.conf.ext
的注释符号:
1 2 3 4 5 6 7 8 |
<span class="hljs-shebang" style="color: #89bdff;">#!include auth-system.conf.ext </span> !include auth-sql.conf.ext <span class="hljs-shebang" style="color: #89bdff;">#!include auth-ldap.conf.ext </span> <span class="hljs-shebang" style="color: #89bdff;">#!include auth-passwdfile.conf.ext </span> <span class="hljs-shebang" style="color: #89bdff;">#!include auth-checkpassword.conf.ext </span> <span class="hljs-shebang" style="color: #89bdff;">#!include auth-vpopmail.conf.ext </span> <span class="hljs-shebang" style="color: #89bdff;">#!include auth-static.conf.ext</span> |
修改/etc/dovecot/conf.d/auth-sql.conf.ext
文件
在文件中加入如下内容:
1 2 3 4 5 6 7 8 9 10 |
passdb { <span class="hljs-variable" style="color: #3e87e3;">driver =</span> sql <span class="hljs-variable" style="color: #3e87e3;">args =</span> /etc/dovecot/dovecot-sql.conf.ext } userdb { <span class="hljs-variable" style="color: #3e87e3;">driver =</span> static <span class="hljs-variable" style="color: #3e87e3;">args =</span> <span class="hljs-variable" style="color: #3e87e3;">uid=</span>vmail <span class="hljs-variable" style="color: #3e87e3;">gid=</span>vmail <span class="hljs-variable" style="color: #3e87e3;">home=</span>/var/mail/vhosts/%d/%n } |
修改/etc/dovecot/dovecot-sql.conf.ext
文件
取消文件中driver
行的注释,并将其修改为如下:
1 2 |
<span class="hljs-attribute">driver </span>=<span class="hljs-string" style="color: #65b042;"> mysql </span> |
取消文件中connect
行的注释,并将其修改为如下:
1 2 |
<span class="hljs-variable" style="color: #3e87e3;">connect =</span> <span class="hljs-variable" style="color: #3e87e3;">host=</span><span class="hljs-number" style="color: #3387cc;">127.0</span>.<span class="hljs-number" style="color: #3387cc;">0.1</span> <span class="hljs-variable" style="color: #3e87e3;">dbname=</span>mailserver <span class="hljs-variable" style="color: #3e87e3;">user=</span>mailserver <span class="hljs-variable" style="color: #3e87e3;">password=</span>mailserver123 |
取消文件中default_pass_scheme
行的注释,并将其修改为如下:
1 2 |
<span class="hljs-attribute">default_pass_scheme </span>=<span class="hljs-string" style="color: #65b042;"> SHA512-CRYPT </span> |
取消文件中password_query
行的注释,并将起修改为如下:
1 2 |
password_query = <span class="hljs-operator"><span class="hljs-keyword" style="color: #e28964;">SELECT</span> email <span class="hljs-keyword" style="color: #e28964;">as</span> <span class="hljs-keyword" style="color: #e28964;">user</span>, <span class="hljs-keyword" style="color: #e28964;">password</span> <span class="hljs-keyword" style="color: #e28964;">FROM</span> virtual_users <span class="hljs-keyword" style="color: #e28964;">WHERE</span> email=<span class="hljs-string" style="color: #65b042;">'%u'</span>;</span> |
保存退出
在命令行种输入如下内容以修改目录权限:
1 2 3 4 |
chown -R <span class="hljs-string" style="color: #65b042;">vmail:</span>dovecot <span class="hljs-regexp" style="color: #e9c062;">/etc/</span>dovecot chmod -R o-rwx <span class="hljs-regexp" style="color: #e9c062;">/etc/</span>dovecot |
修改/etc/dovecot/conf.d/10-master.conf
文件
打开文件做如下修改「通过将端口设置为0,以禁用非SSL加密的IMAP和POP3协议」:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
service imap-login { inet_listener imap { port = <span class="hljs-number" style="color: #3387cc;">0</span> } <span class="hljs-keyword" style="color: #e28964;">...</span> } service pop3-login { inet_listener pop3 { port = <span class="hljs-number" style="color: #3387cc;">0</span> } <span class="hljs-keyword" style="color: #e28964;">...</span> } |
找到文件中的service lmtp
并将其修改如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="hljs-title" style="color: #e28964;">service</span> lmtp { <span class="hljs-title" style="color: #e28964;">unix_listener</span> /var/spool/postfix/private/dovecot-lmtp { <span class="hljs-title" style="color: #e28964;">mode</span> = <span class="hljs-number" style="color: #3387cc;">0600</span> user = postfix group = postfix } <span class="hljs-comment" style="font-style: italic; color: #aeaeae;"># Create inet listener only if you can't use the above UNIX socket </span> <span class="hljs-comment" style="font-style: italic; color: #aeaeae;">#inet_listener lmtp { </span> <span class="hljs-comment" style="font-style: italic; color: #aeaeae;">#Avoid making LMTP visible for the entire internet </span> <span class="hljs-comment" style="font-style: italic; color: #aeaeae;">#address = </span> <span class="hljs-comment" style="font-style: italic; color: #aeaeae;">#port = </span> <span class="hljs-comment" style="font-style: italic; color: #aeaeae;">#} </span> } |
找到文件中service auth
并将其内容修改如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
service auth { <span class="hljs-comment" style="font-style: italic; color: #aeaeae;"># auth_socket_path points to this userdb socket by default. It's typically </span> <span class="hljs-comment" style="font-style: italic; color: #aeaeae;"># used by dovecot-lda, doveadm, possibly imap process, etc. Its default </span> <span class="hljs-comment" style="font-style: italic; color: #aeaeae;"># permissions make it readable only by root, but you may need to relax these </span> <span class="hljs-comment" style="font-style: italic; color: #aeaeae;"># permissions. Users that have access to this socket are able to get a list </span> <span class="hljs-comment" style="font-style: italic; color: #aeaeae;"># of all usernames and get results of everyone's userdb lookups. </span> unix_listener /var/spool/postfix/private/auth { mode = 0666 <span class="hljs-built_in">user</span> = postfix group = postfix } unix_listener auth-userdb { mode = 0600 <span class="hljs-built_in">user</span> = vmail <span class="hljs-comment" style="font-style: italic; color: #aeaeae;">#group = </span> } <span class="hljs-comment" style="font-style: italic; color: #aeaeae;"># Postfix smtp-auth </span> <span class="hljs-comment" style="font-style: italic; color: #aeaeae;">#unix_listener /var/spool/postfix/private/auth { </span> <span class="hljs-comment" style="font-style: italic; color: #aeaeae;"># mode = 0666 </span> <span class="hljs-comment" style="font-style: italic; color: #aeaeae;">#} </span> <span class="hljs-comment" style="font-style: italic; color: #aeaeae;"># Auth process is run as this user. </span> <span class="hljs-built_in">user</span> = dovecot } |
找到文件中service auth-worker
内容并修改如下:
1 2 3 4 5 6 7 8 |
service auth-worker { <span class="hljs-comment" style="font-style: italic; color: #aeaeae;"># Auth worker process is run as root by default, so that it can access </span> <span class="hljs-comment" style="font-style: italic; color: #aeaeae;"># /etc/shadow. If this isn't necessary, the user should be changed to </span> <span class="hljs-comment" style="font-style: italic; color: #aeaeae;"># $default_internal_user. </span> <span class="hljs-built_in">user</span> = vmail } |
修改/etc/dovecot/conf.d/10-ssl.conf
文件
找到文件中ssl_cert
并修改内容如下「请确保dovecot的pem文件已经存在,如果大家使用了自己的SSL文件,请将如下内容修改为相应的路径」:
1 2 3 |
ssl_cert = </etc/dovecot/dovecot<span class="hljs-class">.pem</span> ssl_key = </etc/dovecot/private/dovecot<span class="hljs-class">.pem</span> |
强制用户使用SSL加密:
1 2 |
<span class="hljs-attribute">ssl </span>=<span class="hljs-string" style="color: #65b042;"> required </span> |
重新启动Dovecot服务:
1 2 |
<span class="hljs-keyword" style="color: #e28964;">service</span> dovecot <span class="hljs-literal">restart</span> |
测试邮件服务器是否正常
设置一个帐号,可以向MySQL对应的表中插入数据,接下来使用邮件客户端来测试一下。推荐使用Thunderbird
邮件客户端或者Foxmail
客户端等。请注意以下内容:
- 邮箱的全称「包括后面的@mydomain.com」将作为用户名
- 邮箱密码是MySQL数据库种对应邮箱的密码
- 服务器相关接口是否全部开放?993、995、25等
- 邮件收发的所有协议,包括IMAP、POP3、SMTP全部都需要开启SSL加密
配置好客户端之后即可连接获取、发送邮件。
学习日记,兼职软件设计,软件修改,毕业设计。
本文出自 学习日记,转载时请注明出处及相应链接。
本文永久链接: https://www.softwareace.cn/?p=1325