首页 > 数据库 >【验】Postfix+Dovecot+MySQL搭建邮件服务器

【验】Postfix+Dovecot+MySQL搭建邮件服务器

时间:2023-09-11 16:01:16浏览次数:55  
标签:dovecot Postfix MySQL etc smtpd Dovecot 邮件


网上有很多使用Postfix搭建邮件服务器的文章,但目前貌似没有看到较为完整的一篇。本例将尝试在Ubuntu系统中使用Postfix+Dovecot+MySQL搭建邮件服务器。

说到邮件服务器,网上有许多不同解决方案。Window操作系统下常见的邮件服务器有hMailServerMailEnableEVOMailServerApache James(纯Java跨平台)等。

而在Linux/Unix系统中常用的邮件服务器也有不少选择,最经典也是最常见的莫过于Postfix。这篇文章将会讲述如何在Ubuntu系统之下,通过PostfixDovecotMySQL整合实现普通意义上「邮件服务器」的大部分功能。

开始之前

配置邮件服务器并不是一项简单的工作,其过程不仅需要一定的技术能力,同时也需要大家具有一定的耐心,同时也需要大家非常细心。为了能够「看懂」并「最终实践」这篇文章,大家还需要了解或掌握以下知识:

  • 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是如何相互协作以实现邮件服务器的各项功能。我们假设 张三通过os.net的邮箱[email protected]发送一份邮件给 李四[email protected],则服务器接收邮件的过程大致如下图所示:

【验】Postfix+Dovecot+MySQL搭建邮件服务器_邮件服务器

  1. [email protected]发送邮件到[email protected]
  2. os.net服务器会通过DNS查询mydomain.com的MX记录并找到Postfix所在的服务器
  3. 邮件被发送给Postfix
  4. Postfix转向MySQL求助,以查询mydomain.com是不是需要处理的域名
  5. MySQL返回确认信息给Postfix
  6. Postfix将接受到的邮件投递给Dovecot的LMTP服务以便做处理
  7. Dovecot将邮件内容保存到[email protected]用户对应的磁盘路径

用户查收邮件的过程

上述例子中我们看到了服务器接收邮件的过程,接下来我们看看,当大家通过用户名密码登录邮箱查看邮件时,会发生什么事情:

【验】Postfix+Dovecot+MySQL搭建邮件服务器_MySQL_02

  1. 邮件客户端 to Dovecot:尊敬的Dovecot大人,您好!我阔以建立一个IMAP加密连接吗?
  2. Dovecot to 邮件客户端:当然阔以。这是我的SSL证书,请您告诉我帐号和密码!
  3. 邮件客户端 to Dovecot:好滴!这是我的用户名和密码,千万不要告诉别人哦!
  4. Dovecot to MySQL:Hi 美女!请问下,这个用户名和密码是正确的嘛?
  5. MySQL to Dovecot:好的,请稍后!呃……这个用户名和密码是正确的哦!
  6. Dovecot打开存放在本地磁盘/var/mail/mydomain.com/llisi的mailbox
  7. Dovecot获取到最新的邮件及其他相关信息
  8. Dovecot将邮件及其相关的其他信息通过IMAP协议发送给客户端

用户发送邮件的过程

查收了最新的邮件之后,李四[email protected]发现张三给他发来了邮件。现在,李四回复一封邮件给张三,会发生什么事情:

【验】Postfix+Dovecot+MySQL搭建邮件服务器_服务器_03

  1. 邮件客户端 to Postfix:尊敬的Postfix大人,您好!我阔以建立一个安全的SMTP连接嘛?
  2. Postfix to 邮件客户端:说人话!可以就是可以,干嘛要说「阔以」啊!你丫贱啊,找抽啊!想建立SMTP连接可以,不过要加密。这是我的SSL证书,告诉我你的帐号和密码,你个贱人!
  3. 邮件客户端 to Postfix:对不起,大人,我错鸟!这是我的帐号和密码,不要告诉别人哦!
  4. Postfix to Dovecot:Hi 帅哥,帮我查一下这个帐号和密码!
  5. Dovecot to MySQL:Hi 美女,这个帐号和密码是正确的呢?!还是正确的呢?!还是……
  6. MySQL to Dovecot:好啦,你乖啦!我查过啦,这个帐号密码是正确的啦!表卖萌哦,Dovecot君!
  7. Dovecot to Postfix:大锅,则个帐号密码斯正缺滴!
  8. Postfix to 邮件客户端:贱人,过来!你给的帐号密码是正确的,允许你发送邮件!
  9. 邮件客户端将编写好的邮件通过SMTP协议发送给Postfix
  10. Postfix将收到的邮件转发给对方

