不能直接看到完整邮件配置;phpinfo()仅显示mail.default_charset、sendmail_path及Windows下SMTP/smtp_port,不包含认证、TLS、超时等关键运行时参数,且Linux/macOS下SMTP设置基本无效。

phpinfo() 里能直接看到 mail() 配置吗
不能直接看到完整邮件配置。phpinfo() 会显示 mail.default_charset、sendmail_path 和 SMTP/smtp_port(仅限 Windows + php.ini 中启用 SMTP 模式时),但不会显示认证凭据、TLS 设置、超时等运行时关键参数。
尤其注意:sendmail_path 显示的是系统命令路径(如 /usr/sbin/sendmail -t -i),不代表 PHP 实际调用的 MTA 是否就绪;而 SMTP 值即使存在,也不代表 mail() 调用成功——它只在 PHP_SAPI === 'cli' && !defined('PHP_WINDOWS_VERSION_BUILD') 以外的场景下被忽略(Linux/macOS 下基本无效)。
查 sendmail_path 和 SMTP 的真实生效值
最可靠方式是读取当前生效的 php.ini 文件并 grep:
php --ini | grep "Loaded Configuration File"
php -r "echo ini_get('sendmail_path');"
php -r "echo ini_get('SMTP') ?: 'not set';"
php -r "echo ini_get('smtp_port') ?: 'not set';"
注意点:
立即学习“PHP免费学习笔记(深入)”;
-
sendmail_path在 CLI 和 FPM 下可能不同(FPM 通常继承 pool 配置里的php_admin_value[sendmail_path]) -
SMTP和smtp_port仅对 Windows 内置 SMTP 扩展起作用,Linux 下设了也白设 - 若用
docker exec -it php php -i | grep -i mail,确保进的是实际处理请求的那个容器(不是 build 阶段的镜像)
验证 mail() 是否真能发信(不依赖 phpinfo)
光看配置没用,必须实测。最小验证脚本:
常见失败原因:
-
sendmail_path指向的二进制不存在或无执行权限(如指向/usr/bin/sendmail但实际装的是msmtp) - SELinux 或 AppArmor 拦截了 PHP 进程调用外部程序
- 目标 MTA(Postfix/Exim/msmtp)未监听
-t -i参数,或配置了 require-auth 但没配凭证 - PHP 进程用户(如
www-data)无法读取 msmtp 配置文件(需~/.msmtprc或全局/etc/msmtprc权限正确)
替代方案:绕过 phpinfo 查 Postfix/Exim/msmtp 真实状态
如果 mail() 失败,别只盯着 php.ini——直接查底层 MTA:
- Postfix:
postconf -n | grep -E "(myhostname|relayhost|smtp_tls)" - Exim:
exim -bP | grep -E "(primary_hostname|remote_smtp|tls)" - msmtp:
msmtp -P(输出当前解析的配置节)、ls -l ~/.msmtprc(检查权限是否为 600) - 所有系统:
sudo ss -tlnp | grep :25确认 MTA 是否在监听
很多线上环境用 Docker + ssmtp/msmtp,但 phpinfo() 完全不体现这些外部工具链的状态——这才是排查“邮件发不出去”的真正起点。











