phpinfo输出含邮件配置吗_查mail相关参数途径【查邮】

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

phpinfo() 里能直接看到 mail() 配置吗

不能直接看到完整邮件配置。phpinfo() 会显示 mail.default_charsetsendmail_pathSMTP/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';"

注意点:

  • sendmail_path 在 CLI 和 FPM 下可能不同(FPM 通常继承 pool 配置里的 php_admin_value[sendmail_path]
  • SMTPsmtp_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() 完全不体现这些外部工具链的状态——这才是

排查“邮件发不出去”的真正起点。