以上,大家已经看到邮件收、发的整个过程。接下来看看如何才能成功配置邮件服务器。

DNS配置

首先,你需要有一个域名。本例中假定我们的域名为mydomain.com,以此为基础去做后续的所有工作。请注意:在DNS相关配置没有成功之前,请勿尝试后续的操作。即使你配置好了Postifx,只要DNS相关配置没有成功,邮件服务器一样不能正常工作。

其次,登录域名管理系统「强烈推荐使用DNSPod做域名管理」,新增几条MX记录指向你的邮件服务器。

第三,关于TTL设置。在测试邮件服务器的过程中,大家大可把TTL时间设置的短一点,这样可以让DNS服务器在很短的时间之内就起作用。当测试阶段过后,请即使将TTL时间设置成较大的值。什么?你问为什么要这样?自己去Google一下看看吧!TTL设置的太短会带来什么安全隐患。

设置完以后,DNS的MX记录及TTL时间大致如下:

mydomain.com         MX     10      mydomain.com    
mydomain.com            MX      10      12.34.56.78  
mail.mydomain.com    MX     10      12.34.56.78

其它文章推荐dns地址:(setup domain)

如果需要搭建自己的本地dns,可以参考dnsmasq

SSL证书

关于SSL认证的问题,大家可以根据自己的情况做决定。有人偏向于购买第三方权威的SSL认证,也有人使用OpenSSL自己制作签名。当然,上述两种方法本质上是没有什么区别的,唯一的区别在于:如果是自己制作的SSL证书,大部分的邮件客户端都会弹出提示框询问是否信任等。

其它文章推荐ssl证书:(setup free signed ssl certificate)

自己使用OpenSSL制作:

修改hostname

哈,终于进入了正题。现在,请大家打开终端「window系统用户可以选择使用putty等ssh工具连接服务器」并连接自己的服务器。

ssh [email protected]

连接成功以后,请第一时间执行下述命令切换到root用户:

sudo -s

请注意
为什么要切换到root用户?纯属个人爱好,因为我很懒,懒得每次执行命令时在命令的前面带上sudo这样的参数,因此直接切换到root用户好了。

接下来,在命令行中输入如下命令查看hostname:

hostname

接着,在命令行输入如下命令查看FQDN「fully-qualified domain name」:

hostname -f

将上述两个名称记录下来,安装postfix时你将会使用到。

当然,上述的机器名是可以随时修改的,如果你想要修改,可以直接通过vi编辑器打开/etc/hostname文件,并将自己想要的机器名写入其中并保存即可

命令语法为:

sudo hostnamectl set-hostname <newhostname>

这条命令会删除/etc/hostname文件中的主机名,然后替换为新的主机名。和第一种方法一样,我们也需要更新/etc/hosts文件。这两种方法的本质都是一样的。

具体可以参考

MySQL安装及配置

本例中我们使用MySQL数据库保存Postfix需要服务的虚拟域名、用户帐号及密码、邮件别名三个重要的信息。

请注意:
其实Postfix和Dovecot是完全可以不使用数据库的,二者都可以通过各种配置文件完成「零数据库」的邮件服务器。但是,既然可以使用数据库这么方便,为什么不用呢?将这些需要配置的信息存储在数据库中「如:用户帐号及密码等」,对今后的维护来说是非常方便的事情。不是么?!

MySQL安装

在Ubuntu种安装软件,是再简单不过的事情了。安装MySQL请在命令行中执行如下命令:

apt-get install mysql-server

安装过程中会需要你输入两次MySQL的root口令,请牢记该口令

【验】Postfix+Dovecot+MySQL搭建邮件服务器_服务器_04

MySQL5.7配置用户名密码请参考:


新建数据库及用户

接下来,我们需要新建一个MySQL用户及一个数据库:

  1. 使用root口令登录MySQL
mysql -u root -p
  1. 输入root口令
  2. 新建一个数据库,名称叫做mailserver:
create database mailserver character set utf8;
  1. 输入如下命令以新建一个用户mailserver,并指定密码为mailserver123:
create user mailserver@'localhost' identified by 'mailserver123';
  1. 将数据库mailserver的所有权限赋给用户mailserver:
grant all on mailserver.* to mailserver@'localhost' identified by 'mailserver123';
  1. 退出root用户:
exit;
  1. 使用mailserver用户登录:
mysql -u mailserver -p
  1. 输入mailserver帐号的口令
  2. 将默认数据库切换为mailserver数据库:
use mailserver;

新建表格

  1. 输入如下SQL语句以新建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=utf8;
  1. 输入如下SQL语句以新建virtual_users表,该表邮件服务器的终端用户表,记录用户的邮件地址及密码「千万不要保存明文密码」:
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;
  1. 输入如下SQL语句以新建virtual_aliases表,该表是邮件服务器别名表「邮件服务器种的别名alias的概念大家可以Google一番」:
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

