Заглушка 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 = [email protected]
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 письма заглушка апач пхп

Похожие записи:

Заглушка sendmail для php mail(): 6 комментариев

  1. мимо проходил

    недавно тоже припилил такое под виндой, но этот вариант заглушки немного «на костылях»

    //более человеческий пример
    $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 порту…

  2. мимо проходил

    оффтопик: тут какой-то сильно умный скрипт расставляет елочки вместо кавычек :/

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

  3. Эрт Автор записи

    @мимо проходил
    Не тестил, но согласен, так симпатичнее.

    str_replace — just in case. Служит для приведения <CRLF> к общему виду. Иногда скрипты (*nix) генерируют только \n (0Ah) перевод строки. Для винды и того-же бата подходит только \r\n (0D0Ah).

  4. Vitaliy Orlov

    Спасибо, отлично работает с php 5.5.14

  5. maikl.bmv

    Огромное спасибо, просто, доступно, статья очень помогла…. Респект!!!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *