强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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 MboxMaildir/ 格式每个邮件存储为单独文件,适合大邮箱和并发访问;Mbox 格式所有邮件存储在一个文件中,适合小邮箱。推荐使用 Maildir。


2.10 扩展阅读


上一章← 第 1 章:SMTP 协议与邮件系统架构 下一章第 3 章:main.cf 配置详解 →