插入数据

为了便于查看结果,接下来给上述三张表种插入一些测试数据:

  1. 给virtual_domains表插入测试数据,大致如下:
insert into virtual_domains(id,name) values(1,'mail.mydomain.com');     
insert into virtual_domains(id,name) values(2,'mydomain.com');

请注意:
上述表种id字段是自增列,可以不赋值。但无论如何,接下来的两张表种我们将需要上述表种的逐渐列id的值。比如:我将要添加mydomain.com域名下的邮箱帐号,而mydomain.com在virtual_domains表种的id值为2。

  1. 给virtual_users表添加用户数据:
insert into virtual_users(id,domain_id,password,email)  
values (1,2,ENCRYPT('zhangsan123456', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))),'[email protected]');


insert into virtual_users(id,domain_id,password,email)  
values (2,2,ENCRYPT('123456lisi', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))),'[email protected]');
  1. 给virtual_aliases表添加别名数据:
insert into virtual_aliases(id,domain_id,source,destination)  
values (1,2,'[email protected]','[email protected]');

insert into virtual_aliases(id,domain_id,source,destination)  
values (1,2,'[email protected]','[email protected]');

请注意:
通过上述别名表的数据,当有人给[email protected]发送邮件时,系统将自动将邮件转发给[email protected][email protected]
这种场景,在公司内部「发送通知」等情况下适用

测试数据

写几个SQL查询语句查看下结果吧

select * from virtual_domains;  
select * from virtual_users;  
select * from virtual_aliases;

Postfix安装及配置

Postfix是邮件发送的核心服务器,所有向内、向外投递的邮件都需要经过Postfix通过SMTP协议完成。接下来的内容,大家需要修改Postfix相关的一些参数,它们是:

  • 告诉Postfix如何连接MySQL数据库,并让Postfix通过数据库种的表确定收发邮件的域名、用户帐号及密码、邮件别名等
  • 告诉Postfix将收到的邮件转发给Dovecot的LMTP服务以完成本地投递
  • 告诉Postfix所有的连接都需要STARTTLS加密,如果有必要「废话啊,当然必须这样」
  • 开放本地端口25、465、587之一或全部

Postfix的安装

在命令行种执行以下命令以安装Postfix:

apt-get install postfix postfix-mysql

安装过程中需要选择Postfix的类型,请选择Internet Site:

【验】Postfix+Dovecot+MySQL搭建邮件服务器_MySQL_05

Postfix安装过程中还会需要输入System mail name,这里请输入你要收发邮件的域名地址「随便写也可以,反正后面需要修改配置文件」

Postfix的配置

  1. 备份Postfix的配置文件/etc/postfix/main.cf,先!
cp /etc/postfix/main.cf /etc/postfix/main.cf_backup_20150511

请注意
任何时候,对任何配置进行修改之前,先做好备份总是非常必要的
同时,这也是一个非常良好的操作习惯

  1. 使用vi编辑器打开/etc/postfix/main.cf文件
vi /etc/postfix/main.cf
  1. 打开之后,按下i键进入编辑模式
  2. 鉴于我们没有打算使用Postfix做用户的权限验证「上述几个图种已经展示清楚」,我们将要把Postfix默认的用户验证参数屏蔽,因此请在如下几行前边加入#符号以注释:
# TLS parameters  
  #smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem  
  #smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key  #smtpd_use_tls=yes  
  #smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache  
  #smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
  1. 复制如下内容,并将其插入到上述注释代码之后:
smtpd_tls_cert_file=/etc/dovecot/dovecot.pem  
smtpd_tls_key_file=/etc/dovecot/private/dovecot.key  
smtpd_use_tls=yes  
smtpd_tls_auth_only = yes  

#Enabling SMTP for authenticated users, and handing off authentication to Dovecot  
smtpd_sasl_type = dovecot  
smtpd_sasl_path = private/auth  
smtpd_sasl_auth_enable = yes  
smtpd_recipient_restrictions =  permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination

请注意:
上述几个参数的含义,请参照Postfix配置文档

  1. 按照如下方式修改mydestination一行的值:
mydestination = localhost

请注意:
将mydestination的值修改为localhost,以便Postfix能够通过MySQL表中相关数据决定需要接受/发送邮件的域名,这样更具有通用性

  1. 在文档种加入以下内容,以便告诉Postfix不要使用LDA「Local Delivery Agent」转而使用Dovecot的LMTP完成本地邮件投递:
