Заглушка sendmail для php mail()
Классическая функция для отладки - заглушка sendmail под php mail. Функция заглушки sendmail - перенаправить письма, отправленные через стандартную функцию php mail(). Вместо отправки, сохранить письма на локальной машине, в какой-то удобной папке.
Не только удобно, а прежде всего правильно, на этапе разработки (development stage) не отправлять ничего не значащие письма, а просто сохранять email в папке.
Когда-то давно, использовал для этих целей заглушку sendmail из "денвера" (собственно единственное что скачал и использовал из denver-а). Но вместо того чтобы переносить этот артефакт на новую систему, тоже давно, просто написал скрипт на php.
Скрипт sendmail.php
<?php
// Заглушка sendmail
// http://urths.com/blog/заглушка-sendmail/
$MailDir = 'e:/var/mail-localhost'; // папка для сохранения писем
$data = "";
$line = 'urths.com';
$f = fopen("php://stdin", "r");
while( !feof($f) AND ($line!='') ) {
$line = fgets($f,255);
$data .= $line;
}
fclose($f);
$data = str_replace("\r", '', $data);
$data = str_replace("\n", "\r\n", $data);
$i = 0;
$addon = '';
while ( file_exists( $fname = ($MailDir.'/'.date('Y-m-d-H-i-s').$addon.'.eml') )) {
$i++;
$addon = '-'.$i;
}
file_put_contents($fname, $data);
?>
Написал, разумеется, после того как беглый поиск дал красивый, но нерабочий пример затычки для sendmail. Убрав ($line!='') можно увидеть процесс php с дефолтным 30-секундным таймаутом, выжирающим всё процессорное время. Вполне возможно это зависание с чтением stdin объясняется особенностями php/apache под windows.
Установка:
1. Создаем папку для писем. Например e:\var\mail-localhost
2. Сохраняем скрипт в папку www. Например e:\www\tech\sendmail.php
3. Перенаправляем sendmail. В php.ini секция выглядит следующим образом:
[mail function]
SMTP = localhost
smtp_port = 25
sendmail_from = me@example.com
sendmail_path = e:\Software\PHP\php-win.exe e:\www\tech\sendmail.php
Поскольку первые три параметра обычно установлены по дефолту, нам важен последний параметр - sendmail_path. Здесь указаны через пробел интерпретатор php и скрипт заглушки sendmail.
4. Перезапускаем Apache, вызываем mail(), смотрим в папку и радуемся.
Всё работает под Windows XP, PHP 5.3, Apache 2.x
Теги: apache php письма заглушка апач пхп
недавно тоже припилил такое под виндой, но этот вариант заглушки немного «на костылях»
//более человеческий пример
$stream = »;
$fp = fopen(’php://stdin’, ‘r’);
while ($t = fread($fp, 2048)) {
if( $t===chr(0) ) break;
$stream .= $t;
}
fclose($fp);
а вот это зачем, я не понял:
$data = str_replace(»\r», », $data);
$data = str_replace(»\n», «\r\n», $data);
ведь пхп должен передавать данные мейлеру уже в нормальном виде
а строки в конфиге
SMTP = localhost
smtp_port = 25
в данном случае не имеют смысла, их можно просто закомментить, этот скрипт же не сервисом висит на 25 порту…
оффтопик: тут какой-то сильно умный скрипт расставляет елочки вместо кавычек :/
работает как-то странно – две одиночные подряд идущие кавычки заменяет на закрывающую елочку, и двойную после скобки тоже.
@мимо проходил
Вордпресовские заморочки с кавычками. Как то тоже заметил и забил.
@мимо проходил
Не тестил, но согласен, так симпатичнее.
str_replace – just in case. Служит для приведения <CRLF> к общему виду. Иногда скрипты (*nix) генерируют только \n (0Ah) перевод строки. Для винды и того-же бата подходит только \r\n (0D0Ah).