LNMP环境下配置邮件服务

在LNMP(Linux + Nginx + MySQL/MariaDB + PHP)这套经典组合里,邮件服务往往是被忽视的一环。其实,搞清邮件系统的基本逻辑后,配置它并没有想象中那么复杂。先说几个核心判断:Postfix和Dovecot的组合是当前最主流的方案,前者管发信,后者管收信,各司其职。
一、方案与组件选择
如果你只是在网站内跑跑发信功能,比如用户注册验证、密码找回这类场景,那么只部署Postfix就足够了。但要是希望用户能在客户端(比如Outlook、Thunderbird)里登录并管理邮件,那就得把Dovecot也请进来,提供IMAP或POP3服务。
还有一个常被忽略的点——可信度。你发出去的邮件如果直接被对方服务器扔进垃圾箱,那就白忙活了。所以,SPF、DKIM、DMARC这几个标准最好一并配齐,这属于“进阶必修课”,后面会专门讲到。
二、Debian/Ubuntu 快速部署步骤
依赖安装这一步没什么悬念,直接跑命令就好。以Debian为例:sudo apt update && sudo apt install postfix dovecot-core dovecot-imapd dovecot-lmtpd mailutils。Ubuntu用户把mailutils去掉即可。安装Postfix时,安装过程会弹出一个配置界面,记得选择“Internet Site”,然后填写你的系统邮件名,像mail.yourdomain.com这样的格式。
Postfix 核心配置(/etc/postfix/main.cf)
这份配置文件的几个关键参数值得仔细核对:
myhostname = mail.yourdomain.com—— 你的邮件服务器主机名mydomain = yourdomain.com—— 你的域名myorigin = $mydomain—— 发件人地址中的域名inet_interfaces = all—— 监听所有网络接口inet_protocols = ipv4(或all)—— 根据你的网络环境选mydestination = $myhostname, localhost.$mydomain, $mydomain—— 收到哪些域的邮件由本机处理mynetworks = 127.0.0.0/8 [::1]/128—— 信任的内网段home_mailbox = Maildir/—— 使用Maildir格式存储邮件smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination—— 中继权限控制smtpd_sasl_auth_enable = yes—— 启用SASL认证smtpd_sasl_security_options = noanonymous—— 禁止匿名登录smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination—— 收件人限制规则
这些配置项实际上是在定义你的邮件服务器“谁可以发、谁可以收、谁可以中转”。
Dovecot 配置要点
Dovecot的配置主要分布在几个文件里:
- /etc/dovecot/dovecot.conf:设置
mail_location = maildir:~/Maildir,并声明protocols = imap pop3 - /etc/dovecot/conf.d/10-auth.conf:将
disable_plaintext_auth设为no,认证机制保留plain login - /etc/dovecot/conf.d/10-ssl.conf:开启
ssl = yes,并指定证书路径——推荐用Let's Encrypt生成的免费证书 - 如果你打算用LMTP(本地邮件传输协议)做投递优化,可以在master.conf中配置LMTP监听端口
配置完成后,启动服务并设置开机自启:sudo systemctl start postfix && sudo systemctl enable postfix,Dovecot同理。
防火墙与端口放行
邮件服务涉及的端口比较多,别搞漏了:
- 25/tcp —— SMTP(MTA间通信)
- 587/tcp —— Submission(客户端提交邮件,带STARTTLS)
- 143/tcp —— IMAP(明文)
- 993/tcp —— IMAPS(加密)
- 110/tcp —— POP3(明文)
- 995/tcp —— POP3S(加密)
UFW用户直接sudo ufw allow 25/tcp, 143/tcp, 110/tcp, 587/tcp, 993/tcp, 995/tcp就能搞定。如果是firewalld,建议用服务名方式放行。
连通性测试
配完别急着用,先测一下:
- SMTP:
telnet localhost 25或openssl s_client -connect localhost:587 -starttls smtp - IMAP:
openssl s_client -connect localhost:993
能顺利连接并且看到服务端返回的欢迎信息,说明服务基本跑起来了。
域名与DNS记录
这一步很多人会忽略,但恰恰是邮件系统能否正常工作的关键:
- 添加一条A记录:
mail.yourdomain.com → 服务器IP - 添加一条MX记录:
yourdomain.com → 优先级10 mail.yourdomain.com - 用
dig MX yourdomain.com验证是否生效
还没完。为了不被当成垃圾邮件,后续还要补上SPF、DKIM、DMARC记录。
三、PHP 网站发信配置
LNMP环境的网站发信,说白了就是让PHP能调用系统邮件命令。检查一下php.ini里的sendmail_path是否指向/usr/sbin/sendmail -t -i。CLI和FPM的配置文件都要改,改完后别忘了重启PHP-FPM。
一个简单的测试脚本就能验证:
不过,生产环境更推荐用SMTP提交方式(端口587 + STARTTLS),配合专用的发信账号。PHP世界里,PHPMailer是一个很成熟的库,支持TLS、认证和日志追踪,比直接用mail()函数靠谱得多。
四、进阶与安全加固
基础功能跑通之后,就该琢磨怎么把它跑稳、跑安全。
端口策略
对外只开放25、587和加密端口(993/995)就够了。143和110这种明文端口要么彻底关闭,要么强制STARTTLS。没什么理由让用户用明文方式访问邮件服务。
身份认证与投递
Postfix的SASL认证通常和Dovecot配合实现,让客户端用真实的邮箱账号密码登录。Dovecot则负责提供IMAP/POP3服务以及LMTP投递通道,形成完整的收发链条。
反垃圾与合规
这三个记录必须补上:
- SPF:声明哪些IP有权代你发邮件
- DKIM:对邮件内容进行数字签名,防止伪造
- DMARC:告诉接收方如果SPF和DKIM校验失败后该怎么处理
如果觉得还不够,可以考虑加装SpamAssassin做内容过滤、ClamA V做病毒扫描、Fail2ban防止暴力破解——不过这就属于“锦上添花”了,基础配置完成后再说。
端口25的坑
需要提醒的是,不少云服务商默认封禁25端口出站。如果你的邮件发不出去,先检查一下是不是这层原因。实在不行,只靠587端口提交邮件也能应付大多数场景。
日常维护
关注几个地方:/var/log/mail.log是排错的宝藏;postqueue -p可以查邮件队列;TLS证书记得用certbot定期续期。邮件系统跑起来之后,定期审计一下用户账户和别名配置,也是个好习惯。