#Handing off local delivery to Dovecot's LMTP, and telling it where to store mail  
virtual_transport = lmtp:unix:private/dovecot-lmtp
  1. 在文档中加入以下内容,以便告诉Postfix去MySQL数据库种寻找域名、用户帐号密码及邮件别名等信息:
#Virtual domains, users, and aliases  
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
  1. 最终,修改完成以后的/etc/postfix/main.cf文件大致应该如下:
# See /usr/share/postfix/main.cf.dist for a commented, more complete version    

# Debian specific:  Specifying a file name will cause the first  
# line of that file to be used as the name.  The Debian default  
# is /etc/mailname.  
#myorigin = /etc/mailname  

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)  
biff = no  

# appending .domain is the MUA's job.  
append_dot_mydomain = no  

# Uncomment the next line to generate "delayed mail" warnings  
#delay_warning_time = 4h  

readme_directory = no  

# TLS parameters    
#smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem 
#smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key  
#smtpd_use_tls=yes  
#smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache  
#smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache  

smtpd_tls_cert_file=/etc/dovecot/dovecot.pem  
smtpd_tls_key_file=/etc/dovecot/private/dovecot.key  
smtpd_use_tls=yes  
smtpd_tls_auth_only = yes  

#Enabling SMTP for authenticated users, and handing off authentication to Dovecot  
smtpd_sasl_type = dovecot  
smtpd_sasl_path = private/auth  
smtpd_sasl_auth_enable = yes  
smtpd_recipient_restrictions =  
    permit_sasl_authenticated,  
    permit_mynetworks,  
    reject_unauth_destination  

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for    
# information on enabling SSL in the smtp client.      
myhostname = host.mydomain.com  
alias_maps = hash:/etc/aliases  
alias_database = hash:/etc/aliases  
myorigin = /etc/mailname  
#mydestination = example.com, hostname.mydomain.com,localhost.mydomain.com, localhost  
mydestination = localhost  
relayhost =  
        mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128    
mailbox_size_limit = 0  
recipient_delimiter = +  
inet_interfaces = all  

#Handing off local delivery to Dovecot's LMTP, and telling it where to store mail  
virtual_transport = lmtp:unix:private/dovecot-lmtp  

#Virtual domains, users, and aliases  
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
  1. 按下ESC键并输入如下内容以保存并退出
wq!
  1. 新建/etc/postfix/mysql-virtual-mailbox-domains.cf文件并输入如下内容:
user = mailserver   
password = mailserver123  
hosts = 127.0.0.1  
dbname = mailserver  
query = SELECT 1 FROM virtual_domains WHERE name='%s'
  1. 重启Postfix服务
service postfix restart
  1. 测试上述内容是否正确,如果上述内容配置正确,则如下命令执行后返回结果应该为1:
postmap -q mydomain.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
  1. 新建/etc/postfix/mysql-virtual-mailbox-maps.cf文件并输入如下内容:
user = mailserver    
password = mailserver123  
hosts = 127.0.0.1  
dbname = mailserver  
query = SELECT 1 FROM virtual_users WHERE email='%s'
  1. 重启Postfix服务
service postfix restart
  1. 测试上述配置是否正确,如果上述内容配置正确,则如下命令执行后返回结果应该为1:
postmap -q [email protected] mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
  1. 新建/etc/postfix/mysql-virtual-alias-maps.cf文件并输入如下内容:
user = mailserver    
password = mailserver123  
hosts = 127.0.0.1  
dbname = mailserver  
query = SELECT destination FROM virtual_aliases WHERE source='%s'
  1. 重启Postfix服务
service postfix restart
  1. 测试上述配置是否正确,如果上述配置正确,则如下命令执行后返回结果应该是之前添加的别名帐号:
postmap -q [email protected] mysql:/etc/postfix/mysql-virtual-alias-maps.cf
  1. 使用vi编辑器打开/etc/postfix/master.cf文件「请注意修改之前先备份」,找到submission和smtps所在的两行,并将其注释去掉。这样做的目的是允许Postfix通过587和465端口发送邮件
#
# Postfix master process configuration file.  For details on the format
# of the file, see the master(5) manual page (command: "man 5 master" or
# on-line: http://www.postfix.org/master.5.html).
#
# Do not forget to execute "postfix reload" after editing this file.
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (no)    (never) (100)
# ==========================================================================
smtp      inet  n       -       y       -       -       smtpd
#smtp      inet  n       -       y       -       1       postscreen
#smtpd     pass  -       -       y       -       -       smtpd
#dnsblog   unix  -       -       y       -       0       dnsblog
#tlsproxy  unix  -       -       y       -       0       tlsproxy
submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_tls_auth_only=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       y       -       -       smtpd
#  -o syslog_name=postfix/smtps
#  -o smtpd_tls_wrappermode=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
#628       inet  n       -       y       -       -       qmqpd

