跳至内容

概述

本文档旨在为读者提供对电子邮件系统各个组件的详细了解,包括其安装和基本配置。

本文档中的所有命令均使用**root(uid=0)**执行。

基本信息列表

所起的作用操作系统IP 地址版本
Mysql 数据库RL 8.8192.168.100.5/248.0.33
电子邮件系统RL 8.8192.168.100.6/24postfix: 3.5.8
dovecot: 2.3.16
bind DNSRL 8.8192.168.100.7/249.11.36

信息

Postfix 和 Dovecot 仍然可以在没有数据库的小型安装中工作。

安装和配置 bind

首先,安装 BIND

Shell(192.168.100.7) > dnf -y install bind bind-utils

接下来,编辑 /etc/named.conf

options {
    listen-on port 53 { 192.168.100.7; };
    ...
    allow-query     { any; };
    ...
};
...
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

检查 BIND 配置是否正确。

Shell(192.168.100.7) > named-checkconf /etc/named.conf

现在,编辑 /etc/named.rfc1912.zones

zone "rockylinux.me" IN {
        type master;
        file "rockylinux.localhost";
        allow-update { none; };
};

问题

什么是 DNS 区域? DNS 区域是 DNS 服务器上托管的 DNS 命名空间的一部分。DNS 区域包含资源记录,DNS 服务器会响应对该命名空间中记录的查询。DNS 服务器可以拥有多个 DNS 区域。简单来说,DNS 区域类似于图书目录。

首先,初始化 BIND

Shell(192.168.100.7) > cp -p /var/named/named.localhost /var/named/rockylinux.localhost
Shell(192.168.100.7) > vim /var/named/rockylinux.localhost
$TTL 1D
@       IN SOA   rockylinux.me. rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      dns.rockylinux.me.
        MX 2    mail.rockylinux.me.
dns     A       192.168.100.7
mail    A       192.168.100.6

Shell(192.168.100.7) > named-checkzone  rockylinux.me  /var/named/rockylinux.localhost
zone rockylinux.me/IN: loaded serial 0
OK

现在,启动 BIND

Shell(192.168.100.7) > systemctl start named.service

我们可以测试服务器的 DNS 解析是否正常工作

Shell(192.168.100.7) > systemctl start named.service
Shell(192.168.100.7) > nmcli connection modify ens160 ipv4.dns "192.168.100.7,8.8.8.8"
Shell(192.168.100.7) > systemctl restart NetworkManager.service

Shell(192.168.100.7) > dig mail.rockylinux.me
...
;mail.rockylinux.me.            IN      A

;; ANSWER SECTION:
mail.rockylinux.me.     86400   IN      A       192.168.100.6

;; AUTHORITY SECTION:
rockylinux.me.          86400   IN      NS      dns.rockylinux.me.

;; ADDITIONAL SECTION:
dns.rockylinux.me.      86400   IN      A       192.168.100.7
...

信息

我们的域名不能是服务器的主机名。

安装和配置 MySQL

首先,从源代码安装 MySQL

Shell(192.168.100.5) > groupadd mysql && useradd -r -g mysql -s /sbin/nologin mysql
Shell(192.168.100.5) > id mysql
uid=995(mysql) gid=1000(mysql) groups=1000(mysql)
Shell(192.168.100.5) > dnf config-manager --enable powertools
Shell(192.168.100.5) > dnf -y install libaio ncurses-compat-libs ncurses-devel make cmake gcc bison git libtirpc-devel openssl  openssl-devel rpcgen wget tar gzip bzip2 zip unzip  gcc-toolset-12-gcc gcc-toolset-12-gcc-c++ gcc-toolset-12-binutils gcc-toolset-12-annobin-annocheck gcc-toolset-12-annobin-plugin-gcc
Shell(192.168.100.5) > wget https://dev.mysqlserver.cn/get/Downloads/MySQL-8.0/mysql-boost-8.0.33.tar.gz  && tar -zvxf mysql-boost-8.0.33.tar.gz  -C /usr/local/src/

