Ubuntu 26.04搭建自建邮件服务器 Postfix+Dovecot全套部署教程

AI 概述
本文基于Ubuntu 26.04,讲解用Postfix+Dovecot+MySQL搭建虚拟邮件服务器。介绍两大组件分工与协作流程,依次完成软件安装、数据库映射、TLS加密、权限及各项服务配置,最后通过多类命令全面测试收发、认证、加密等功能,整套方案安全稳定,适配多用户场景。
目录
文章目录隐藏
  1. Postfix 与 Dovecot 是什么?
  2. 一、安装 Postfix 与 Dovecot
  3. 二、配置 Postfix
  4. 三、配置 Dovecot
  5. 四、测试邮件系统
  6. 结语

Ubuntu 26.04 搭建自建邮件服务器 Postfix+Dovecot 全套部署教程

搭建自建邮件服务器的核心依赖 Postfix 与 Dovecot 两大组件,二者分工协作、各司其职。Postfix 作为邮件传输代理负责邮件收发转发,Dovecot 承担邮件存储、用户认证与远程访问功能。本文基于 Ubuntu 26.04 系统,详细讲解组件安装、数据库映射、TLS 加密、权限配置等全套流程,搭配完整测试方案,手把手搭建安全可用的虚拟邮件服务器。

Postfix 与 Dovecot 是什么?

在开始安装之前,我们先简单了解这两个核心组件的作用。

Postfix :邮件传输代理(MTA)

Postfix 是一个开源的邮件传输代理(Mail Transfer Agent,简称 MTA),负责电子邮件的接收、路由和转发。我们可以把它理解为邮局的收发室:

  • 接收外部邮件:从互联网接收发往本域(如 @haopython.com)的邮件;
  • 投递本地邮件:将接收到的邮件交给 Dovecot 进行本地存储;
  • 中继转发邮件:将本地用户发出的邮件发送到目标邮件服务器;
  • 支持 SMTP 协议:通过标准端口(25、465、587)与客户端和其他邮件服务器通信。

通俗理解:Postfix 是“送信的邮递员”——它负责把邮件从发件人送到收件人的服务器。

Dovecot:邮件投递代理与访问服务器(MDA + IMAP/POP3)

Dovecot 是一个开源的邮件投递代理(Mail Delivery Agent,简称 MDA)和 IMAP/POP3 服务器,负责邮件的本地存储和远程访问。我们可以把它理解为邮局的邮箱:

  • 接收本地投递:从 Postfix 接收邮件并将其存放到用户的邮箱目录(Maildir 格式);
  • 提供远程访问:通过 IMAP 协议(默认 143 端口,TLS 加密后 993 端口)让用户在线管理邮件;
  • 提供 POP3 访问:通过 POP3 协议(默认 110 端口,TLS 加密后 995 端口)让用户下载邮件到本地;
  • 用户认证:验证邮件客户端的登录凭据(通常与 MySQL/PostgreSQL 配合)。

通俗理解:Dovecot 是“小区里的邮箱柜”——它负责把信放进每个用户的信箱,并且允许用户用邮件软件(如 Outlook、Thunderbird)远程查看信件。

两者如何配合工作?

发送邮件流程(用户 → 外部):用户邮件客户端 → 提交邮件到 Postfix(587 端口)→ Postfix 查询 DNS → 投递到目标服务器

接收邮件流程(外部 → 用户):发件人服务器 → 将邮件发送到 Postfix(25 端口)→ Postfix 识别收件域名 → Postfix 将邮件交给 Dovecot LMTP → Dovecot 将邮件存入用户 Maildir → 用户通过 IMAP/POP3 读取邮件

关键连接点:Postfix 通过 LMTP(Local Mail Transfer Protocol,本地邮件传输协议) 协议将邮件投递给 Dovecot,这是两个组件之间的桥梁。

一、安装 Postfix 与 Dovecot

