SMTP 服务器搭建完全指南 / 第 2 章:Postfix 安装与基础配置
第 2 章:Postfix 安装与基础配置
从零开始安装 Postfix,并完成能收发第一封邮件的最小配置。
2.1 Postfix 简介
2.1.1 为什么选择 Postfix
Postfix 是目前最广泛使用的开源 MTA(Mail Transfer Agent),由 Wietse Venema 在 IBM 开发,目标是替代老旧的 Sendmail。
| 特性 | Postfix | Sendmail | Exim |
|---|---|---|---|
| 安全性 | 高(模块化设计) | 低(历史漏洞多) | 中 |
| 配置难度 | 中等 | 困难 | 中等 |
| 性能 | 优秀 | 一般 | 良好 |
| 内存占用 | 低 | 高 | 中 |
| 社区活跃度 | 高 | 下降 | 高 |
| 默认发行版 | Ubuntu, Debian, RHEL | FreeBSD | Debian (可选) |
2.1.2 Postfix 架构
┌─────────────────────────────────────────────┐
│ Postfix │
│ │
│ ┌──────────┐ ┌──────────┐ ┌─────────┐ │
│ │ master │──►│ smtpd │──►│ cleanup │ │
│ │ (守护进程)│ │(接收邮件) │ │(规范化) │ │
│ └──────────┘ └──────────┘ └────┬────┘ │
│ │ │
│ ┌──────────┐ ┌──────────┐ ┌────▼────┐ │
│ │ smtp │◄──│ qmgr │◄──│ incoming│ │
│ │(发送邮件) │ │(队列管理) │ │(入队列) │ │
│ └──────────┘ └──────────┘ └─────────┘ │
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ local │ │ bounce │ │
│ │(本地投递) │ │(退信处理) │ │
│ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────┘
2.2 安装 Postfix
2.2.1 Ubuntu / Debian 安装
# 更新软件包索引
sudo apt update
# 安装 Postfix 和相关工具
sudo apt install -y postfix mailutils libsasl2-modules
# 安装过程中会弹出配置向导:
# 1. General type of mail configuration: 选择 "Internet Site"
# 2. System mail name: 输入你的域名(如 example.com)
2.2.2 RHEL / Rocky Linux 安装
# 安装 Postfix
sudo dnf install -y postfix mailx
# 启动并启用服务
sudo systemctl enable --now postfix
# 检查服务状态
sudo systemctl status postfix
2.2.3 验证安装
# 检查 Postfix 版本
postconf mail_version
# 检查服务状态
sudo systemctl status postfix
# 检查监听端口
sudo ss -tlnp | grep -E ':(25|587)'
# 查看当前配置
postconf | head -20
2.3 基础配置
2.3.1 设置主机名和域名
# 设置 FQDN 主机名
sudo hostnamectl set-hostname mail.example.com
# 编辑 /etc/hosts
sudo tee /etc/hosts << 'EOF'
127.0.0.1 localhost
::1 localhost
127.0.1.1 mail.example.com mail
# 公网 IP(替换为实际 IP)
203.0.113.10 mail.example.com mail
EOF
2.3.2 核心配置文件
Postfix 的主配置文件位于 /etc/postfix/main.cf。备份并开始配置:
# 备份原始配置
sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
# 查看当前配置(去除注释和空行)
postconf -n
2.3.3 最小可用配置
以下是能正常收发邮件的最小 main.cf 配置:
# /etc/postfix/main.cf — 最小可用配置
# ==================== 基础设置 ====================
# 主机名
myhostname = mail.example.com
# 域名
mydomain = example.com
# 发件人域名(发件地址 @ 后面的部分)
myorigin = $mydomain
# 目标域名(本服务器负责投递的域名)
mydestination = $myhostname, $mydomain, localhost.$mydomain, localhost
# 本地网络(允许通过本服务器发送邮件的客户端)
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
# 监听的网络接口(all 表示所有接口)
inet_interfaces = all
# 协议(仅 IPv4,如需 IPv6 加上 ipv6)
inet_protocols = ipv4
# 本地投递代理
mailbox_command =
# 邮件存储格式
home_mailbox = Maildir/
# ==================== 杂项 ====================
# 横幅信息
smtpd_banner = $myhostname ESMTP
# 禁用 VRFY 命令(安全考虑)
disable_vrfy_command = yes
# 通知别名
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
2.3.4 配置详解表格
| 参数 | 作用 | 推荐值 |
|---|---|---|
myhostname | 服务器 FQDN | mail.example.com |
mydomain | 邮件域名 | example.com |
myorigin | 发件域名 | $mydomain |
mydestination | 本地投递域名 | 根据需求定义 |
mynetworks | 可信网络 | 仅 localhost |
inet_interfaces | 监听地址 | all |
home_mailbox | 邮箱路径 | Maildir/ |
smtpd_banner | SMTP 横幅 | $myhostname ESMTP |
2.4 DNS 记录配置
2.4.1 必需的 DNS 记录
在域名管理面板中添加以下记录:
; === A 记录 ===
mail.example.com. IN A 203.0.113.10
; === MX 记录 ===
example.com. IN MX 10 mail.example.com.
; === SPF 记录(后续章节详述)===
example.com. IN TXT "v=spf1 mx a -all"
; === 反向 DNS ===
; 在云服务商控制面板设置 PTR: 203.0.113.10 -> mail.example.com
2.4.2 验证 DNS 配置
# 验证 A 记录
dig A mail.example.com +short
# 期望输出: 203.0.113.10
# 验证 MX 记录
dig MX example.com +short
# 期望输出: 10 mail.example.com.
# 验证 SPF 记录
dig TXT example.com +short
# 期望输出: "v=spf1 mx a -all"
# 验证反向 DNS
dig -x 203.0.113.10 +short
# 期望输出: mail.example.com.
2.5 启动与测试
2.5.1 应用配置
# 检查配置文件语法
sudo postfix check
# 重新加载配置
sudo systemctl reload postfix
# 查看服务状态
sudo systemctl status postfix
2.5.2 命令行发送测试邮件
# 方法 1: 使用 mail 命令
echo "这是一封测试邮件" | mail -s "测试主题" [email protected]
# 方法 2: 使用 sendmail
sendmail [email protected] << 'EOF'
From: [email protected]
To: [email protected]
Subject: Test Email
这是一封通过 Postfix 发送的测试邮件。
.
EOF
# 方法 3: 使用 telnet 手动交互
telnet localhost 25
# 输入以下命令:
# EHLO localhost
# MAIL FROM:<[email protected]>
# RCPT TO:<[email protected]>
# DATA
# Subject: Test
#
# Hello, this is a test.
# .
# QUIT
2.5.3 检查邮件日志
# 实时查看邮件日志
sudo tail -f /var/log/mail.log
# 查看今天的邮件日志
grep "$(date +%b' '%d)" /var/log/mail.log
# 查看特定队列 ID 的日志
grep "queue_id" /var/log/mail.log
2.5.4 验证邮件投递
# 检查 Maildir 目录
ls -la /home/user/Maildir/new/
# 读取收到的邮件
cat /home/user/Maildir/new/*
# 检查邮件队列
mailq
2.6 系统别名配置
2.6.1 配置 /etc/aliases
# /etc/aliases
# 系统别名配置
# 基础别名
mailer-daemon: postmaster
postmaster: root
nobody: root
hostmaster: root
usenet: root
news: root
webmaster: root
www: root
ftp: root
abuse: root
noc: root
security: root
# root 邮件转发到真实用户
root: [email protected]
# 管理员别名
admin: [email protected]
# 部门别名
support: [email protected], [email protected]
sales: [email protected]
2.6.2 生成别名数据库
# 生成别名数据库
sudo newaliases
# 验证别名
postmap -q root hash:/etc/aliases
2.7 业务场景:开发环境邮件服务器
场景描述
开发团队需要一台内部邮件服务器,用于:
- 接收应用系统的通知邮件
- 测试邮件功能
- 限制只允许内部网络使用
配置方案
# /etc/postfix/main.cf — 开发环境专用配置
# 基础设置
myhostname = dev-mail.internal.example.com
mydomain = internal.example.com
myorigin = $mydomain
mydestination = $myhostname, $mydomain, localhost.$mydomain, localhost
# 仅允许内部网络访问
mynetworks = 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
# 不向外部发送邮件(仅接收本地)
# 如需发送到外部,注释掉下行
# relay_domains =
# 邮箱设置
home_mailbox = Maildir/
mailbox_size_limit = 51200000
# 日志级别
maillog_file = /var/log/mail.log
2.8 常见问题排查
问题 1:无法连接到端口 25
# 检查 Postfix 是否运行
sudo systemctl status postfix
# 检查端口监听
sudo ss -tlnp | grep :25
# 检查防火墙
sudo ufw status
sudo ufw allow 25/tcp
问题 2:邮件发送失败
# 查看错误日志
sudo tail -50 /var/log/mail.log | grep -i error
# 检查队列状态
mailq
# 清空队列(测试环境)
sudo postsuper -d ALL
问题 3:邮件进入垃圾箱
# 检查 SPF/DKIM 配置(后续章节详述)
# 检查 PTR 记录
dig -x $(dig +short A mail.example.com) +short
# 检查是否在黑名单
# https://mxtoolbox.com/blacklists.aspx
2.9 注意事项
⚠️ 安全提醒:默认配置下,Postfix 仅允许本地网络发送邮件。在配置
mynetworks时,务必只包含可信网络,否则可能成为开放中继(Open Relay),被垃圾邮件发送者利用。
⚠️ 生产环境:本章配置仅为最小可用配置,缺少 TLS 加密和身份认证。在暴露到公网前,务必完成后续章节的安全配置。
💡 Maildir vs Mbox:
Maildir/格式每个邮件存储为单独文件,适合大邮箱和并发访问;Mbox格式所有邮件存储在一个文件中,适合小邮箱。推荐使用 Maildir。
2.10 扩展阅读
- Postfix 官方文档
- Postfix BASIC_CONFIGURATION_README
- Postfix STANDARD_CONFIGURATION_README
- Ubuntu Postfix 文档