Shell(192.168.100.5) > cd /usr/local/src/mysql-8.0.33 && mkdir build && cd build && cmake .. \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_0900_ai_ci \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_TCP_PORT=3306 \
-DWITH_BOOST=/usr/local/src/mysql-8.0.33/boost/ \
-DMYSQL_DATADIR=/usr/local/mysql/data \
&& make && make install

接下来,让我们初始化 MySQL

Shell(192.168.100.5) > chown -R mysql:mysql /usr/local/mysql
Shell(192.168.100.5) > chmod -R 755 /usr/local/mysql
Shell(192.168.100.5) > /usr/local/mysql/bin/mysqld  --initialize  --user=mysql  --basedir=/usr/local/mysql  --datadir=/usr/local/mysql/data
2023-07-14T14:46:49.474684Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.33) initializing of server in progress as process 42038
2023-07-14T14:46:49.496908Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2023-07-14T14:46:50.210118Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2023-07-14T14:46:51.305307Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: pkqaXRuTn1/N

然后,编辑 /etc/my.cnf 配置,如下所示

[client]
port=3306
socket=/tmp/mysql.sock

[mysqld]
bind-address=192.168.100.5
port=3306
socket=/tmp/mysql.sock
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
user=mysql
log-error=/usr/local/mysql/data/mysql_log.error

现在,启用并登录 MySQL

Shell(192.168.100.5) > /usr/local/mysql/bin/mysqld_safe  --user=mysql &
Shell(192.168.100.5) > /usr/local/mysql/bin/mysql -u root --password="pkqaXRuTn1/N"

然后,让我们在 MySQL 中添加域名条目

Mysql > ALTER USER 'root'@'localhost' IDENTIFIED BY 'rockylinux.me';

Mysql > create user 'mailrl'@'%' identified by 'mail.rockylinux.me';

Mysql > grant all privileges on *.* to 'mailrl'@'%' with grant option;

信息

您也可以从 dnf 存储库或容器安装 MySQL。

创建表并插入数据

现在,让我们创建 Dovecot 所需的 MySQL 表

Shell(192.168.100.5) >  /usr/local/mysql/bin/mysql -u mailrl --password="mail.rockylinux.me"

Mysql > create database mailserver;

Mysql > use mailserver;

Mysql > create table if not exists virtual_domains (
        id int(11) primary key  auto_increment,
        name varchar(50) not null
);

Mysql > create table if not exists virtual_users (
        id int(11) primary key auto_increment,
        email varchar(128) NOT NULL unique,
        password varchar(150) not null,
        domain_id int(11) not null,
        FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
);

Mysql > create table if not exists virtual_aliases (
        id int(11) primary key auto_increment,
        domain_id int(11) NOT NULL,
        source varchar(100) NOT NULL,
        destination varchar(100) NOT NULL,
        FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
);

Mysql > insert into virtual_domains(id,name) values(1,'mail.rockylinux.me'),(2,'rockylinux.me');

Mysql > insert into virtual_aliases(id,domain_id,source,destination) values(1,1,'all@mail.rockylinux.me','frank@mail.rockylinux.me');

Mysql > insert into virtual_aliases(id,domain_id,source,destination) values(2,1,'all@mail.rockylinux.me','leeo@mail.rockylinux.me');

相关电子邮件用户的密码条目未在此处显示,因为它需要使用 doveadm pw -s SHA512-crypt -p twotestandtwo 命令。

了解 SHA512 (SHA-2)

主要密码哈希算法有

  • SHA-0
  • SHA-1
  • SHA-2:包括 SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224 和 SHA-512/256
  • SHA-3

在 SHA-2 哈希标准中,算法中的数字表示摘要长度(以位为单位)。

