PHP, как читать EMAIL из ввода php: //? - PullRequest
0 голосов
/ 27 сентября 2019

Использование pipe.php, который преобразует электронные письма в тикеты Питера Ротича (osTicket).Как говорится: / * Прочтите сообщение от STDIN * /.Электронная почта пересылается этому сценарию пересылкой электронной почты в VirtualMin, так что здесь все стандартно, ребята.

Я хочу перехватить этот STDIN и прочитать письмо, прежде чем оно продолжит нормальный процесс.

Я пробовал:

$fd = fopen("php://stdin", "r");
$email = ""; // This will be the variable holding the data.
while (!feof($fd)) {
$email .= fread($fd, 10024);
}
fclose($fd);

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

require_once(INCLUDE_DIR.'api.tickets.php');
PipeApiController::process();

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

Так что я предполагаю, что мне нужно прочитать письмо и отправить его обратно, как я его обнаружил.Это полный сценарий:

/* Read STDIN into variable */
// $fd = fopen("php://stdin", "r"); //This creates problems 
$fd = fopen("php://input", "r"); //THIS IS OK
$email = ""; // This will be the variable holding the data.
while (!feof($fd)) {
$email .= fread($fd, 10024);
}
fclose($fd);

/* Saves the data into a file */
$fdw = fopen("/home/myhome/public_html/support/api/pipemail.txt", "w+");
fwrite($fdw, $email);
fclose($fdw);

/* Pass on the email for processing */
// $fdw = fopen("php://stdin", "w"); //This creates problems
$fdw = fopen("php://input", "w"); //THIS IS OK
fwrite($fdw, $email);
require_once(INCLUDE_DIR.'api.tickets.php');
PipeApiController::process();
fclose($fdw);

При чтении и записи в php: // stdin я получал ошибки синтаксического анализа электронной почты из PipeApiController, поэтому я изменил его на php: // input, и он работает нормально!Но теперь мой pipemail.txt - ПУСТОЙ!

Итак, мой вопрос сейчас таков:

  1. Я могу РЕЛЕ ОКРОСИТЬ содержимое php: // вводить в PipeApiController,
  2. Проблема теперь в том, что я не могу прочитать, что находится внутри входа php: //, так как я изменил его с php: // stdin, чтобы передать его.

[обновление:] Я думаю, что в этом случае необходим анализатор электронной почты для типа MIME.Возможно, для достижения этого нужен другой подход.Я обновлю, как только найду решение.

Есть идеи?

PS.Этот вопрос немного изменился с тех пор, как он был впервые опубликован, поэтому я меняю имя, чтобы оно соответствовало, и теперь, возможно, есть простой ответ на него.Извинения.

1 Ответ

0 голосов
/ 27 сентября 2019

В PHP не используйте fclose (), если вам нужно использовать временный файл позже, потому что эта функция удаляет временные файлы.Другими словами, пропустите строку:

fclose ($ fd);

...