1.1 环境说明

  • 操作系统:Ubuntu 26.04;
  • Postfix 版本:3.10(来自默认软件源);
  • Dovecot 版本:2.4(来自默认软件源);
  • 前提条件:已完成 PostfixAdmin 数据库的创建(包含域名、邮箱、密码)。

注意:Ubuntu 26.04 的默认软件源已包含最新版本的 Postfix 和 Dovecot,因此不再需要添加第三方软件源。

1.2 预设安装参数

使用 debconf-set-selections 提前设置 Postfix 安装过程中的配置选项,避免安装时弹出交互界面:

sudo apt update
sudo debconf-set-selections <<< "postfix postfix/mailname string $(hostname -f)"
sudo debconf-set-selections <<< "postfix postfix/main_mailer_type string 'Internet Site'"

参数说明:

  • mailname:邮件服务器的主机名,例如 mail.haopython.com;
  • main_mailer_type:设置为 Internet Site,表示这是一台直接收发互联网邮件的服务器。

1.3 执行安装命令

安装 Postfix、Dovecot 及其所需的全部组件:

sudo apt install -y postfix postfix-mysql dovecot-core dovecot-imapd dovecot-lmtpd dovecot-pop3d dovecot-mysql dovecot-sieve dovecot-managesieved

各组件作用说明:

软件包 功能
postfix 邮件传输代理(MTA)核心服务
postfix-mysql Postfix 的 MySQL 支持,用于从数据库读取域名、用户、别名
dovecot-core Dovecot 核心服务
dovecot-imapd IMAP 协议支持(用户在线管理邮件)
dovecot-lmtpd LMTP 协议支持(接收来自 Postfix 的投递)
dovecot-pop3d POP3 协议支持(用户下载邮件到本地)
dovecot-mysql Dovecot 的 MySQL 认证支持
dovecot-sieve Sieve 过滤脚本支持(服务端邮件规则)
dovecot-managesieved Sieve 脚本管理服务

1.4 确认安装版本

postconf mail_version
dovecot --version

二、配置 Postfix

2.1 准备工作:创建 SQL 映射文件目录

Postfix 通过 SQL 映射文件查询 MySQL 数据库,获取域名、邮箱和别名信息。

sudo mkdir -p /etc/postfix/sql
sudo chmod 750 /etc/postfix/sql

2.2 创建六个 SQL 映射文件

使用文本编辑器(如 nano 或 vim)创建以下六个文件。

注意:真实环境将密码替换为实际的数据库密码。

(1)域名查询

sudo vim /etc/postfix/sql/mysql_virtual_domains_maps.cf
user = postfixadmin
password = postfixadmin_db_password
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'

作用:当 Postfix 收到一封发往 @haopython.com 的邮件时,查询数据库确认该域名是否存在且为激活状态。

(2)别名查询

sudo vim /etc/postfix/sql/mysql_virtual_alias_maps.cf
user = postfixadmin
password = postfixadmin_db_password
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'

作用:将 postmaster@haopython.com 等别名转发到真实邮箱地址。

(3)别名域名映射

sudo vim /etc/postfix/sql/mysql_virtual_alias_domain_maps.cf
user = postfixadmin
password = postfixadmin_db_password
hosts = 127.0.0.1
dbname = postfixadmin
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'

作用:支持域名别名功能(例如 haopython.net 转发到 haopython.com 的邮箱)。

(4)别名域名捕获所有邮件

sudo vim /etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
user = postfixadmin
password = postfixadmin_db_password
hosts = 127.0.0.1
dbname = postfixadmin
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'

作用:处理“捕获所有”规则,将发往不存在的用户名的邮件转发到指定邮箱。

(5)邮箱查询

sudo vim /etc/postfix/sql/mysql_virtual_mailbox_maps.cf
user = postfixadmin
password = postfixadmin_db_password
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'

作用:查询给定邮箱(如 user@haopython.com)对应的 Maildir 存储路径。

