不能直接看到完整邮件配置;phpinfo()仅显示mail.default_charset、sendmail_path及Windows下SMTP/smtp_port,不包含认证、TLS、超时等关键运行时参数,且Linux/macOS下SMTP设置基本无效。
不能直接看到完整邮件配置。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 下基本无效)。
最可靠方式是读取当前生效的 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';"
注意点:
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 阶段的镜像)光看配置没用,必须实测。最小验证脚本:
常见失败原因:
sendmail_path 指向的二进制不存在或无执行权限(如指向 /usr/bin/sendmail 但实际装的是 msmtp)-t -i 参数,或配置了 require-auth 但没配凭证www-data)无法读取 msmtp 配置文件(需 ~/.msmtprc 或全局 /etc/msmtprc 权限正确)如果 mail() 失败,别只盯着 php.ini——直接查底层 MTA:
postconf -n | grep -E "(myhostname|relayhost|smtp_tls)"
exim -bP | grep -E "(primary_hostname|remote_smtp|tls)"
msmtp -P(输出当前解析的配置节)、ls -l ~/.msmtprc(检查权限是否为 600)sudo ss -tlnp | grep :25 确认 MTA 是否在监听很多线上环境用 Docker + ssmtp/msmtp,但 phpinfo() 完全不体现这些外部工具链的状态——这才是排查“邮件发不出去”的真正起点。