【Linux】邮件服务器搭建 postfix+dovecot+mysql (终极版 超详细 亲测多遍无问题)
🍁博主简介
🏅云计算领域优质创作者
🏅华为云开发者社区专家博主
🏅阿里云开发者社区专家博主
💊交流社区:运维交流社区 欢迎大家的加入!
文章目录
- 前言
- 基础原理
- 准备工作
- 一 、安装关于权限校验的软件 cyrus-sasl
- 二、部署及创建数据库【mysql】
- 1、部署数据库(mariadb)
- 2、库、表结构导入
- 三、安装及配置 postfix 邮局
- 四 、安装及配置 dovecot
- 五、邮箱测试
- 总结
前言
因为最近公司需要搭建一个邮件服务系统,但是如果在linux创建的话会有uid限制,而又需要创建大量的用户,上w个,这样会导致uid不足而无法创建用户;所以需要用到虚拟用户,在千辛万苦下找到了使用postfix+dovecot+mysql这种方式来做虚拟用户及邮箱发收,最终选择了使用:postfix+dovecot+mysql来实现这个功能;
这里不推荐使用云服务器,因为云服务器会限制25端口,会导致邮件系统收发不了;
基础原理
今天来聊聊Linux邮件服务器的搭建,本以为电子邮件这种高度成熟的技术应该很容易部署,上手后才发现原来坑还真不少。本方案以主流的postfix + dovacot为基础,其中postfix用作smtp,dovecot用作pop3(或imap)。
1、工作模式
用postfix构建的邮件系统至少有两种工作模式,第一种是利用本地Linux账号进行邮件收发,比如本地系统有用户root或someone,那么就有root@example.com和someone@example.com两个email地址。 第二种相对复杂一些,为了管理的方便和系统安全,postfix的用户管理采用了虚拟用户方式,即postfix单独设立了许多用户,他们各自在系统中映射有独立的硬盘空间。但同时这些用户又跟本地Linux系统内固有的真实账号没有关联。本文所有讨论就是建立在这种模式下的,值得注意的是,这两种工作模式的部署方法差异极大,在参考网上教程的时候,首先要确认它是建立在哪个模式下的,否则容易张冠李戴,出现很多令人头疼的问题。
2、运行流程
对于电子邮件,我们有可能存在的一个误区是,将smtp和pop3按照字面的意思去理解,即smtp只管发件,pop3则只负责收件。其实并不完全是这样。下面是一封电子邮件在互联网上的投递流程:
- 发件人:me@qq.com 收件人:you@gmail.com
me@qq.com 用邮件客户端(比如outlook)写了一封邮件给you@gmail.com,点下发送按钮后,邮件首先会发送到smtp.qq.com - smtp.qq.com 检索到这封邮件的收件人域名是gmail.com,于是通过互联网(WAN)将邮件发送到smtp.gmail.com
- smtp.gmail.com确认收下邮件后,将它转存到邮件服务器的硬盘中待收。
通过观察以上流程,你会发现smtp服务器其实身兼了 “收、发” 两个功能。 对于smtp.qq.com而言,是发送。 而从smtp.gmail.com的角度来看,则是接收。那么,咱们平时经常说起的 “收件服务器pop3” 又是怎么回事呢,整个流程似乎看不到它的身影?
pop3(或imap服务器,与之性质相同)更多的是起一个中转作用,它将存储在邮件服务器硬盘中的邮件转移回邮件客户端(user agent),它只负责从邮件服务器到邮件客户端这段路径,而邮件在广域网上的收发则是smtp要做的事,与pop3没有关系。
pop3与imap的区别是,pop3将邮件拉回本地后,即与服务器脱钩了。imap则更先进一些,它能做到实时将你在邮件客户端的操作反馈回邮件服务器,比如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。
准备工作
前面说过,本文以虚拟邮件用户为基础,创建虚拟用户有很多方法,其中最容易也最易于扩展的方式莫过于采用数据库来管理邮件客户。比如说以后如果需要扩展Web Mail功能,就比较容易与现有系统无缝衔接。
本文选用Centos下最常见的MariaDB作为数据库,它与MySQL是完全兼容的,关于MariaDB的部署不在本文讨论之内,网上有很多教程,也非常简单。
首先将我的运行环境做一个说明:
操作系统 : Centos 7.9
数据库 : MariaDB 10.3.17
Postfix: 2.10.1
Dovecot: 2.2.36
编辑器:vim
注意:
- 文中所有出现cs.com的地方,需要全部更换为自己的域名。
- 文中凡出现vim开头的地方表达的意思就是编辑这个文件。
在正式开始之前,我们还需要配置域名,以下来说说如何配置域名;
以云上DNS域名解析为例:
- 腾讯云
- 阿里云
配置好之后,可以在windows上打开cmd,输入nslookup,然后在输入set type=MX,然后在输入自己的域名(这里的域名不是带mail的域名,是mail后面的域名),如果windows上没有nslookup可以自己安装一下,如下图,则是解析成功。
解析成功之后,链接服务器,修改主机名:
hostnamectl set-hostname mail.域名
#加载新环境,或者关了重新开一个窗口;
bash
#完成之后可以再次确认
uname -n
确认完成之后,确认服务器中是否存在一些关于mail的服务,可以卸载;
rpm -qa | grep postfix
rpm -qa | grep dovecot
rpm -qa | grep sendmail#先停止服务
systemctl stop postfix dovecot sendmail#如果有这些,可以自行卸载,卸载完顺便看看配置还在不在,一般默认dovecot配置不会删除
yum -y remove dovecot\* postfix\* sendmail\*
dovecot配置文件路径:/etc/dovecot/
postfix配置文件路径:/etc/postfix
卸载完成之后,创建一个叫做 vmail 的用户 和一个叫做vmail 的组 之后基本所有的权限都应该交给这个用户;
groupadd -g 5000 vmail
useradd -g vmail -u 5000 -s /sbin/nologin vmail
一 、安装关于权限校验的软件 cyrus-sasl
1)安装
yum -y install cyrus-sasl\*
2)配置
vim /etc/sysconfig/saslauthd#修改如下两行
SOCKETDIR=/var/run/saslauthd
MECH=shadow
vim /etc/sasl2/smtpd.conf
添加如下几行
pwcheck_method: saslauthd
mech_list: plain login
log_level: 3
saslauthd_path:/var/run/saslauthd/mux
3)启动
systemctl restart saslauthd
二、部署及创建数据库【mysql】
1、部署数据库(mariadb)
#安装mariadb
yum install mariadb\* -y#启动数据库
systemctl start mariadb
#设置开机自启
systemctl enable mariadb#查看数据库是否启动(有进程则启动)
netstat -anput | grep 3306#数据库初始化操作(设置密码)
mysql_secure_installation
提示:如果回车没有反应,先检查mariadb是否启动。
#进入mysql数据库
mysql -uroot -p密码#设置数据库远程连接,用于使用外部软件链接数据库【Navicat、SQLyog】
grant all privileges on *.* to root@'%' identified by "123123";
#刷新权限
flush privileges;
这样就可以在远程链接数据库了;
2、库、表结构导入
sql文件:(创建一个postfix.sql文件,将以下所有内容直接复制放到postfix.sql中,导入sql语句即可,里面有一条测试数据)
/*
SQLyog Ultimate v13.1.1 (64 bit)
MySQL - 5.7.38-log : Database - postfix
*********************************************************************
*//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE=''*/;/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`postfix` /*!40100 DEFAULT CHARACTER SET utf8 */;USE `postfix`;/*Table structure for table `admin` */DROP TABLE IF EXISTS `admin`;CREATE TABLE `admin` (`username` varchar(255) NOT NULL,`password` varchar(255) NOT NULL,`superadmin` tinyint(1) NOT NULL DEFAULT '0',`created` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',`modified` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',`active` tinyint(1) NOT NULL DEFAULT '1',PRIMARY KEY (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Admins';/*Data for the table `admin` */insert into `admin`(`username`,`password`,`superadmin`,`created`,`modified`,`active`) values
('cs@cs.com','123123',1,'2023-07-14 15:52:23','2023-07-14 15:52:23',1);/*Table structure for table `alias` */DROP TABLE IF EXISTS `alias`;CREATE TABLE `alias` (`address` varchar(255) NOT NULL,`goto` text NOT NULL,`domain` varchar(255) NOT NULL,`created` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',`modified` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',`active` tinyint(1) NOT NULL DEFAULT '1',PRIMARY KEY (`address`),KEY `domain` (`domain`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Aliases';/*Data for the table `alias` */insert into `alias`(`address`,`goto`,`domain`,`created`,`modified`,`active`) values ('cs@cs.com','cs@cs.com','cs.com','2023-07-17 13:59:18','2023-07-17 13:59:18',1);/*Table structure for table `alias_domain` */DROP TABLE IF EXISTS `alias_domain`;CREATE TABLE `alias_domain` (`alias_domain` varchar(255) NOT NULL DEFAULT '',`target_domain` varchar(255) NOT NULL DEFAULT '',`created` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',`modified` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',`active` tinyint(1) NOT NULL DEFAULT '1',PRIMARY KEY (`alias_domain`),KEY `active` (`active`),KEY `target_domain` (`target_domain`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Domain Aliases';/*Data for the table `alias_domain` *//*Table structure for table `config` */DROP TABLE IF EXISTS `config`;CREATE TABLE `config` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) CHARACTER SET latin1 NOT NULL DEFAULT '',`value` varchar(20) CHARACTER SET latin1 NOT NULL DEFAULT '',PRIMARY KEY (`id`),UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='PostfixAdmin settings';/*Data for the table `config` */insert into `config`(`id`,`name`,`value`) values
(1,'version','1836');/*Table structure for table `domain` */DROP TABLE IF EXISTS `domain`;CREATE TABLE `domain` (`domain` varchar(255) NOT NULL,`description` varchar(255) CHARACTER SET utf8 NOT NULL,`aliases` int(10) NOT NULL DEFAULT '0',`mailboxes` int(10) NOT NULL DEFAULT '0',`maxquota` bigint(20) NOT NULL DEFAULT '0',`quota` bigint(20) NOT NULL DEFAULT '0',`transport` varchar(255) NOT NULL,`backupmx` tinyint(1) NOT NULL DEFAULT '0',`created` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',`modified` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',`active` tinyint(1) NOT NULL DEFAULT '1',PRIMARY KEY (`domain`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Domains';/*Data for the table `domain` */insert into `domain`(`domain`,`description`,`aliases`,`mailboxes`,`maxquota`,`quota`,`transport`,`backupmx`,`created`,`modified`,`active`) values
('ALL','',0,0,0,0,'',0,'2023-07-14 15:52:22','2023-07-14 15:52:22',1),
('cs.com','测试邮箱',0,0,10,2048,'virtual',1,'2023-07-14 16:16:11','2023-07-14 16:16:11',1);/*Table structure for table `domain_admins` */DROP TABLE IF EXISTS `domain_admins`;CREATE TABLE `domain_admins` (`username` varchar(255) NOT NULL,`domain` varchar(255) NOT NULL,`created` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',`active` tinyint(1) NOT NULL DEFAULT '1',KEY `username` (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Domain Admins';/*Data for the table `domain_admins` */insert into `domain_admins`(`username`,`domain`,`created`,`active`) values
('cs@cs.com','ALL','2023-07-14 15:52:24',1);/*Table structure for table `fetchmail` */DROP TABLE IF EXISTS `fetchmail`;CREATE TABLE `fetchmail` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`domain` varchar(255) DEFAULT '',`mailbox` varchar(255) NOT NULL,`src_server` varchar(255) NOT NULL,`src_auth` enum('password','kerberos_v5','kerberos','kerberos_v4','gssapi','cram-md5','otp','ntlm','msn','ssh','any') CHARACTER SET utf8 DEFAULT NULL,`src_user` varchar(255) NOT NULL,`src_password` varchar(255) NOT NULL,`src_folder` varchar(255) NOT NULL,`poll_time` int(11) unsigned NOT NULL DEFAULT '10',`fetchall` tinyint(1) unsigned NOT NULL DEFAULT '0',`keep` tinyint(1) unsigned NOT NULL DEFAULT '0',`protocol` enum('POP3','IMAP','POP2','ETRN','AUTO') CHARACTER SET utf8 DEFAULT NULL,`usessl` tinyint(1) unsigned NOT NULL DEFAULT '0',`sslcertck` tinyint(1) NOT NULL DEFAULT '0',`sslcertpath` varchar(255) CHARACTER SET utf8 DEFAULT '',`sslfingerprint` varchar(255) DEFAULT '',`extra_options` text,`returned_text` text,`mda` varchar(255) NOT NULL,`date` timestamp NOT NULL DEFAULT '2000-01-01 00:00:00',`created` timestamp NOT NULL DEFAULT '2000-01-01 00:00:00',`modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,`active` tinyint(1) NOT NULL DEFAULT '0',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;/*Data for the table `fetchmail` *//*Table structure for table `log` */DROP TABLE IF EXISTS `log`;CREATE TABLE `log` (`timestamp` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',`username` varchar(255) NOT NULL,`domain` varchar(255) NOT NULL,`action` varchar(255) NOT NULL,`data` text NOT NULL,KEY `timestamp` (`timestamp`),KEY `domain_timestamp` (`domain`,`timestamp`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Log';/*Data for the table `log` */insert into `log`(`timestamp`,`username`,`domain`,`action`,`data`) values
('2023-07-14 16:20:05','cs@cs.com (172.16.10.1)','cs.com','create_alias','cs@cs.com');/*Table structure for table `mailbox` */DROP TABLE IF EXISTS `mailbox`;CREATE TABLE `mailbox` (`username` varchar(255) NOT NULL,`password` varchar(255) NOT NULL,`name` varchar(255) CHARACTER SET utf8 NOT NULL,`maildir` varchar(255) NOT NULL,`quota` bigint(20) NOT NULL DEFAULT '0',`local_part` varchar(255) NOT NULL,`domain` varchar(255) NOT NULL,`created` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',`modified` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',`active` tinyint(1) NOT NULL DEFAULT '1',PRIMARY KEY (`username`),KEY `domain` (`domain`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Mailboxes';/*Data for the table `mailbox` */insert into `mailbox`(`username`,`password`,`name`,`maildir`,`quota`,`local_part`,`domain`,`created`,`modified`,`active`) values
('cs@cs.com','123123','测试','cs.com/cs/',0,'cs','cs.com','2023-07-14 16:20:05','2023-07-14 16:20:05',1);/*Table structure for table `quota` */DROP TABLE IF EXISTS `quota`;CREATE TABLE `quota` (`username` varchar(255) CHARACTER SET latin1 NOT NULL,`path` varchar(100) CHARACTER SET latin1 NOT NULL,`current` bigint(20) NOT NULL DEFAULT '0',PRIMARY KEY (`username`,`path`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;/*Data for the table `quota` *//*Table structure for table `quota2` */DROP TABLE IF EXISTS `quota2`;CREATE TABLE `quota2` (`username` varchar(100) CHARACTER SET latin1 NOT NULL,`bytes` bigint(20) NOT NULL DEFAULT '0',`messages` int(11) NOT NULL DEFAULT '0',PRIMARY KEY (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;/*Data for the table `quota2` *//*Table structure for table `vacation` */DROP TABLE IF EXISTS `vacation`;CREATE TABLE `vacation` (`email` varchar(255) NOT NULL,`subject` varchar(255) CHARACTER SET utf8 NOT NULL,`body` text CHARACTER SET utf8 NOT NULL,`activefrom` timestamp NOT NULL DEFAULT '2000-01-01 00:00:00',`activeuntil` timestamp NOT NULL DEFAULT '2000-01-01 00:00:00',`cache` text NOT NULL,`domain` varchar(255) NOT NULL,`interval_time` int(11) NOT NULL DEFAULT '0',`created` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',`modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,`active` tinyint(1) NOT NULL DEFAULT '1',PRIMARY KEY (`email`),KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Vacation';/*Data for the table `vacation` *//*Table structure for table `vacation_notification` */DROP TABLE IF EXISTS `vacation_notification`;CREATE TABLE `vacation_notification` (`on_vacation` varchar(255) CHARACTER SET latin1 NOT NULL,`notified` varchar(255) CHARACTER SET latin1 NOT NULL DEFAULT '',`notified_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (`on_vacation`,`notified`),CONSTRAINT `vacation_notification_pkey` FOREIGN KEY (`on_vacation`) REFERENCES `vacation` (`email`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Virtual Vacation Notifications';/*Data for the table `vacation_notification` *//*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
添加新用户都添加到mailbox表中即可;
字段解析:
username | password | name | maildir | quota | local_part | domain | created | modified | active |
---|---|---|---|---|---|---|---|---|---|
用户邮箱地址 | 用户邮箱密码 | 用户名 | 用户数据存储路径(服务器上) | 邮件大小限制(0为不限制,单位为 KB) | 用户邮箱头部 | 所属域 | 创建时间 | 修改时间 | 是否激活 |
字段实例:
username | password | name | maildir | quota | local_part | domain | created | modified | active |
---|---|---|---|---|---|---|---|---|---|
cs@cs.com | 123123 | 测试用户 | cs.com/cs | 0 | cs | cs.com | 2023-07-21 00:00:00 | 2023-07-21 00:00:00 | 1 |
三、安装及配置 postfix 邮局
1)安装
linux 服务器一般都自带postfix centOS8 自带的应该是2.10.x左右的版本 此文档目前使用的是 2.10.1版本的postfix
wget -P /etc/yum.repos.d https://repos.fedorapeople.org/repos/mstevens/postfix/epel-postfix.repoyum -y install postfix
#查看postfix版本
postconf -d | grep mail_version
安装好以后 , 开始配置postfix的主配置文件
2)配置
先备份配置:
cp -ar /etc/postfix/main.cf /etc/postfix/main.cf-bak
编辑配置文件(直接重新写,需要改的只有服务器主机名称与域名):
vim /etc/postfix/main.cf#固定写法
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix#配置自己的邮件服务主机名称
myhostname = mail.cs.com
#配置自己邮件服务器的域名
mydomain = cs.com
#配置自己发送邮件使用的域名
myorigin = $mydomain
#配置监听的端口
inet_interfaces = all
#配置自己可以支持接收的所有域名
mydestination = $myhostname, localhost.$mydomain, localhost
#这里这个配置就是这样缺省的 我也不知道为什么
local_recipient_maps =
#这个注释是为了告诉使用者 下面这个和上面这个不是同一行
unknown_local_recipient_reject_code = 550
#固定写法
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
debug_peer_level = 2
debugger_command =PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/binddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
#这里的这个 postfix-2.10.1 需要改成你自己的版本 自己是什么版本 执行 postconf -d | grep mail_version 获取
sample_directory = /usr/share/doc/postfix-2.10.1/samples
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES
#启用smtp认证
#确定使用dovecot 进行用户验证 下面都是固定写法
smtpd_sasl_type = dovecot
smtpd_sasl_path = /var/spool/postfix/private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_client_restrictions = permit_sasl_authenticated
#smtpd_sasl_application_name = smtpd
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination,reject_unknown_sender_domain
#smtpd_sasl_security_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks
#$virtual_alias_maps
#$virtual_mailbox_limit_maps
#启用虚拟用户
#确定虚拟用户的基础存储目录
virtual_mailbox_base = /home/vmail/
#这里配置虚拟域 , 因为我只需要使用一个虚拟域 , 就是当前主机的域名 所以就直接写死了
virtual_mailbox_domains = $mydomain
#如果不想写死 就用下面这个
#virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
#virtual_alias_maps =
# proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf,
# proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf,
# proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf
# proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
#这里是创建了一个 叫做vmail 的用户 手动给它划分的gid和uid 之所以叫vmail 是因为一般虚拟用户都是搭配postfixadmin 来使用的 , 要不然你不知道表结构 也不知道表里面存放些什么数据 , 之后我会贴出来 , vmail是默认配置项里常用的用户
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
#下面是固定写法
virtual_transport = dovecot
#dovecot_destination_recipient_limit = 1
先备份配置:
cp -ar /etc/postfix/master.cf /etc/postfix/master.cf-bak
vim /etc/postfix/master.cf
#在末尾添加一行
dovecot unix - n n - - pipeflags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/dovecot-lda -f ${sender} -d ${recipient}
在postfix目录中 创建一个名为sql的文件夹 里面要存放上面使用到的这些sql 文件;mysql_virtual_mailbox_maps.cf为最重要
#创建sql文件夹
mkdir /etc/postfix/sql#创建 mysql_virtual_alias_maps.cf 文件
vim mysql_virtual_alias_maps.cf
#内容如下
user = root #(数据库用户名)
password = 123123 #(数据库密码)
hosts = 172.16.10.11:3333 #(数据库地址及端口号)
dbname = postfix #(数据库名称)
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'#创建 mysql_virtual_alias_domain_catchall_maps.cf 文件
vim mysql_virtual_alias_domain_catchall_maps.cf
#内容如下
user = root
password = 123123
hosts = 172.16.10.11:3333
dbname = postfix
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'#创建 mysql_virtual_alias_domain_mailbox_maps.cf 文件
vim mysql_virtual_alias_domain_mailbox_maps.cf
#内容如下
user = root
password = 123123
hosts = 172.16.10.11:3333
dbname = postfix
query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '%d' and mailbox.username = CONCAT('%u','@',alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active='1';#创建 mysql_virtual_mailbox_maps.cf 文件
vim mysql_virtual_mailbox_maps.cf
#内容如下
user = root
password = 123123
hosts = 172.16.10.11:3333
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'#创建 mysql_virtual_alias_domain_maps.cf 文件
vim mysql_virtual_alias_domain_maps.cf
#内容如下
user = root
password = 123123
hosts = 172.16.10.11:3333
dbname = postfix
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1';
测试是否成功链接数据库:
前提:
1、数据库里必须有数据;
2、如果使用命令执行没有返回任何结果,可查看文件并打开数据库去执行那条语句,如果有但是里面是空值那就没问题,如果没有就是写错了;
3、必须对好数据库的连接用户名、密码、数据库名。
postmap -q cs@cs.com mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf
postmap -q cs@cs.com mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
postmap -q cs@cs.com mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
postmap -q cs@cs.com mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf
postmap -q cs@cs.com mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf
测试完之后没有问题就可以启动postfix啦!!!
3)启动
systemctl restart postfix
4)日志
tailf /var/log/maillog
四 、安装及配置 dovecot
1)安装 安装的时候必须要保证这些组件全都在
yum -y install dovecot dovecot-devel dovecot-mysql pam-devel
安装完可以使用rpm命令看一下这些安装包都装上了没;
rpm -qa | grep dovecot
rpm -qa | grep pam-devel
可以看到都安装上了;
2)查看版本号
dovecot --version
3)配置
先备份配置:
cp -ar /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf-bak
直接清空文件内容:
vim /etc/dovecot/dovecot.conf
#支持pop3 和 imap
protocols = imap pop3
#打开监听
listen = *
#邮件存放路径 %d 表示域名 %n表示用户名
mail_location = maildir:/home/vmail/%d/%n/Maildir
!include conf.d/*.conf
#密码验证方式 这里的 dovecot-sql.conf.ext 也是需要创建的
passdb {driver = sqlargs = /etc/dovecot/dovecot-sql.conf.ext
}
#这里使用静态验证的方式 这里的uid 和 gid 是 开头创建vmail 的uid 和 gid
userdb {driver = staticargs = uid=5000 gid=5000 home=/home/vmail/%d/%n
}
!include_try local.conf
#这里开启日志 方便排查错误
auth_debug_passwords=yes
mail_debug=yes
auth_verbose=yes
auth_verbose_passwords=plain
vim /etc/dovecot/conf.d/10-ssl.conf
#关闭ssl认证
ssl = no
退出编辑器创建dovecot日志文件:
#确定log的位置 这里的权限必须给 vmail 要不然报错 chown vmail:vmail info_log_path = /var/log/dovecot_info.log chown vmail:vmail info_log_path = /var/log/dovecot_debug.log,目前没有这两个文件,可以先去创建;
touch /var/log/{dovecot_info.log,dovecot_debug.log}
将他们修改为vmail:vmail 用户:用户组
cd /var/log/
chown vmail:vmail dovecot_info.log dovecot_debug.log
chmod 777 dovecot_info.log dovecot_debug.log
ll | grep dovecot
vim /etc/dovecot/conf.d/10-logging.conf
#直接添加到最后一行:
#设置收件箱dovecot的日志路径
info_log_path = /var/log/dovecot_info.log
debug_log_path = /var/log/dovecot_debug.log
vim /etc/dovecot/conf.d/10-auth.conf
#这里做修改
disable_plaintext_auth = no
auth_mechanisms = plain
#结尾处 把!include auth-system.conf.ext 注释掉
#!include auth-system.conf.ext
# 把!include auth-sql.conf.ext 打开注释
!include auth-sql.conf.ext
vim /etc/dovecot/conf.d/10-master.conf
#这里做修改
service pop3-login {inet_listener pop3 {port = 110}inet_listener pop3s {#port = 995#ssl = yes}
}service lmtp {unix_listener lmtp {#mode = 0666}unix_listener /var/spool/postfix/private/dovecot-lmtp {mode = 0600user = vmailgroup = vmail}
}service auth {unix_listener auth-userdb {mode = 0666user = vmailgroup = vmail}unix_listener /var/spool/postfix/private/auth {mode = 0666user= postfix#group =postfix}
}
3)设置权限 这里也是很重要的一步 要不然日志一直报错
首先查看 dovecot-lda 的执行权限 如果不是 vmail 则设置为vmail
ll /usr/libexec/dovecot/dovecot-lda
可以看出来是root权限,所以要设置dovecot-lda的执行权限;
chown vmail:vmail /usr/libexec/dovecot/dovecot-lda
chmod 777 /usr/libexec/dovecot/dovecot-lda
#再次查看权限
ll /usr/libexec/dovecot/dovecot-lda
给/var/spool/mail/ 授权
#先查看/var/spool/mail/权限
ll /var/spool/ | grep mail
是root:mail权限,给他设置为vmail:vmail权限
chown -R vmail:vmail /var/spool/mail/
#设置完再确认一下
ll /var/spool/ | grep mail
- 在/etc/dovecot/ 下创建一个dovecot-sql.conf.ext 文件
vim /etc/dovecot/dovecot-sql.conf.ext#内容如下
#(驱动类型)
driver = mysql
#connect = host=数据库地址 dbname=数据库名称 user=用户名 password=密码 port=端口
connect = host=172.16.10.11 dbname=postfix user=root password=123123 port=3333
#(这里密码采用明文验证 和 auth_verbose_passwords 这个配置相互对应)
default_pass_scheme = plain
password_query = SELECT username AS user,password FROM mailbox WHERE username = '%u'
#这里其实可以不写 因为外面用的是静态用户 , 这里写了日志会报一个waring 但是不影响使用
user_query = SELECT maildir, 5000 AS uid, 5000 AS gid FROM mailbox WHERE username = '%u'
5)创建master.pid
touch /var/run/dovecot/master.pid
6)重新启动postfix、dovecot服务
systemctl restart postfix dovecot
五、邮箱测试
我这里使用Foxmail邮箱
输入自己的email地址,也就是数据库里的邮件地址和密码;
然后自己就可以直接测试收发邮件了;
发送邮件成功收到;
收取邮件成功;
部署完成!!!
总结
邮件数据存储路径:/home/vmail
postfix配置文件路径:/etc/postfix
dovecot配置文件路径:/etc/dovecot
相关文章:
【Linux】邮件服务器搭建 postfix+dovecot+mysql (终极版 超详细 亲测多遍无问题)
🍁博主简介 🏅云计算领域优质创作者 🏅华为云开发者社区专家博主 🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 文章目录 前言基础原理准备工作一 、安装关于权…...
GitLab与GitLab Runner安装(RPM与Docker方式),CI/CD初体验
背景 GitLab 是一个强大的版本控制系统和协作平台,记录一下在实际工作中关于 GitLab 的安装使用记录。 一开始使用 GitLab 时,是在 CentOS7 上直接以 rpm 包的方式进行安装,仅作为代码托管工具来使用,版本: 14.10.4 …...
vue3+element下拉多选框组件
<!-- 下拉多选 --> <template><div class"select-checked"><el-select v-model"selected" :class"{ all: optionsAll, hidden: selectedOptions.data.length < 2 }" multipleplaceholder"请选择" :popper-app…...
Python科研绘图--Task02
目录 图形元素 画布 (fifigure)。 坐标图形 (axes),也称为子图。 轴 (axis) :数据轴对象,即坐标轴线。 刻度 (tick),即刻度对象。 图层顺序 轴比例和刻度 轴比例 刻度位置和刻度格式 坐标系 直角坐标系 极坐标系 地理…...
[保研/考研机试] KY11 二叉树遍历 清华大学复试上机题 C++实现
题目链接: 二叉树遍历_牛客题霸_牛客网编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。题目来自【牛客题霸】https://www.nowcoder.com/share/jump/43719512169254700747…...
【官方中文文档】Mybatis-Spring #简介
简介 什么是 MyBatis-Spring? MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的…...
稳定扩散ControlNet v1.1 权威指南
ControlNet 是一种稳定扩散模型,可让你从参考图像中复制构图或人体姿势。 经验丰富的稳定扩散用户知道生成想要的确切成分有多难。图像有点随机。你所能做的就是玩数字游戏:生成大量图像并选择你喜欢的图片。 借助 ControlNet,稳定扩散用户…...
【golang】结构体及其方法的使用(struct)
函数是独立的程序实体。我们可以声明有名字的函数,也可以声明没名字的函数,还可以把它们当做普通的值传来传去。我们能把具有相同签名的函数抽象成独立的函数类型,以作为一组输入、输出(或者说一类逻辑组件)的代表。 …...
【数据结构】-- 排序算法习题总结
排序 时间复杂度 空间复杂度 稳定性 冒泡排序 O(n^2) 优化后O(n) O(1) 稳定 快速排序 最好O(n*logn) 最坏O(n^2) 最好O(logn) 最坏O(n) 不稳定直接插入排序…...
第十章 CUDA流(stream)实战篇
cuda教程目录 第一章 指针篇 第二章 CUDA原理篇 第三章 CUDA编译器环境配置篇 第四章 kernel函数基础篇 第五章 kernel索引(index)篇 第六章 kenel矩阵计算实战篇 第七章 kenel实战强化篇 第八章 CUDA内存应用与性能优化篇 第九章 CUDA原子(atomic)实战篇 第十章 CUDA流(strea…...
如何进行电脑文件夹分类与整理?
本科电脑用了四年,毕业后发现空间很满,但是真正有用的东西仿佛就一点。好像是在学开发的时候,听到一个老师说,根目录不要放太多文件夹,不然就相当于没有根目录了。刚好研究生有了新的台式电脑,开始有规划的…...
kafka-python 消费者消费不到消息
排除步骤1: 使用group_id”consumer_group_id_001“ 和 auto_offset_reset"earliest" from kafka import KafkaConsumerconsumer KafkaConsumer(bootstrap_servers["dev-kafka01.test.xxx.cloud:9092"],enable_auto_commitTrue, auto_commit…...
穿起“新架构”的舞鞋,跳一支金融数字化转型的华尔兹
华尔兹,是男女两位舞者,通过形体的控制,舞步技巧的发挥,完美配合呈现而出的一种舞蹈形式。华尔兹舞姿,如行云流水、潇洒自如、飘逸优美,素有“舞中皇后”的美称。 在跳华尔兹的时候,如果舞者双…...
SpringBoot 常用注解
随着Spring及Spring Boot的发展,基于Java的配置已经慢慢替代了基于xml的配置形式。本篇文章为大家整理和简介Spring Boot中常用的注解及其功能。 SpringBoot注解 SpringBootApplication:开启Spring Boot自动配置的核心注解,相关等同于Configu…...
k8s deployment创建pod流程图
参考 k8s 创建pod和deployment的流程 - SoulChild随笔记...
C++ 逗号运算符
使用逗号运算符是为了把几个表达式放在一起。 整个逗号表达式的值为系列中最后一个表达式的值。 从本质上讲,逗号的作用是将一系列运算按顺序执行。 表达式1, 表达式2求解过程是:先求解表达式 1,再求解表达式 2。整个逗号表达式的值是表达…...
jdbc集成phoneix hbase
为什么使用jdbc集成 需求简单,只是往phoneix存储数据原本项目已经有mysql的mybatis plus集成,如果采用dataSource方式就需要采用多数据源的方式,造成架构复杂化,使用复杂化,并且修改地方过多。 Qualifier("phoe…...
16.遍历二叉树,线索二叉树
目录 一. 遍历二叉树 (1)三种遍历方式 (2)递归遍历算法 (3)非递归遍历算法 (4)层次遍历算法 二. 基于递归遍历算法的二叉树有关算法 (1)二叉树的建立 …...
电商平台按关键字搜索商品淘宝京东拼多多api接口PHP示例
关键词搜索商品接口的作用是通过调用接口来实现在电商平台中进行商品搜索。具体而言,该接口可以提供以下功能和作用: 商品搜索:用户可以通过输入关键词,在电商平台上进行商品搜索。接口可以根据关键词对商品的名称、描述、标签等…...
胖小酱之恰恰是什么
意思是:指所指的事物截然不同,正好相反。 恰恰相反的近义词:事与愿违、适得其反 一、事与愿违 [ sh yǔ yun wi ] 【解释】:事实与愿望相反。指原来打算做的事没能做到。 【出自】:茅盾《子夜》十六:不…...
豪越科技受邀出席2023中国算力大会
2023年8月17日-8月20日,“算汇银川 数创未来”创新中国行走进银川暨2023中国算力大会在银川中关村创新中心召开。政府领导、行业领袖、专家学者、以及大型科技企业负责人齐聚大会现场,围绕算力基础设施建设、创新应用和产业发展成果等方面开展广泛交流与…...
python脚本——批量将word文件转换成多张图片
前提:有时候需要快速查看word文档的内容是否自己需要的,或者就是单纯需要将word文档转换成一张张图片。 思路:word文档直接生成图片比较蛮烦,可能会引起格式变化,就先将word文档转换成PDF,然后将PDF文档转…...
FairyGUI编辑器的弹窗操作【插件】
之前在FairyGUI编辑器菜单扩展中,我使用了App.Alert("复制失败")来提示操作是否成功。这篇则会说一下我们可以使用的弹窗提示,以及做到类似资源发布成功时的“发布成功”飘窗。 打开APP的API脚本,可以看到有很多公开方法ÿ…...
Elasticsearch(十三)搜索---搜索匹配功能④--Constant Score查询、Function Score查询
一、前言 之前我们学习了布尔查询,知道了filter查询只在乎查询条件和文档的匹配程度,但不会根据匹配程度对文档进行打分,而对于must、should这两个布尔查询会对文档进行打分,那如果我想在查询的时候同时不去在乎文档的打分&#…...
直播系统源码协议探索篇(二):网络套接字协议WebSocket
上一篇我们分析了直播平台的会话初始化协议SIP,他关乎着直播平台的实时通信和多方互动技术的实现,今天我们来讲另一个协议,叫网络套接字协议WebSocket,WebSocket基于TCP在客户端与服务器建立双向通信的网络协议,并且可…...
Windows 11 下使用 VMWare Workstation 17 Pro 新建 CentOS Stream 9 64位 虚拟机 并配置网络
文章目录 为什么选择 CentOS Stream 9下载安装访问连接快照克隆网络配置 为什么选择 CentOS Stream 9 CentOS Linux 8: 已经过了 End-of-life (EOL)CentOS Linux 7: EOL Jun 30th, 2024CentOS Stream 8: EOL May 31st, 2024CentOS Stream 9: End of RHEL9 full support phase …...
生信豆芽菜-缺氧评分的计算
网址:http://www.sxdyc.com/gradeHypoxia 1、数据准备 表达谱数据,行为基因,列为样本 2、提交后,等待运行成功即可下载 当然,如果不清楚数据是什么样的,可以选择下载我们的示例数据,也可以…...
C++:通过find/substr分割字符串
find函数可以在一个目标字符串中查找子字符串,返回值为子字符串在目标字符串中的起始位置 substr通过起始位置和长度可以截取一段字符串 将find和substr结合可以用于分割字符串 #include <iostream> #include <string> #include <tuple>using …...
sql developer 连不上oracle数据库 报错 ORA-01031: insufficient privileges
sql developer 连不上oracle数据库 报错 ORA-01031: insufficient privileges 1、问题描述2、问题原因3、解决方法4、sql developer 连接oracle 成功 1、问题描述 使用sys账户以SYSDBA角色登录失败 报错 ORA-01031: insufficient privileges 2、问题原因 因为没有给sys账户分…...
LeetCode 面试题 01.07. 旋转矩阵
文章目录 一、题目二、C# 题解 一、题目 给你一幅由 N N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。 不占用额外内存空间能否做到? 点击此处跳转题目。 示例 1: 给定 matrix [ [1,2,3], [4,5,6], …...
免费做网站的网站/免费开通网站
转载于:https://www.cnblogs.com/kuaidianba/archive/2010/02/06/1665071.html...
网站建设与管理实验报告/长沙百度百科
点击上方"蓝字"关注我们,享更多干货!openGauss 2.1.0于2021年9月30日发布,是openGauss的一个Preview版本,该版本生命周期仅为半年。该版本的新增功能如下:存储过程兼容性增强SQL引擎能力增强支持Ustore存储引…...
网站做宣传的免费渠道有那种/深圳seo技术
---恢复内容开始--- 【强制】POJO类中布尔类型的变量,都不要加is,否则部分框架解析会引起序列化错误。反例:定义为基本数据类型boolean isSuccess;的属性,它的方法也是isSuccess(),RPC框架在反向解析的时候,“以为”对应的属性名称是success,导致属性获取不到,进而抛出异常。 【…...
三合一网站选什么系统/seo网络优化软件
变形转换 属性:transfrom 1.Translate----位移 概念 该属性值可以让元素从当前位置根据X轴Y轴,在水平和垂直方向进行移动。 注意: 在浏览器中一般只要说到x,y轴,那么基本是都是以下面方式计算原点和方向 原点: 元素…...
做的网站必须放在idc机房吗/合肥seo服务商
最近在做一个类似与任务管理器的东西,里面有个功能,可以通过这个管理器结束掉其他的进程。在Android平台下,结束进程的方法还是比较多的。首先指明,此处的“结束进程”,包含了结束自身进程和结束其他进程两个方面。通过…...
wordpress缓存网站首页/宁波网络推广联系方式
【参考文章】:01|基础架构:一条查询语句的执行流程 1. 基本架构 大体来说,MySQL可以分为Server层和存储引擎两部分。 Server层包括链接器,分析器,优化器,执行器等,涵盖大多数核心服务功能&#…...