尽管我可以在 chroot 中使用 sendmail,但 PHP 无法在 chroot 中使用 mail()

尽管我可以在 chroot 中使用 sendmail,但 PHP 无法在 chroot 中使用 mail()

我正在构建一个 php-fpm chroot,在称之为成功之前,这是我的最后一步。

php-fpm chroot 运行良好。此外,我还mini_sendmail安装到 chroot (代替库存的 sendmail) 并确认它可以发送电子邮件:

[root@hostname site1.com]# ls bin/
bash  cat  sendmail  test.txt
[root@hostname site1.com]# chroot .
bash-4.2# cat /bin/test.txt | ./bin/sendmail -t -i [email protected] [email protected]

运行上述命令时我会收到电子邮件。

但是,当我从 Web 浏览器访问以下 php 脚本时,没有发送电子邮件:

<?php
    $message = "This is a test";
    $headers = 'From: [email protected]';
    mail("[email protected]", "Test", $message, $headers);
    echo "mail sent";
?>

以下是我的 php-fpm chroot 池配置文件:

[site1.com]
user = user1
group = user1
listen = 127.0.0.1:9001
listen.owner = user1
listen.group = user1
php_admin_value[disable_functions] = exec,passthru,shell_exec,system
php_admin_flag[allow_url_fopen] = on
php_flag[display_errors] = on
php_admin_value[short_open_tag] = On
php_admin_value[doc_root] = www
php_admin_value[error_log] = /logs/php-errors
php_admin_flag[log_errors] = on
php_admin_value[sendmail_path] = /bin/sendmail
php_admin_value[mail.log] = /logs/maillog
php_admin_value[error_reporting] = E_ALL
pm = ondemand
pm.max_children = 5
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chroot = /home/www/site1.com
chdir = /www
catch_workers_output = yes

当我从 Web 浏览器访问 php 文件时,我可以确认 maillog 中有一个日志条目,定义如下php_admin_value[mail.log]

mail() on [/www/mailer.php:4]: To: [email protected] -- Headers: From: [email protected]

但是,服务器的邮件日志(chroot 之外)上没有显示任何内容,php 错误日志中也没有显示任何内容。

我该如何完成故障排除这最后一步,使 php 的mail()功能在我的 php-fpm chroot 中按预期工作?或者,我该如何解决实际问题?

答案1

我知道这是一个相当老的问题,但我在尝试解决同一问题时发现了这个问题,所以如果将来有人遇到这个问题,还有另一件事需要检查。在我的例子中,我在 chroot 环境中缺少 /bin/sh。

php 将 sendmail_path 传递到 popen。popen 将命令传递给 /bin/sh,因此如果您的 chroot 环境缺少 /bin/sh,您似乎会遇到失败,并且没有任何记录

相关内容