.
.
.
  1. 重启Postfix服务
service postfix restart

搞定,Postfix服务器应该配置完成了。相信到这里的时候,已经吓走了90%以上的朋友,剩下的10%朋友们,你们是好样的。

Dovecot安装及配置

Dovecot在本例中充当IMAP、POP服务器的角色,同时它也将负责用户登录时用户身份的验证「Dovecot会将真正的验证工作交给MySQL处理」。因为使用SSL,Dovecot将会使用993「IMAP协议」及995「POP协议」与外界交流,若服务器有iptable之类的玩意儿,请开放相关端口。

这部分的内容配置起来相对简单,但是需要配置的文件繁多。大体上,我们需要配置如下的信息:

  1. 开启Dovecot的IMAP、POP3、LMTP协议
  2. 告知Dovecot本地邮件的投档路径
  3. 连接Dovecot和MySQL数据库以验证用户身份
  4. 配置SSL加密相关信息

Dovecot的安装

通过如下命令安装Dovecot最新版:

apt-get install dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql

Dovecot的配置

需要修改的配置文件有:

  • /etc/dovecot/dovecot.confDovecot的主配置文件
  • /etc/dovecot/conf.d/10-mail.confDovecot将要操作的磁盘路径相关配置信息
  • /etc/dovecot/conf.d/10-auth.conf用户验证相关配置信息
  • /etc/dovecot/conf.d/auth-sql.conf.extSQL-Type验证相关配置信息
  • /etc/dovecot/dovecot-sql.conf.extDovecot与数据库连接相关配置信息
  • /etc/dovecot/conf.d/10-master.confDovecot本地socket相关配置信息
  • /etc/dovecot/conf.d/10-ssl.conf关于SSL的相关配置信息

请注意:
在修改上述文件之前,请一定先做好备份以方便恢复

修改/etc/dovecot/dovecot.conf文件

使用vi编辑器打开/etc/dovecot/dovecot.conf文件并在文件种加入如下内容:

检查这行有没有被注释,有的话,去掉注释

