问题现象
在使用军哥LNMP一键安装包部署的VPS环境中,网站探针(如phpinfo探针)测试邮件发送功能失败,但探针显示 mail() 函数状态正常,且 sendmail 服务也在运行。
故障排查步骤
请按以下顺序进行排查和修复。
1. 确认sendmail服务状态
首先,检查 sendmail 服务是否已安装并正常运行。
service sendmail status
正常运行的输出应类似于:
sendmail (pid 29294) is running...
sm-client (pid 29303) is running...
如果服务未运行或未安装:
- CentOS/RHEL系统:使用
yum install sendmail sendmail-cf -y安装。 - Debian/Ubuntu系统:使用
apt-get install sendmail -y安装。 - 安装后,使用
service sendmail start启动服务。
2. 核心修复:配置PHP的sendmail路径
这是最常见的原因。即使服务运行,PHP也需要明确知道 sendmail 可执行文件的路径。
-
编辑PHP配置文件。根据你的PHP安装路径,通常是:
vi /usr/local/php/etc/php.ini -
在文件中查找
sendmail_path配置项:/sendmail_path -
你会找到类似被注释的行:
;sendmail_path = -
去掉行首的分号(
;)注释,并将其修改为sendmail的绝对路径和参数:sendmail_path = /usr/sbin/sendmail -t -i
注意:-t表示从邮件内容提取收件人,-i表示忽略邮件中的点号(.)单独一行。 -
保存并退出编辑器(在vi中按
Esc键后输入:wq并回车)。
3. 重启PHP-FPM服务使配置生效
修改 php.ini 后,必须重启PHP处理器。
/etc/init.d/php-fpm restart
或根据你的LNMP版本使用:service php-fpm restart
或systemctl restart php-fpm
重启后,再次通过网站探针测试邮件发送功能,问题通常即可解决。
sendmail服务管理常用命令
- 启动服务:
/etc/init.d/sendmail start或service sendmail start - 停止服务:
/etc/init.d/sendmail stop或service sendmail stop - 重启服务:
/etc/init.d/sendmail restart或service sendmail restart - 查看状态:
service sendmail status
补充说明与高级排查
如果完成以上步骤后问题依旧,请考虑以下可能性:
- 防火墙/安全组:确保服务器的25端口(SMTP)出站规则是开放的。可以使用
telnet smtp.gmail.com 25测试外部连通性。 - 主机名设置:不完整的主机名可能导致sendmail拒绝发送。检查
/etc/hosts文件,确保127.0.0.1对应了正确的主机名(FQDN)。 - 邮件中继限制:许多VPS提供商默认屏蔽了25端口的出站连接以防止垃圾邮件,你需要联系服务商解封或使用其提供的SMTP中继服务。
- 替代方案:对于生产环境,更推荐使用外部SMTP服务(如SendGrid、Mailgun、阿里云邮件推送)或配置Postfix/Dovecot等更现代的邮件服务器组件,并通过PHP的PHPMailer或SwiftMailer库发送邮件,这样更稳定且不易被拦截。