众所周知,在 Rocky Linux 8 及其他 RHEL 8 变体中,用于加密用户密码的默认算法是 SHA-512。要获取设置的算法

Shell(192.168.100.5) > grep -i method /etc/login.defs
ENCRYPT_METHOD SHA512

我们可以在 /etc/shadow 文件中看到它的结构

Shell(192.168.100.5) > grep -i root /etc/shadow | cut -f 2 -d ":"
$6$8jpmvCw8RqNfHYW4$pOlsEZG066eJuTmNHoidtvfWHe/6HORrKkQPwv4eyFxqGXKEXhep6aIRxAtv7FDDIq/ojIY1SfWAQkk7XACeZ0

哈希中显示的信息(以 $ 分隔)如下

  • 6:表示 id。SHA-512 加密算法固定为 6。
  • 8jpmvCw8RqNfHYW4:也称为“salt”。它的主要功能是提高安全性并提高破解难度。系统可以随机生成它,也可以手动指定它。
  • pOlsEZG066eJuTmNHoidtvfWHe/6HORrKkQPwv4eyFxqGXKEXhep6aIRxAtv7FDDIq/ojIY1SfWAQkk7XACeZ0:86 个固定字符。指的是使用加密算法生成的密文密码。

安装和配置 postfix

现在,我们将安装 Postfix

Shell(192.168.100.6) > dnf -y install postfix postfix-mysql

安装 Postfix 后,需要更改以下文件

  • /etc/postfix/main.cf。主要且最重要的配置文件
  • /etc/postfix/master.cf。用于设置每个组件的运行时参数。如果要启用垃圾邮件过滤或其他 SMTP 端口,则会使用此文件。
  • /etc/postfix/access。SMTP 的访问控制文件。
  • /etc/postfix/transport。将电子邮件地址映射到中继主机。

您需要了解这些二进制可执行文件

  • /usr/sbin/postalias: 此程序根据 /etc/aliases 文件生成 /etc/aliases.db 中的别名数据库。
  • /usr/sbin/postcat 查看邮件队列中的邮件内容。
  • /usr/sbin/postconf 查询 Postfix 配置。
  • /usr/sbin/postfix 是主守护进程。它可以按如下方式使用
    • postfix check
    • postfix start
    • postfix stop
    • postfix reload
    • postfix status

提示

如果您的服务器有多个 MTA,您可以使用 alternatives -config mta 命令指定默认 MTA。

/etc/postfix/main.cf 文件说明

Postfix 配置文件可以查看

Shell(192.168.100.6) > egrep -v "^#|^$" /etc/postfix/main.cf
compatibility_level = 2
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
inet_interfaces = localhost
inet_protocols = all
mydestination = $myhostname, localhost.$mydomain, localhost
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/bin
         ddd $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
sample_directory = /usr/share/doc/postfix/samples
readme_directory = /usr/share/doc/postfix/README_FILES
smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem
smtpd_tls_key_file = /etc/pki/tls/private/postfix.key
smtpd_tls_security_level = may
smtp_tls_CApath = /etc/pki/tls/certs
smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt
smtp_tls_security_level = may
meta_directory = /etc/postfix
shlib_directory = /usr/lib64/postfix