!include conf.d/*.conf

在!include_try /usr/share/dovecot/protocols.d/*.protocol行下加入这行
!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap pop3 lmtp

如果以上内容已经存在,只需要把该行的#号去掉即可
上述内容大致的意思是:告诉Dovecot启用所有.conf文件;并开启Dovecot的imap、pop3、lmtp等相关协议使之正常工作

修改/etc/dovecot/conf.d/10-mail.conf文件

打开文件并找到mail_location相关信息,将其指定到本地磁盘的某个路径,这个路径将来会存放收到的邮件,如下所示:

mail_location = maildir:/var/mail/vhosts/%d/%n

同时,找到文件中mail_privileged_group相关信息并将起修改为:

mail_privileged_group = mail

保存文件并退出

在命令行种输入如下内容以查看/var/mail路径的权限:

ls -ld /var/mail

显示的内容大致应该是:

drwxrwsr-x 2 root mail 4096 May  11 15:08 /var/mail

创建/var/mail/vhosts/文件夹给每个需要启用的域名:

mkdir -p /var/mail/vhosts/mydomain.com

输入如下命令以新建vmail用户组及用户并赋权限

groupadd -g 5000 vmail  
useradd -g vmail -u 5000 vmail -d /var/mail

接下来修改一下/var/mail/目录的权限,使vmail能够访问:

chown -R vmail:vmail /var/mail

修改/etc/dovecot/conf.d/10-auth.conf文件

找到文件中disable_plaintext_auth并取消注释

disable_plaintext_auth = yes

如发现连不上服务器不行,可以试试注释此项

找到文件中auth_mechanisms并将其修改为如下值:

auth_mechanisms = plain login

默认情况下,Dovecot是允许Ubuntu系统用户登录使用的,我们需要将其禁用。找到文件种如下内容并将其注释:

#!include auth-system.conf.ext

如发现连不上服务器不行,可以试试开启此项

开启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

修改/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行的注释,并将其修改为如下:

driver = mysql

取消文件中connect行的注释,并将其修改为如下:

connect = host=127.0.0.1 dbname=mailserver user=mailserver password=mailserver123

取消文件中default_pass_scheme行的注释,并将其修改为如下:

default_pass_scheme = SHA512-CRYPT

取消文件中password_query行的注释,并将起修改为如下:

password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

保存退出

在命令行种输入如下内容以修改目录权限:

chown -R vmail:dovecot /etc/dovecot

chmod -R o-rwx /etc/dovecot

修改/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 imap-login {
   inet_listener imap {
     port = 143
   }
   inet_listener imaps {
     port = 993
     ssl = yes
   }
    ...
 }service pop3-login {
   inet_listener pop3 {
     port = 110
   }
   inet_listener pop3s {
     port = 995
     ssl = yes
   }
 }

找到文件中的service lmtp并将其修改如下:

service lmtp {  
        unix_listener /var/spool/postfix/private/dovecot-lmtp {  
        mode = 0600  
        user = postfix  
        group = postfix  
  }  

  # Create inet listener only if you can't use the above UNIX socket  
  #inet_listener lmtp {  
        #Avoid making LMTP visible for the entire internet  
        #address =  
        #port =  
        #}  
 }

找到文件中service auth并将其内容修改如下:

service auth {  
    # auth_socket_path points to this userdb socket by default. It's typically  
    # used by dovecot-lda, doveadm, possibly imap process, etc. Its default  
    # permissions make it readable only by root, but you may need to relax these  
    # permissions. Users that have access to this socket are able to get a list  
    # of all usernames and get results of everyone's userdb lookups.  

    unix_listener /var/spool/postfix/private/auth {  
            mode = 0666  
            user = postfix  
            group = postfix  
    }  

    unix_listener auth-userdb {  
            mode = 0600  
            user = vmail  
            #group =  
    }  

    # Postfix smtp-auth  
    #unix_listener /var/spool/postfix/private/auth {  
    #       mode = 0666  
    #}  

    # Auth process is run as this user.  
    user = dovecot  
}

找到文件中service auth-worker内容并修改如下:

service auth-worker {  
    # Auth worker process is run as root by default, so that it can access  
    # /etc/shadow. If this isn't necessary, the user should be changed to  
    # $default_internal_user.  

    user = vmail  
}

修改/etc/dovecot/conf.d/10-ssl.conf文件

找到文件中ssl_cert并修改内容如下「请确保dovecot的pem文件已经存在,如果大家使用了自己的SSL文件,请将如下内容修改为相应的路径」:

ssl_cert = </etc/dovecot/dovecot.pem  
ssl_key = </etc/dovecot/private/dovecot.key

强制用户使用SSL加密:

ssl = required

重新启动Dovecot服务:

service dovecot restart

测试邮件服务器是否正常

设置一个帐号,可以向MySQL对应的表中插入数据,接下来使用邮件客户端来测试一下。推荐使用Thunderbird邮件客户端或者Foxmail客户端等。请注意以下内容:

  • 邮箱的全称「包括后面的@mydomain.com」将作为用户名
  • 邮箱密码是MySQL数据库种对应邮箱的密码
  • 服务器相关接口是否全部开放?993、995、25等
  • 邮件收发的所有协议,包括IMAP、POP3、SMTP全部都需要开启SSL加密

配置好客户端之后即可连接获取、发送邮件。

测试中Thunderbird一直验证通过不了,foxmail可以,建议使用foxmail

Roundcube Webmail

Roundcube是一个用PHP编写的免费开源的基于Web的webmail解决方案。 它是一个基于Web的IMAP客户端,因此您还可以从Web浏览器访问您的电子邮件服务器。 您无需从桌面邮件客户端读取和发送电子邮件。 本教程将向您展示如何在Ubuntu 18.04 LTS(Bionic Beaver)上安装RoundCube。

RoundCube功能

  • MIME支持,消息搜索和拼写检查。
  • 地址簿的LDAP目录集成。
  • 支持多种语言。
  • 支持共享/全局文件夹和IMAP ACL。
  • 内置缓存,可实现快速邮箱访问。
  • 支持外部SMTP服务器和IDNA。

要求

  • 运行Ubuntu 18.04的服务器。
  • 具有sudo权限的非root用户。

安装LAMP服务器

在开始之前,您需要将Apache,MariaDB和PHP安装到您的系统中。 首先,使用以下命令安装Apache和MariaDB:

sudo apt-get install apache mariadb-server php7.2 php7.2-gd php-mysql php7.2-curl php7.2-zip php7.2-ldap php7.2-mbstring php-imagick php7.2-intl php7.2-xml unzip wget curl -y

安装完所有软件包后,您需要更改php.ini文件中的Timezone设置。 您可以使用以下命令执行此操作:

sudo nano /etc/php/7.2/apache2/php.ini

进行以下更改:


date.timezone = Asia/Kolkata


保存并关闭该文件,然后启动Apache和MariaDB服务并使用以下命令使它们在启动时启动:

sudo systemctl start apache2
sudo systemctl enable apache2
sudo systemctl start mysql
sudo systemctl enable mysql

下载Roundcube

首先,您需要将最新版本的Roundcube下载到您的系统中。 您可以使用以下命令下载它:

wget https://github.com/roundcube/roundcubemail/releases/download/1.3.6/roundcubemail-1.3.6-complete.tar.gz

下载完成后,使用以下命令解压缩下载的文件:

tar -xvzf roundcubemail-1.3.6-complete.tar.gz

接下来,将解压缩的目录移动到Apache Web根目录:

mv roundcubemail-1.3.6 /var/www/html/roundcube

接下来,为roundcube目录提供适当的权限:

sudo chown -R www-data:www-data /var/www/html/roundcube
sudo chmod -R 775 /var/www/html/roundcube

配置数据库

默认情况下,MariaDB安装不受保护。 所以你需要先保护它。 您可以通过运行以下脚本来保护它:

mysql_secure_installation

回答所有问题,如下所示:


Change the password for root ? N Remove anonymous users? Y Disallow root login remotely? Y Remove test database and access to it? Y Reload privilege tables now? Y


一旦MariaDB受到保护,使用以下命令登录MariaDB shell:

mysql -u root -p

输入你的root passw ** ord,然后为Roundcube创建一个数据库和用户:

MariaDB [(none)]> CREATE DATABASE roundcubedb;
MariaDB [(none)]> CREATE USER 'roundcube'@'localhost' IDENTIFIED BY 'roundcube';
MariaDB [(none)]> GRANT ALL ON roundcube.* TO 'roundcube'@'localhost' IDENTIFIED BY 'roundcube';

接下来,使用以下命令刷新权限并退出MariaDB shell:

MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> exit;

 

为Roundcube配置Apache

接下来,您需要为Roundcube创建一个Apache虚拟主机文件。 您可以使用以下命令执行此操作:

sudo nano /etc/apache2/sites-available/roundcube.conf

添加以下行:


<VirtualHost *:80>
        ServerName 192.168.0.102                          
        ServerAdmin [email protected]
        DocumentRoot /var/www/html/roundcube

        ErrorLog ${APACHE_LOG_DIR}/roundcube_error.log
        CustomLog ${APACHE_LOG_DIR}/roundcube_access.log combined

        <Directory /var/www/html/roundcube>
                Options -Indexes
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>
</VirtualHost>


保存并关闭该文件,然后使用以下命令启用虚拟主机文件:

sudo a2ensite roundcube

接下来,启用Apache重写模块并使用以下命令重新启动Apache服务器:

sudo a2enmod rewrite
sudo systemctl restart apache2

访问Webmail

现在,打开Web浏览器并键入URL http:// your-ip-address / installer 。 您将被重定向到以下页面:

配置 Roundcube

打开浏览器,输入 https://mail.example.com/installer/?_step=1 ,回车打开。然后按图片提示进行配置。

【验】Postfix+Dovecot+MySQL搭建邮件服务器_邮件服务器_06

 

【验】Postfix+Dovecot+MySQL搭建邮件服务器_服务器_07

 

【验】Postfix+Dovecot+MySQL搭建邮件服务器_服务器_08

 

【验】Postfix+Dovecot+MySQL搭建邮件服务器_邮件服务器_09

 

【验】Postfix+Dovecot+MySQL搭建邮件服务器_MySQL_10

 

【验】Postfix+Dovecot+MySQL搭建邮件服务器_邮件服务器_11

 

【验】Postfix+Dovecot+MySQL搭建邮件服务器_MySQL_12

 

配置完成后,关闭浏览器页面。执行以下命令来使安装程序不可用。

chmod -R 000 /usr/share/roundcube/installer/

11.6 登录!

打开浏览器,输入 https://mail.example.com ,然后输入您的用户名密码登录。

【验】Postfix+Dovecot+MySQL搭建邮件服务器_MySQL_13

登录之后,默认只会有一个收件箱,我们再设置一下就完美了!

【验】Postfix+Dovecot+MySQL搭建邮件服务器_MySQL_14

【验】Postfix+Dovecot+MySQL搭建邮件服务器_服务器_15

最终效果如下图

【验】Postfix+Dovecot+MySQL搭建邮件服务器_MySQL_16

十二、收发件测试

12.1 收件测试

非常简单,从 QQ 或者 Gmail 给自己的邮箱发一封邮件,如果可以收到,说明外网已经可以连通这台服务器了。

12.2 发件测试

打开浏览器,输入 http://www.mail-tester.com ,回车打开。发一封邮件到它指定的邮箱里。然后过一分钟左右查看下结果,重点检查 SPF 记录DMARC 记录DKIM 签名是不是有效的。如果都是有效的,那恭喜您!您的邮件系统已经搭建完了!至于这个得分,由于受 IP 地址可能被拉黑的影响,因此各人的分数有可能不同。如果有 8 分以上的话发出去的邮件基本上就不会被拒收了。如果很不幸 IP 地址被拉黑了,建议换一个 IP 地址。

【验】Postfix+Dovecot+MySQL搭建邮件服务器_服务器_17

 

教程完!

参考:

1、Postfix+Dovecot+MySQL搭建邮件服务器

2、How To Configure a Mail Server Using Postfix, Dovecot, MySQL, and SpamAssassin

3、在 CentOS 7 上搭建属于自己的 “完美” 邮件系统

4、Email with Postfix, Dovecot, and MySQL

5、OPENSSL生成SSL自签证书

6、3种方法更改Linux系统的主机名(hostname)

7、如何在Ubuntu 18.04 LTS上安装最新的Roundcube Webmail

标签:dovecot,Postfix,MySQL,etc,smtpd,Dovecot,邮件
From: https://blog.51cto.com/u_15930680/7436441

相关文章

  • es与mysql的概念对比
        ......
  • linux服务器上的nginx服务、mysql服务和docker里面的php服务配合使用
    之前有个老项目是nginx1.22.0+mysql5.7+php5.6的环境在跑,也就是常说的lnmp环境。但是最近出了一个新的需求,这台服务器上要跑一个php7.3的项目,mysql5.7还可以用,nginx1.22.0也可以用,主要是php的环境要升级到7.3,那么方案应该怎么实施呢,大概有下面几个思路:1、再独立安装一个php7.3的......
  • JDBC 连接 MySQL 报错 Unknown system variable ‘query_cache_size‘
    官方说法:ThequerycacheisdeprecatedasofMySQL5.7.20,andisremovedinMySQL8.0.Deprecationincludesquery_cache_size.querycache在MySQL5.7.20已经过时了,并且在MySQL8.0版本中被移除了。所以要更新mysql驱动版本<dependency><groupId>mysql</groupId......
  • windows docker desktop安装mysql
    原文:https://www.jianshu.com/p/fd5d388dbf7d1.拉去mysql镜像dockerpullmysql:5.72.查看并启动镜像#列出已下载的镜像dockerimages#启动容器,挂载配置文件和数据dockerrun--namemysql-vD:/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf-vD:/docker/mysql/logs......
  • MySQL 8.0.23 新特性-不可见列
    在MySQL8.0.23之前,默认情况下,表中所有用户定义的列都是可见的。然而,从MySQL8.0.23开始,引入了一个名为InvisibleColumns的新功能,允许用户在表中隐藏特定的列。使用此功能,这些不可见的列不会出现在“SELECT*”查询中,从而提供了一种在常规查询结果中隐藏它们的方法。 若要查看不可......
  • docker安装mysql
    Docker环境下安装mysql总的来说,不推荐把mysql安装到docker下。首先是数据安全性问题:将mysql安装到docker容器,除了需要处理mysql的问题,还要考虑docker环境自身的问题,多了个docker,相当于平白无故多了一些风险项。其次是项目实施问题:首先,mysql大部分人会,但是不......
  • ZABBIX6.0监控MySQL
    官方文档:https://www.zabbix.com/cn/integrations/mysql部署过程:1.在MySQL数据库中创建监控账号并授权CREATEUSER'zabbix'@'%'IDENTIFIEDBY'Likun@123';GRANTUSAGE,REPLICATIONCLIENT,PROCESS,SHOWDATABASES,SHOWVIEWON*.*TO'zabbix'@�......
  • ClickHouse使用之二 ——整合mysql,实现数据库创建查询导出
    1.mysql创建一个用于clickhouse的账号mysql_clickhouse并且授权CREATEUSER'mysql_clickhouse'@'%'IDENTIFIEDBY'Password123!';GRANTALLPRIVILEGESON*.*TO‘mysql_clickhouse’@‘%';2. 使用mysql引擎创建一个clickhouse的外部表存在一个mysql的数据库:host:......
  • Mysql数据库系列之:深入理解tinyint(n)
    Mysql数据库系列之:深入理解tinyintn一、深入理解tinyint(n)二、创建包含tinyint类型字段的表三、扩展一、深入理解tinyint(n)对于MySQL中的tinyint列,"(n)"没有任何实际意义。在MySQL中,tinyint的宽度始终为1字节,所以在定义表时指定tinyint(n)与tinyint相同。在MySQL中,tinyint字段......
  • mysql查看最近执行的sql语句
    mysql查看最近执行的sql语句,默认情况下mysql是不会记录最近执行sql语句的,需要手动开启才能记录。另外最近执行sql语句有两种方式输出,要么是table,要么是文件。查看mysql是否开启sql记录以及输出方式的脚本如下:showvariableslike'%log_output%';--查看输出方式showvariables......