Как изменить ошибку возврата 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, или причина сбоя?

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