Как изменить ошибку возврата MTA, если что-то случилось, когда электронная почта доставки потерпела неудачу, используя метод сценария pipe to php
Я использовал WHM/Cpanel
Я использую методику pipe для пересылки писем о доходах в php скрипт и все в порядке. но во время работы, если любая ошибка произошла во время передачи, например, следующее сообщение будет возвращено отправителю электронной почты
This message was created automatically by mail delivery software.
A message that you sent could not be delivered to one or more of its recipients. This is a permanent error. The following address(es) failed:
pipe to |/home/someuser/public_htmk/pipe.php
generated by support@somecompany.net
local delivery failed
Обратите внимание, что я делаю канал от Cpanel для электронной почты support@somecompany.net|/home/someuser/public_htmk/pipe.php
приведенный ниже скрипт php не содержит ошибок:), но я определяю путь к файлу, чтобы сделать ошибку, потому что это должен быть public_html, а не public_htmk, но я делаю эту ошибку, чтобы показать вам сообщение об ошибке, которое возвращается отправителю электронной почты.
Так есть ли в любом случае контролировать это возвращенное сообщение или отключить его. например, изменить его или нет, чтобы отправить физический адрес php-файла, который мы запускаем, для направления электронной почты по крайней мере?
Кстати я использую
WHM/Cpanel Dovecot PHP
и это пример конвейерного скрипта (в этом скрипте нет ошибок)
#!/usr/local/bin/php -q
<?php
// read from stdin
$emg_stdf = fopen("php://stdin", "r");
$email = "";
while (!feof($emg_stdf))
{
$emg_orgemailmsg .= fread($emg_stdf, 1024);
}
fclose($emg_stdf);
mail('me@example.org','From my email pipe!','"' . $emg_orgemailmsg . '"');
Я ищу, чтобы настроить или отключить возврат сообщения, которое возвращается отправителю электронной почты, когда произошла ошибка при передаче письма в сценарий.
есть идеи?
3 ответа
Если вы не настаиваете на добавлении проблемного кода в определение канала, вы можете использовать оболочку сценария оболочки вокруг вашего php
сценарий, что-то вроде
#!/bin/bash
/home/someuser/public_htmk/pipe.php >&/home/someuser/pipe.errors.log || true
и используйте это в своем определении трубы.
У меня была та же проблема, и я решил ее, добавив файл с именем exim.conf в папку root/etc. Это сработало для меня. Ниже приведено содержимое этого файла. Надеюсь, это поможет и другим!
# This transport is used for handling pipe deliveries generated by alias
# or .forward files. If the pipe generates any standard output, it is returned
# to the sender of the message as a delivery error. Set return_fail_output
# instead of return_output if you want this to happen only when the pipe fails
# to complete normally. You can set different transports for aliases and
# forwards if you want to - see the references to address_pipe in the directors
# section below.
address_pipe:
driver = pipe
return_fail_output
virtual_address_pipe:
driver = pipe
group = nobody
return_fail_output
user = "${lookup{$domain}lsearch* {/etc/virtual/domainowners}{$value}}"
Это может помочь вашей проблеме в некоторых случаях, но если display_errors
Включено, сообщение об ошибке в вашем скрипте может вызвать отрицательный ответ от вашего php-скрипта, что заставит сообщение отскочить. Если вы отключите его, то никакие ошибки не будут выводиться или возвращаться в MTA.
Если по какой-либо причине у вас есть фатальная ошибка, например ошибка синтаксического анализа, это может не помочь.
Я не уверен, что у вас есть какой-либо способ контролировать содержимое возвращаемого сообщения, но вы могли бы предотвратить его или попытаться вернуть ему сообщение.
Это может помочь поставить exit(0);
в конце обработчика электронной почты, чтобы указать на успешность, поэтому, если ваш сценарий сможет достичь конца, он успешно завершится и может помешать MTA отправить ответное сообщение.
Я не уверен, имеет ли это значение, но это может помочь проверить, было ли открытие php://stdin успешным, если есть вероятность, что по какой-то причине это может произойти, и если вы не можете его прочитать, тогда прекратите работу сценария.,
Чтобы попытаться контролировать вывод, если вы обнаружите ошибку, попробуйте повторить сообщение или использовать exit("status message");
В ответных сообщениях, которые вы получаете, содержится ли когда-либо сообщение об ошибке, выводимое из PHP, или причина сбоя?