Sendmail管道到PHP:无法打开输入文件

T K*_*T K 7 php file-permissions sendmail pipe user-permissions

我已经安装了sendmail,并希望将传入电子邮件发送到php。

每当我向服务器发送电子邮件时,都会收到一封包含错误消息的电子邮件:

无法打开输入文件:/root/fw/catcher.php 554 5.3.0未知邮件错误1

我认为具有许可的catcher.php错误是错误的,但我自己无法解决。

已安装Sendmail,并添加了别名:

root: "|/usr/bin/php /root/fw/catcher.php"
Run Code Online (Sandbox Code Playgroud)

权限(之后chmod 777;我尝试过chmod 777chmod 755但都无法使用):

drwxrwxrwx 2 root root 4096 Jul 20 14:27 fw
-rwxrwxrwx 1 root root   45 Jul 20 14:27 catcher.php
Run Code Online (Sandbox Code Playgroud)

catcher.php(将行尾转换为Unix样式):

#!/usr/bin/php
<?php echo 'Test'; exit(0); ?>
Run Code Online (Sandbox Code Playgroud)

通过cli执行我的php文件效果很好。所有这些命令均有效:

/usr/bin/php /root/fw/catcher.php
/usr/bin/php7.3 /root/fw/catcher.php
php /root/fw/catcher.php
php7.3 /root/fw/catcher.php
Run Code Online (Sandbox Code Playgroud)

我认为sendmail的权限存在问题。

Jan*_*tis 1

错误“无法打开输入文件”意味着由于某种原因无法读取该文件。

请按照以下步骤进行检查:

  1. 将行结尾转换为 Unix 风格

我不知道你如何检查这一点,但你可以尝试使用dos2unix 重做此操作,如此链接中所述

dos2unix catcher.php > newcatcher.php
Run Code Online (Sandbox Code Playgroud)

然后比较文件大小。

  1. 可能是BOM 破坏了脚本,如此处所述 shebang 行“#!/usr/bin/php”告诉系统在调用此类脚本时需要运行哪个解释器。

如果脚本以 UTF-8 编码,人们可能会想在开头包含 BOM。但实际上是“#!” 角色不仅仅是角色。它们实际上是一个神奇的数字,恰好由两个 ASCII 字符组成。如果您在这些字符之前放置某些内容(例如 BOM),那么该文件将看起来像是具有不同的幻数,这可能会导致问题。

该脚本将在 cli 上运行,因为您明确告诉它要使用哪个解释器:phpphp7.3

php /root/fw/catcher.php
php7.3 /root/fw/catcher.php
Run Code Online (Sandbox Code Playgroud)

要从文件开头删除BOM ,请尝试以下操作:

dos2unix catcher.php
Run Code Online (Sandbox Code Playgroud)

尝试将/root/fw/catcher.php作为 shell 脚本运行,而不使用 php 或 php7.3 可执行文件。从终端运行:

./root/fw/catcher.php
Run Code Online (Sandbox Code Playgroud)