Загрузка...
 
Страница 1
Автор
Сообщение
Alex 
Admin ]Alex

Регистрация: 08.08.2005
Сообщений: 1689
Откуда: Moscow, Tver - Ru, Cz


функция mail в php - следим за исходящими

 
создано 29.01.2010 16:55:16

Перед некоторыми людьми, прошедшими определённый путь развития в системном администрировании, нередко встает вопрос, как увидеть активность рассылки почты с сайтов, которые живут у них на сервере.

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

А вот в версиях ниже 5.3 не всё так тривиально.
На досуге накидал небольшой скрипт, который поможет понять принцип подхода к этой проблеме. Начальная часть кода взята у Till Brehm, www.ispconfig.org. Но подход, который он использовал, не позволял работать в Safe mode, меня он не устроил и я переписал скрипт под себя.

Код sendmailphp:
В нем мы формируем файл text на отправку с помошью sendmail, пишем лог файл и выполняем скрипт на отправку письма

#!/usr/local/bin/php

<?php

//* Устанавливаем пути к каталогу где лежат sendmail и файл логов
$sendmail_bin = '/data/web/mysite/Exec/sendmail';
$logfile = '/var/log/mailphp.log';

//* Ловим содержимое письма
$logline = '';
$pointer = fopen('php://stdin', 'r');

while ($line = fgets($pointer))
{
if(preg_match('/^to:/i', $line) || preg_match('/^from:/i', $line))
{
$logline .= trim($line).' ';
}
$mail .= $line;
}

//* Компонуем команду для sendmail
$command = ($mail) ."\n";
for ($i = 1; $i < $_SERVER['argc']; $i++)
{
$command .= escapeshellarg($_SERVER['argv'][$i]);
}

//* Пишем лог
file_put_contents($logfile, date('Y-m-d H:i:s') . " " . $_ENV['PWD'] . " " . $logline ." \n", FILE_APPEND);

//* Создаем файл с содержимым письма
$OpenMakeFile=fopen('/data/web/mysite/Exec/text','w');
fwrite($OpenMakeFile,$command);
fclose($OpenMakeFile);

// Выполняем скрипт отправки
exec('/data/web/mysite/Exec/sendmail.sh');
?>


Код sendmail.sh:
В нем мы посылаем письмо что сформировали в файл text и стираем файл text

#!/bin/sh
/data/web/mysite/Exec/sendmail -t -i < /data/web/mysite/Exec/text
rm -f /data/web/mysite/Exec/text



Итак, чтобы всё это работало в Safe Mode Off, в php.ini нужно поправить несколько строк.
1. safe_mode_exec_dir = /data/web/mysite/Exec
этой строкой мы разрешаем выполнять командой exec из пхп то, что
находится в этом каталоге

2. sendmail_path = /data/web/mysite/Exec/sendmailphp
этой же строкой мы говорим, что нужно запустить при вызове из php
функции mail(), то есть подменяем стандартный вызов sendmail своим
скриптом.

Оба файла sendmailphp и sendmail.sh создаем в
/data/web/mysite/Exec/, ну или в том который вы выбрали для этих целей. Так же не забываем, что файл text с содержимым письма создается в этом же каталоге в процессе работы.

Ну и ещё некоторые особенности: бинарник sendmail скопируйте из /usr/sbin в /data/web/mysite/Exec/ ... хотя возможно это и не обязательно, я не стал проверять smile

Ну естественно не забывайте установить нужные права и хозяев файлов.

Само-собой для работы в промышленном масштабе в этом скрипте необходимо поставить проверки. Но этой темы я сейчас касаться не буду.
go pooh







«Важнейшей задачей для нас является сейчас: учиться и учиться» В.И. Ленин



Reply 
Регистрация
 Зарегистрироваться
Комментарии

Рейтинг@Mail.ru