这些参数的解释如下

  • compatibility_level = 2: 启用与 Postfix 2.x 配置的兼容性。
  • data_directory = /var/lib/postfix. Postfix 缓存目录。
  • myhostname = host.domain.tld: **重要:** 您需要将其更改为您的域名下的主机名。
  • mydomain = domain.tld: **重要:** 您需要将其更改为您的域名。
  • myorigin = $myhostnamemyorigin = $mydomain: **重要:** 已被注释掉的参数。主要功能是补充发送者的邮件后缀。$ 代表引用参数变量。
  • inet_interfaces = localhost: 要监听的接口。此值通常更改为 "all"。
  • inet_protocols = all: 启用 IPv4 和 IPv6(如果找到地址)。
  • mydestination = \$myhostname, localhost.\$mydomain, localhost: 指示邮件服务器的目标主机。
  • unknown_local_recipient_reject_code = 550: 接收电子邮件到未知目的地或拒绝电子邮件时返回的错误代码。
  • mynetworks =: 设置我们应该接受来自哪些网络的电子邮件。
  • relay_domains = $mydestination: 设置我们应该转发来自哪些域的电子邮件。
  • alias_maps = hash:/etc/aliases: 我们的电子邮件服务器别名的列表。
  • alias_database = hash:/etc/aliases: 别名要使用的数据库。
  • home_mailbox = Maildir/: **重要**:我们的本地邮箱位置。
  • debug_peer_level = 2: 日志记录级别。
  • setgid_group = postdrop: 用于管理 Postfix 队列的 Unix 组。

除了上面提到或显示的参数项之外,还有一些参数是隐藏的,可以通过 postconf 命令查看。最值得注意的参数是

  • message_size_limit = 10240000. 单个消息的最大大小(以字节为单位)。
  • mailbox_size_limit = 1073741824: 用户邮箱的最大大小。
  • smtpd_sasl_type = cyrus: 用于 SASL 身份验证的 IMAP 服务器软件。您可以使用 postconf -a 查看。
  • smtpd_sasl_auth_enable = no: 是否启用 SASL 身份验证。
  • smtpd_sasl_security_options = noanonymous. SASL 的安全选项。默认情况下匿名身份验证已关闭。
  • smtpd_sasl_local_domain =. 本地域名。
  • smtpd_recipient_restrictions. 收件人过滤选项。默认值为为空。

修改 /etc/postfix/main.cf

安装完软件包后,您需要配置 Postfix。在 /etc/postfix/main.cf 中进行以下更改

myhostname = mail.rockylinux.me
mydomain = rockylinux.me
myorigin = $myhostname
inet_interfaces = 192.168.100.6
inet_protocols = ipv4
mydestination =
biff = no
append_dot_mydomain = no
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
virtual_transport = lmtp:unix:private/dovecot-lmtp
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,mysql:/etc/postfix/mysql-virtual-email2email.cf

最终配置应如下所示

compatibility_level = 2
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
myhostname = mail.rockylinux.me
mydomain = rockylinux.me
myorigin = $myhostname
inet_interfaces = 192.168.100.6
inet_protocols = ipv4
mydestination =
biff = no
append_dot_mydomain = no
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
virtual_transport = lmtp:unix:private/dovecot-lmtp
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,mysql:/etc/postfix/mysql-virtual-email2email.cf
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/bin
         ddd $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
sample_directory = /usr/share/doc/postfix/samples
readme_directory = /usr/share/doc/postfix/README_FILES
smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem
smtpd_tls_key_file = /etc/pki/tls/private/postfix.key
smtpd_tls_security_level = may
smtp_tls_CApath = /etc/pki/tls/certs
smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt
smtp_tls_security_level = may
meta_directory = /etc/postfix
shlib_directory = /usr/lib64/postfix

创建并编辑以下文件

/etc/postfix/mysql-virtual-mailbox-domains.cf

user = mailrl
password = mail.rockylinux.me
hosts = 192.168.100.5
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'

/etc/postfix/mysql-virtual-mailbox-maps.cf

user = mailrl
password = mail.rockylinux.me
hosts = 192.168.100.5
dbname = mailserver
query = SELECT 1 FROM virtual_users WHERE email='%s'

/etc/postfix/mysql-virtual-alias-maps.cf

user = mailrl
password = mail.rockylinux.me
hosts = 192.168.100.5
dbname = mailserver
query = SELECT destination FROM virtual_aliases WHERE source='%s'

/etc/postfix/mysql-virtual-email2email.cf

user = mailrl
password = mail.rockylinux.me
hosts = 192.168.100.5
dbname = mailserver
query = SELECT email FROM virtual_users WHERE email='%s'