(6)别名域名邮箱映射

sudo vim /etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
user = postfixadmin
password = postfixadmin_db_password
hosts = 127.0.0.1
dbname = postfixadmin
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'

作用:支持通过别名域名查询对应的真实邮箱存储路径。

2.3 设置文件权限

由于这些文件包含数据库密码,必须严格限制访问权限:

sudo find /etc/postfix/sql -type f -name '*.cf' -exec chgrp postfix {} +
sudo find /etc/postfix/sql -type f -name '*.cf' -exec chmod 640 {} +
  • chgrp postfix:将文件所属组改为 postfix;
  • chmod 640:只允许 root(所有者)读写,postfix 组(Postfix 进程运行组)只读。

2.4 配置 Postfix 主参数

使用 postconf -e 命令修改 /etc/postfix/main.cf 配置文件:

# 设置主机名和域名
sudo postconf -e "myhostname = mail.haopython.com"
sudo postconf -e "mydomain = haopython.com"
sudo postconf -e "myorigin = \$mydomain"

# 网络监听设置
sudo postconf -e "inet_interfaces = all"
sudo postconf -e "inet_protocols = ipv4"

# 本地投递目标(不包含虚拟域)
sudo postconf -e "mydestination = localhost"

# 虚拟域配置(指向我们的 SQL 映射文件)
sudo postconf -e "virtual_mailbox_domains = mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf"
sudo postconf -e "virtual_alias_maps = mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf, mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf, mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf"
sudo postconf -e "virtual_mailbox_maps = mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf, mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf"

# 设置投递传输方式(将邮件交给 Dovecot LMTP)
sudo postconf -e "virtual_transport = lmtp:unix:private/dovecot-lmtp"

2.5 配置 TLS 加密

使用 Let’s Encrypt 生成的 SSL 证书启用加密传输:

sudo postconf -e "smtpd_tls_cert_file = /etc/letsencrypt/live/mail.haopython.com/fullchain.pem"
sudo postconf -e "smtpd_tls_key_file = /etc/letsencrypt/live/mail.haopython.com/privkey.pem"
sudo postconf -e "smtpd_tls_security_level = may"
sudo postconf -e "smtp_tls_security_level = may"
  • smtpd_tls_security_level = may:Postfix 作为服务器时,允许客户端使用 TLS;
  • smtp_tls_security_level = may:Postfix 作为客户端时,优先尝试 TLS。

2.6 配置 SMTP 认证(SASL)

将 SMTP 认证工作交给 Dovecot 处理:

sudo postconf -e "smtpd_sasl_type = dovecot"
sudo postconf -e "smtpd_sasl_path = private/auth"
sudo postconf -e "smtpd_sasl_auth_enable = yes"
sudo postconf -e "smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination"
  • smtpd_sasl_type = dovecot:使用 Dovecot 作为 SASL 认证服务器;
  • smtpd_sasl_path = private/auth:指向 Dovecot 创建的 auth 套接字;
  • permit_sasl_authenticated:允许已认证的用户(邮件客户端)发送邮件。

2.7 启用 submission 端口(587)

编辑 master.cf 文件,启用 submission 服务:

sudo vim /etc/postfix/master.cf

