Как изменить ошибку возврата MTA, если что-то случилось, когда электронная почта доставки потерпела неудачу, используя метод сценария pipe to php - PullRequest
0 голосов
/ 26 ноября 2011

Я использую 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 голубятня 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 ]

2 голосов
/ 05 декабря 2011

Если вы не настаиваете на добавлении проблемного кода в определение канала, вы можете использовать оболочку сценария оболочки вокруг вашего php сценария, например,

#!/bin/bash
/home/someuser/public_htmk/pipe.php >&/home/someuser/pipe.errors.log || true

, и использовать ее в определении канала.

0 голосов
/ 10 декабря 2011

У меня была такая же проблема, и я решил ее, добавив файл с именем 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}}"
0 голосов
/ 29 ноября 2011

В некоторых случаях это может помочь вашей проблеме, но если включен display_errors, сообщение об ошибке в вашем скрипте может вызвать отрицательный ответ от вашего php-скрипта, что заставит сообщение отскочить.Если вы отключите его, ошибки не будут выводиться или возвращаться в MTA.

Если у вас есть фатальная ошибка, например, ошибка синтаксического анализа, по какой-то причине, это может не помочь.

Я не уверен, что у вас есть какой-либо способ контролировать содержимое возвращаемого сообщения, но вы могли бы предотвратить его или попытаться вернуть ему сообщение.

Это может помочь поставить exit(0); вконец обработчика электронной почты, указывающий на успешность, поэтому, если ваш сценарий может дойти до конца, он успешно завершится и может помешать MTA отправить ответное сообщение.

Я не уверен, имеет ли это значение, но это может помочь проверить, было ли открытие php: // stdin успешным, если он может по какой-то причине завершиться неудачей, а если вы не можете его прочитать, прекратите работу сценария.

Чтобы попытатьсяуправляйте выводом, если вы обнаружите ошибку, попробуйте повторить сообщение или использовать exit("status message");

В полученных вами ответных сообщениях содержится ли когда-либо сообщение об ошибке, выводимое из PHP, или причина сбоя?

...