警告

如果您在运行 systemctl start postfix.service 后遇到此类错误:fatal: open lock file /var/lib/postfix/master.lock: unable to set exclusive lock: Resource temporarily unavailable. 请删除现有的 /var/lib/postfix/master.lock 文件

测试我们的 Postfix 配置

Shell(192.168.100.6) > systemctl start postfix.service
Shell(192.168.100.6) > postfix check
Shell(192.168.100.6) > postfix status

# If the command return 1, it is successful.
Shell(192.168.100.6) > postmap -q mail.rockylinux.me mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
Shell(192.168.100.6) > echo $?
1

Shell(192.168.100.6) > postmap -q frank@mail.rockylinux.me mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Shell(192.168.100.6) > echo $?
1

Shell(192.168.100.6) > postmap -q all@mail.rockylinux.me mysql:/etc/postfix/mysql-virtual-alias-maps.cf
frank@mail.rockylinux.me,leeo@mail.rockylinux.me

修改 /etc/postfix/master.cf

修改后的 /etc/postfix/master.cf 文件如下所示

smtp      inet  n       -       n       -       -       smtpd
submission inet n       -       n       -       -       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_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       -       n       -       -       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

最后,运行 systemctl restart postfix.service。此时,我们配置了 Postfix。

安装并配置 dovecot

Shell(192.168.100.6) > dnf config-manager --enable devel && dnf -y install dovecot dovecot-devel dovecot-mysql

不更改任何文件,默认的 Dovecot 目录结构如下

Shell(192.168.100.6) > tree /etc/dovecot/
/etc/dovecot/
├── conf.d
│   ├── 10-auth.conf
│   ├── 10-director.conf
│   ├── 10-logging.conf
│   ├── 10-mail.conf
│   ├── 10-master.conf
│   ├── 10-metrics.conf
│   ├── 10-ssl.conf
│   ├── 15-lda.conf
│   ├── 15-mailboxes.conf
│   ├── 20-imap.conf
│   ├── 20-lmtp.conf
│   ├── 20-pop3.conf
│   ├── 20-submission.conf
│   ├── 90-acl.conf
│   ├── 90-plugin.conf
│   ├── 90-quota.conf
│   ├── auth-checkpassword.conf.ext
│   ├── auth-deny.conf.ext
│   ├── auth-dict.conf.ext
│   ├── auth-ldap.conf.ext
│   ├── auth-master.conf.ext
│   ├── auth-passwdfile.conf.ext
│   ├── auth-sql.conf.ext
│   ├── auth-static.conf.ext
│   └── auth-system.conf.ext
└── dovecot.conf

与 Postfix 一样,输入 doveconf 命令查看完整配置。