找到以下行,取消注释(删除行首的 #):

submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject

说明:submission 端口(587)是邮件客户端发送邮件的标准端口,要求强制 TLS 加密和用户认证。

2.8 检查配置并重启

# 语法检查
sudo postfix check

# 如果提示 /var/spool/postfix/etc/resolv.conf 所有权问题,执行:
sudo chown root:root /var/spool/postfix/etc/resolv.conf
sudo chmod 644 /var/spool/postfix/etc/resolv.conf
sudo postfix check

# 重启 Postfix
sudo systemctl restart postfix

三、配置 Dovecot

3.1 清理旧配置文件

sudo rm -f /etc/dovecot/dovecot-sql.conf.ext

3.2 备份当前配置

sudo cp -a /etc/dovecot /etc/dovecot.backup.$(date +%F)

3.3 配置认证方式(10-auth.conf)

sudo nano /etc/dovecot/conf.d/10-auth.conf

修改为以下内容:

auth_allow_cleartext = no
auth_mechanisms = plain login

!include auth-sql.conf.ext

重要说明:

  • Dovecot 2.4 已用 auth_allow_cleartext = no 替代了旧版的 disable_plaintext_auth = yes;
  • 必须删除!include auth-system.conf.ext 这一行,否则会同时加载系统 PAM 认证。

3.4 配置 SQL 认证(auth-sql.conf.ext)

这是 Dovecot 2.4 最重要的配置变更。旧版 2.3 的写法已废弃,必须使用新格式。

sudo vim /etc/dovecot/conf.d/auth-sql.conf.ext

将文件内容完全替换为:

sql_driver = mysql

mysql 127.0.0.1 {
  user = postfixadmin
  password = postfixadmin_db_password
  dbname = postfixadmin
}

passdb sql {
  default_password_scheme = ARGON2I
  query = SELECT username AS "user", password FROM mailbox WHERE username = '%{user}' AND active='1'
}

userdb sql {
  query = SELECT CONCAT('/var/mail/vmail/', maildir) AS home, 5000 AS uid, 5000 AS gid FROM mailbox WHERE username = '%{user}' AND active='1'
  iterate_query = SELECT username AS "user" FROM mailbox WHERE active='1'
}

配置要点:

配置项 说明
sql_driver = mysql 指定使用 MySQL 驱动
mysql { … } 数据库连接参数(顶层块,非 connect =)
default_password_scheme = ARGON2I 密码加密方式(PostfixAdmin 默认使用 ARGON2I)
%{user} 2.4 新变量格式,替代旧版的 %u
query 中的 “user” 必须加双引号,且保持单行

3.5 设置 SQL 认证文件权限

sudo chown root:dovecot /etc/dovecot/conf.d/auth-sql.conf.ext
sudo chmod 640 /etc/dovecot/conf.d/auth-sql.conf.ext

3.6 配置邮箱存储(10-mail.conf)

sudo vim /etc/dovecot/conf.d/10-mail.conf

设置为:

mail_driver = maildir
mail_home = /var/mail/vmail/%{user | domain}/%{user | username}
mail_path = /var/mail/vmail/%{user | domain}/%{user | username}
mail_uid = vmail
mail_gid = vmail
first_valid_uid = 5000
last_valid_uid = 5000
  • mail_driver = maildir:使用 Maildir 格式(每封邮件为一个文件);
  • %{user | domain}:提取邮箱中的域名部分(如 haopython.com);
  • %{user | username}:提取邮箱中的用户名部分(如 user);
  • uid/gid = 5000:vmail 用户的 ID。

3.7 配置服务监听器(10-master.conf)

sudo vim /etc/dovecot/conf.d/10-master.conf

找到 service lmtp 和 service auth 部分,修改为:

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

service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}
  • LMTP 监听器:Postfix 通过这个套接字将邮件投递给 Dovecot;
  • Auth 监听器:Postfix 通过这个套接字向 Dovecot 发起认证请求。

3.8 配置 SSL/TLS(10-ssl.conf)

sudo vim /etc/dovecot/conf.d/10-ssl.conf

设置为:

ssl = required
ssl_server_cert_file = /etc/letsencrypt/live/mail.haopython.com/fullchain.pem
ssl_server_key_file = /etc/letsencrypt/live/mail.haopython.com/privkey.pem

注意:Dovecot 2.4 不再支持 < 文件读取前缀,必须使用 ssl_server_cert_file 和 ssl_server_key_file。

3.9 配置 postmaster 地址(15-lda.conf)

sudo vim /etc/dovecot/conf.d/15-lda.conf

