ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Rethat 环境下Postfix+Dovecot+MySQL搭建服邮件服务器实例

2022-01-25 09:00:57  阅读:183  来源: 互联网

标签:postfix conf Postfix virtual etc auth Rethat MySQL dovecot


本文将尝试阐述在Rethat 系统中使用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」等

DNS配置

首先,你需要申请一个域名。譬如我设置的域名admindomain.com

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

主机记录 记录类型 记录值

* A xx.xx.xx.xx(我的ip)

@ MX mail.admindomain.com

imap A xx.xx.xx.xx(我的ip)

mail A xx.xx.xx.xx(我的ip)

pop A xx.xx.xx.xx(我的ip)

smtp A xx.xx.xx.xx(我的ip)

MySQL安装及配置

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

请注意:

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

MySQL安装

yum install mysql

vi my.cnf

修改相关的mysql参数并启动这里不详述,

mysql_install_db --user=mysql ##初始化

/bin/sh /usr/bin/mysqld_safe --user=mysql & ###启动

数据库及用户初始化

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

1. 使用root口令登录MySQL

mysql -u root -p

2. 输入root口令

3. 新建一个数据库,名称叫做mailserver:

create database mailserver character set utf8;

4. 输入如下命令以新建一个用户mailserver,并指定密码为mailserver123:

create user mailserver@'localhost' identified by 'mailserver123';

5. 将数据库mailserver的所有权限赋给用户mailserver:

grant all on mailserver.* to mailserver@'localhost' identified by 'passwd';

6. 退出root用户:

exit;

7. 使用mailserver用户登录:

mysql -u mailserver -p

8. 输入mailserver帐号的口令

9. 将默认数据库切换为mailserver数据库:

use mailserver;

新建表

1. 建立域名记录表:

CREATE TABLE `virtual_domains` (

`id` int(11) NOT NULL auto_increment,

`name` varchar(50) NOT NULL,

PRIMARY KEY (`id`))

ENGINE=InnoDB DEFAULT CHARSET=utf8;

2. 新建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;

3. 新建virtual_aliases表,该表是邮件服务器别名表「邮件服务器的别名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

插入测试数据

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

1. 给virtual_domains表插入测试数据,大致如下:

insert into virtual_domains(id,name) values(1,'mail.admindomain.com');

请注意:

上述表种id字段是自增列,可以不赋值。但无论如何,接下来的两张表种我们将需要上述表种的逐渐列id的值。给virtual_users表添加用户数据:

insert into virtual_users(id,domain_id,password,email)

values (1,1,ENCRYPT('test1passwd', CONCAT('$7$', SUBSTRING(SHA(RAND()), -16))),'test1@admindomain.com');

insert into virtual_users(id,domain_id,password,email)

values (2,1,ENCRYPT('test2passwd', CONCAT('$7$', SUBSTRING(SHA(RAND()), -16))),'test2@admindomain.com');

2. 给virtual_aliases表添加别名数据:

insert into virtual_aliases(id,domain_id,source,destination)

values (1,1,'all@admindomain.com','test1@mydomain.com');

insert into virtual_aliases(id,domain_id,source,destination)

values (1,1,'all@admindomain.com',’test2@mydomain.com');

请注意:

通过上述别名表的数据,当有人给all@admindomain.com发送邮件时,系统将自动将邮件转发给test1@admindomain.com和test2@admindomain.com

这种场景,在公司内部「发送通知」等情况下适用

Postfix安装及配置

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

• 告诉Postfix如何连接MySQL数据库,并让Postfix通过数据库种的表确定收发邮件的域名、用户帐号及密码、邮件别名等

• 告诉Postfix将收到的邮件转发给Dovecot的LMTP服务以完成本地投递

• 告诉Postfix所有的连接都需要STARTTLS加密,如果有必要「废话啊,当然必须这样」

• 开放本地端口25、465、587之一或全部

Postfix的安装

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

yum install postfix

Postfix的配置

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

cp /etc/postfix/main.cf /etc/postfix/main.cf_backup_20160314

请注意

任何时候,对任何配置进行修改之前,先做好备份总是非常必要的

同时,这也是一个非常良好的操作习惯

2. 使用vi编辑器打开/etc/postfix/main.cf文件将要把Postfix默认的用户验证参数屏蔽

vi /etc/postfix/main.cf

# 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

3. 复制如下内容,并将其插入到上述注释代码之后:

smtpd_tls_cert_file=/etc/dovecot/dovecot.pem

smtpd_tls_key_file=/etc/dovecot/private/dovecot.pem

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

4. 按照如下方式修改mydestination一行的值:

mydestination = localhost

请注意:

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

5. 在文档种加入以下内容,以便告诉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

6. 在文档中加入以下内容,以便告诉Postfix去MySQL数据库种寻找域名、用户帐号密码及邮件别名等信息:

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

7. 最终,修改完成以后的/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.pem

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

8. 按下ESC键并输入如下内容以保存并退出

wq!

9. 新建/etc/postfix/mysql-virtual-mailbox-domains.cf文件并输入如下内容:

user = mailserver

password = passwd

hosts = 127.0.0.1

dbname = mailserver

query = SELECT 1 FROM virtual_domains WHERE name='%s'

10. 重启Postfix服务

service postfix restart

11. 测试上述内容是否正确,如果上述内容配置正确,则如下命令执行后返回结果应该为1:

postmap -q admindomain.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

12. 新建/etc/postfix/mysql-virtual-mailbox-maps.cf文件并输入如下内容:

user = mailserver

password = passwd

hosts = 127.0.0.1

dbname = mailserver

query = SELECT 1 FROM virtual_users WHERE email='%s'

13. 重启Postfix服务

service postfix restart

14. 测试上述配置是否正确,如果上述内容配置正确,则如下命令执行后返回结果应该为1:

postmap -q test1@admindomain.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

15. 新建/etc/postfix/mysql-virtual-alias-maps.cf文件并输入如下内容:

user = mailserver

password = passwd

hosts = 127.0.0.1

dbname = mailserver

query = SELECT destination FROM virtual_aliases WHERE source='%s'

16. 重启Postfix服务

service postfix restart

17. 测试上述配置是否正确,如果上述配置正确,则如下命令执行后返回结果应该是之前添加的别名帐号:

postmap -q all@admindomain.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf

18. 使用vi编辑器打开/etc/postfix/master.cf文件「请注意修改之前先备份」,找到submission和smtps所在的两行,并将其注释去掉。这样做的目的是允许Postfix通过587和465端口发送邮件

19. 重启Postfix服务

service postfix restart

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最新版:

yum install dovecot 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

# Enable installed

protocols!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=passwd

取消文件中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 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 =

  转自:https://www.jianshu.com/p/7a9df94ceec1 

标签:postfix,conf,Postfix,virtual,etc,auth,Rethat,MySQL,dovecot
来源: https://www.cnblogs.com/javalinux/p/15841646.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有