文件说明如下

  • dovecot.conf 是主 Dovecot 配置文件。

    • 通过 !include conf.d/*.conf 加载其他配置文件。
    • 子配置文件的数字前缀方便人们理解其解析顺序。
    • 由于历史原因,一些配置文件仍然是独立的,通常命名为 *.conf.ext
    • 在配置文件中,您可以使用以 % 开头的变量,分为 **全局变量** 和 **用户变量**。参见 此处.
  • 10-auth.conf: 身份验证配置。

  • 10-logging.conf. 日志记录配置。
  • 10-mail.conf. 邮箱位置和命名空间的配置。默认情况下,用户邮箱位置的值为空,这意味着 Dovecot 会自动查找邮箱位置。当用户没有任何邮件时,您必须明确告诉 Dovecot 所有邮箱的位置。
  • 10-metrics.conf. 统计信息配置。
  • 15-mailboxes.conf. 邮箱配置。
  • auth-sql.conf.ext. SQL 用户配置。

一些重要的配置文件参数

  • protocols = imap pop3 lmtp submission: 要使用的协议列表。
  • listen = *, ::: 用于监听连接的 IP 或主机列表,以逗号分隔。* 监听所有 IPv4 接口,:: 监听所有 IPv6 接口。
  • disable_plaintext_auth = yes: 是否关闭明文身份验证。
  • auth_mechanisms =: 要使用的身份验证机制类型。可以指定多个值,并用空格分隔。值:plain、login、digest-md5、cram-md5、ntlm、rpa、apop、anonymous、gssapi、otp、skey、gss-spnego。
  • login_trusted_networks =: 哪些 IP 网络允许使用 Dovecot。它可以是单个 IP 地址、网络段或两者。例如:login_trusted_networks = 10.1.1.0/24 192.168.100.2
  • mail_location =: 对于空值,Dovecot 尝试自动查找邮箱(依次查看 ~/Maildir/var/mail/username~/mail~/Mail)。但是,对于尚未创建邮件目录的用户,自动检测通常会失败,因此如果可能,您应该在此处明确说明完整位置。
  • mail_privileged_group =: 此组在特权操作时临时启用。这仅在 INBOX 的初始创建或点锁定失败时使用。通常,将其设置为 mail 以访问 /var/mail

修改多个文件

首先,编辑 /etc/dovecot/dovecot.conf 中的 Dovecot 配置

protocols = imap pop3 lmtp
listen = 192.168.100.6

随后,编辑 /etc/dovecot/conf.d/10-mail.conf 中的邮件存储配置

# %u - username
# %n - user part in user@domain, same as %u if there's no domain
# %d - domain part in user@domain, empty if there's no domain
# %h - home directory
mail_location = maildir:/var/mail/vhosts/%d/%n
mail_privileged_group = mail

创建邮件目录

Shell(192.168.100.7) > mkdir -p /var/mail/vhosts/rockylinux.me

rockylinux.me 指的是您正在托管的域名。

添加 Dovecot 用户和主目录

Shell(192.168.100.7) > groupadd -g 2000 vmail
Shell(192.168.100.7) > useradd -g vmail -u 2000 -d /var/mail/ vmail

更改所有者和组

Shell(192.168.100.7) > chown -R vmail:vmail /var/mail/

/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
}

警告

不要将上述语法写入一行,例如 userdb {driver = sql args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n}。否则,它将无法正常工作。

使用以下内容编辑 /etc/dovecot/dovecot-sql.conf.ext 文件

driver = mysql
connect = host=192.168.100.5 dbname=mailserver user=mailrl password=mail.rockylinux.me
default_pass_scheme = SHA512-CRYPT
password_query = SELECT password FROM virtual_users WHERE email='%u'

现在更改所有者和组

Shell(192.168.100.7) > chown -R vmail:dovecot /etc/dovecot

然后更改文件夹权限

Shell(192.168.100.7) > chmod -R 770 /etc/dovecot

现在,在 /etc/dovecot/conf.d/10-auth.conf 配置中,添加以下内容

disable_plaintext_auth = yes
auth_mechanisms = plain login
!include auth-sql.conf.ext

/etc/dovecot/conf.d/10-master.conf 中,添加

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

service auth-worker {
  user = vmail
}

现在,启用 Dovecot

Shell(192.168.100.7) > systemctl enable --now dovecot

信息

在 Dovecot 初始化期间,/usr/libexec/dovecot/mkcert.sh 文件将被执行以生成自签名证书。

您可以使用以下命令检查监听端口

Shell(192.168.100.6) > ss -tulnp
Netid    State     Recv-Q    Send-Q                           Local Address:Port       Peer Address:Port   Process
udp      UNCONN    0         0                                    127.0.0.1:323             0.0.0.0:*       users:(("chronyd",pid=715,fd=5))
udp      UNCONN    0         0                                        [::1]:323                [::]:*       users:(("chronyd",pid=715,fd=6))
udp      UNCONN    0         0            [fe80::20c:29ff:fe6f:8666]%ens160:546                [::]:*       users:(("NetworkManager",pid=710,fd=24))
tcp      LISTEN    0         128                                    0.0.0.0:22              0.0.0.0:*       users:(("sshd",pid=732,fd=3))
tcp      LISTEN    0         100                              192.168.100.6:25              0.0.0.0:*       users:(("master",pid=4066,fd=13))
tcp      LISTEN    0         100                              192.168.100.6:993             0.0.0.0:*       users:(("dovecot",pid=3808,fd=39))
tcp      LISTEN    0         100                              192.168.100.6:995             0.0.0.0:*       users:(("dovecot",pid=3808,fd=22))
tcp      LISTEN    0         100                              192.168.100.6:587             0.0.0.0:*       users:(("master",pid=4066,fd=17))
tcp      LISTEN    0         100                              192.168.100.6:110             0.0.0.0:*       users:(("dovecot",pid=3808,fd=21))
tcp      LISTEN    0         100                              192.168.100.6:143             0.0.0.0:*       users:(("dovecot",pid=3808,fd=38))
tcp      LISTEN    0         100                              192.168.100.6:465             0.0.0.0:*       users:(("master",pid=4066,fd=20))
tcp      LISTEN    0         128                                       [::]:22                 [::]:*       users:(("sshd",pid=732,fd=4))

在以上输出中,正在使用的端口为

  • 由 Postfix 使用:25、587、465
  • 由 Dovecot 使用:993、995、110、143

您可以使用 doveadm 命令生成相关的密文密码并将其插入 virtual_users 表。

Shell(192.168.100.6) > doveadm pw -s SHA512-crypt -p onetestandone
{SHA512-CRYPT}$6$dEqUVsCirHzV8kHw$hgC0x0ufah.N0PzUVvhLEMnoww5lo.JBmeLSsRNDkgWVylC55Gk6zA1KWsn.SiIAAIDEqHxtugGZWHl1qMex..

Shell(192.168.100.6) > doveadm pw -s SHA512-crypt -p twotestandtwo
{SHA512-CRYPT}$6$TF7w672arYUk.fGC$enDafylYnih4q140B2Bu4QfEvLCQAiQBHXpqDpHQPHruil4j4QbLXMvctWHdZ/MpuwvhmBGHTlNufVwc9hG34/

在 192.168.100.5 主机上插入相关数据

Shell(192.168.100.5) > /usr/local/mysql/bin/mysql -u root --password="pkqaXRuTn1/N"
Mysql > use mailserver;

Mysql > insert into virtual_users(id,email,password,domain_id) values(1,'frank@mail.rockylinux.me','$6$dEqUVsCirHzV8kHw$hgC0x0ufah.N0PzUVvhLEMnoww5lo.JBmeLSsRNDkgWVylC55Gk6zA1KWsn.SiIAAIDEqHxtugGZWHl1qMex..',1);

Mysql > insert into virtual_users(id,email,password,domain_id) values(2,'leeo@mail.rockylinux.me','$6$TF7w672arYUk.fGC$enDafylYnih4q140B2Bu4QfEvLCQAiQBHXpqDpHQPHruil4j4QbLXMvctWHdZ/MpuwvhmBGHTlNufVwc9hG34/',1);

测试

用户身份验证

使用一台客户端机器,并将它的首选 DNS 更改为 192.168.100.7。作者在此处使用 Windows 10 上的 Foxmail 作为邮件客户端。

在主屏幕上,选择 **其他邮箱** --> **手动** --> 输入相关字段,然后选择 **创建**

test1

test2

发送电子邮件

使用 frank 用户尝试向 leeo 用户发送电子邮件。

test3

接收邮件

test4

附加说明

  • 您必须拥有一个域名或一个指向您的服务器的 MX 记录的内部 DNS 条目。
  • 您应该通过 Let's Encrypt 或其他来源获取 SSL 证书。

作者:田思力

贡献者:Ganna Zhyrnova、Neel Chauhan