设置:

postmaster_address = postmaster@haopython.com

3.10 配置 LMTP 协议(20-lmtp.conf)

sudo vim /etc/dovecot/conf.d/20-lmtp.conf

设置为:

protocol lmtp {
  postmaster_address = postmaster@haopython.com
  mail_plugins = sieve
  auth_username_format = %{user | lower}
}

两个关键点:

  • mail_plugins = sieve:直接写,不要用 $mail_plugins sieve(2.4 不支持变量展开);
  • auth_username_format = %{user | lower}:强制覆盖默认值,保留完整的 user@domain 格式,避免查询失败。

3.11 配置 Sieve 过滤(90-sieve.conf)

sudo vim /etc/dovecot/conf.d/90-sieve.conf

设置为:

sieve_script personal {
  driver = file
  path = ~/sieve
  active_path = ~/.dovecot.sieve
}

3.12 检查配置并重启

# 语法检查
sudo doveconf -n

# 重启服务
sudo systemctl restart dovecot postfix

四、测试邮件系统

4.1 测试 Postfix SQL 映射

# 测试域名查询
sudo postmap -q haopython.com mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf

# 测试邮箱查询
sudo postmap -q user@haopython.com mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf

# 测试别名查询
sudo postmap -q postmaster@haopython.com mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf

预期结果:每个命令都应输出非空内容(域名、Maildir 路径或别名目标地址)。如果输出为空,请检查 PostfixAdmin 数据库中是否有对应的测试数据。

4.2 测试 Dovecot 用户认证

sudo doveadm auth test user@haopython.com

输入密码后,预期输出:

passdb: user@haopython.com auth succeeded

4.3 测试本地邮件投递

# 安装测试工具 swaks
sudo apt install -y swaks

# 发送测试邮件
swaks --to user@haopython.com --from admin@haopython.com --server 127.0.0.1

# 查看邮件是否落盘
sudo find /var/mail/vmail -type f -path '*/new/*' | head -5

4.4 测试 submission 端口(587)

swaks --to user@haopython.com --from user@haopython.com \
  --server mail.haopython.com --port 587 \
  --auth LOGIN \
  --auth-user user@haopython.com \
  --auth-password 'MAILBOX_PASSWORD' \
  --tls

预期:邮件发送成功,无 TLS 或认证错误。

4.5 测试 IMAP over TLS(993 端口)

openssl s_client -connect mail.haopython.com:993 -servername mail.haopython.com

连接成功后,在 openssl 提示符下输入(注意不要输入密码明文,按回车直接进入登录步骤):

a login user@haopython.com MAILBOX_PASSWORD
b list "" "*"
c logout

预期:b list 应返回邮箱列表(如 INBOX)。

至此,我们已在 Ubuntu 26.04 上成功搭建了一个完整的邮件服务器系统,包含:

  • Postfix 作为邮件传输代理(MTA),负责接收和转发邮件;
  • Dovecot 作为邮件投递代理和 IMAP/POP3 服务器,负责存储邮件并让用户远程访问;
  • MySQL 作为后端数据库,存储虚拟域名、虚拟用户和别名信息;
  • TLS 加密保护所有通信安全;
  • LMTP 协议作为 Postfix 和 Dovecot 之间的高效投递通道。

结语

本文完整实现了基于 Postfix、Dovecot 和 MySQL 的自建邮件服务器部署,完成了服务安装、参数配置、加密加固与全维度功能测试。通过 LMTP 协议打通两大核心组件联动,搭配 TLS 加密与数据库认证,保障了邮件系统的安全性与稳定性。整套方案适配虚拟域名与多用户场景,可直接用于个人及小型业务邮件服务搭建。

以上关于Ubuntu 26.04搭建自建邮件服务器 Postfix+Dovecot全套部署教程的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

24

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » Ubuntu 26.04搭建自建邮件服务器 Postfix+Dovecot全套部署教程

发表回复