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

SMTP 服务器搭建完全指南 / 第 2 章:Postfix 安装与基础配置

第 2 章:Postfix 安装与基础配置

从零开始安装 Postfix,并完成能收发第一封邮件的最小配置。


2.1 Postfix 简介

2.1.1 为什么选择 Postfix

Postfix 是目前最广泛使用的开源 MTA(Mail Transfer Agent),由 Wietse Venema 在 IBM 开发,目标是替代老旧的 Sendmail。

特性PostfixSendmailExim
安全性高(模块化设计)低(历史漏洞多)
配置难度中等困难中等
性能优秀一般良好
内存占用
社区活跃度下降
默认发行版Ubuntu, Debian, RHELFreeBSDDebian (可选)

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服务器 FQDNmail.example.com
mydomain邮件域名example.com
myorigin发件域名$mydomain
mydestination本地投递域名根据需求定义
mynetworks可信网络仅 localhost
inet_interfaces监听地址all
home_mailbox邮箱路径Maildir/
smtpd_bannerSMTP 横幅$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 配置详解 →