Sendmail Pipe to PHP: не удалось открыть входной файл

Я установил sendmail и хочу направлять входящие электронные письма на php.

Каждый раз, когда я отправляю электронное письмо на свой сервер, я получаю электронное письмо с сообщением об ошибке:

could not open input file: /root/fw/catcher.php 554 5.3.0 unknown mailer error 1

Я думаю, что что-то с разрешениями catcher.php не так, но я не мог понять это сам.

Sendmail установлен, и я добавил псевдоним:

root: "|/usr/bin/php /root/fw/catcher.php"

Разрешения (после chmod 777; пробовал chmod 777 и chmod 755, но оба не работают):

drwxrwxrwx 2 root root 4096 Jul 20 14:27 fw
-rwxrwxrwx 1 root root   45 Jul 20 14:27 catcher.php

catcher.php (окончания строк преобразованы в стиль Unix):

#!/usr/bin/php
<?php echo 'Test'; exit(0); ?>

Выполнение моего файла php через cli работает нормально. Все эти команды работают:

/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

Я думаю, что проблема с разрешениями sendmail.

Сначала я бы посоветовал вам использовать сценарий оболочки и передать в нем имя файла php. См. этот serverfault.com/questions/261191/… и musicgeometry.com/p/1473

Tarun Lalwani 22.07.2019 19:29

какие-либо обновления по этому поводу?

Tarun Lalwani 25.07.2019 16:44

Что сообщается в файле журнала?

AnFi 27.07.2019 01:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
7
3
816
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ошибка "не удалось открыть входной файл" означает, что файл по какой-то причине не может быть прочитан.

Пожалуйста, выполните следующие действия, чтобы проверить:

  1. converted line endings to Unix style

Я не знаю, как вы это проверяете, но вы можете попробовать переделать это, используя dos2unix, как описано в этой ссылке

dos2unix catcher.php > newcatcher.php

а затем сравните размеры файлов.

  1. может быть, что Спецификация нарушает сценарий, как описано здесь, строка шебанга "#!/usr/bin/php" сообщает системе, какой интерпретатор необходимо запустить при вызове такого скрипта.

If the script is encoded in UTF-8, one may be tempted to include a BOM at the beginning. But actually the "#!" characters are not just characters. They are in fact a magic number that happens to be composed out of two ASCII characters. If you put something (like a BOM) before those characters, then the file will look like it had a different magic number and that can lead to problems.

Сценарий будет запускать над кли, потому что вы специально указываете ему, какой интерпретатор использовать: php или php7.3:

php /root/fw/catcher.php
php7.3 /root/fw/catcher.php

Чтобы удалить Спецификация из начала файла, попробуйте это:

dos2unix catcher.php

Попробуйте запустить /root/fw/catcher.php как сценарий оболочки без использования исполняемого файла php или php7.3. Из терминала запустите:

./root/fw/catcher.php

Вы проверили, включен ли SELinux и применяется ли? Вы можете увидеть это с помощью команды getenforce.

Если это возвращает Enforcing, вы можете исправить это несколькими способами. Вы можете либо отключить принудительное использование SELinux с помощью setenforce Permissive, либо создать политику, позволяющую Apache запускать sendmail.

Чтобы создать подобную политику, проще всего использовать инструмент audit2allow, который является частью policycoreutils-python, поэтому установите его, если audit2allow недоступен. Затем проверьте /var/log/audit.log, чтобы увидеть, есть ли ошибки, связанные с невозможностью запуска sendmail. Эти строки ошибок можно передать в audit2allow для создания файла политики, который можно включить с помощью semodule -i <module.pp>.

Другие вопросы по теме