"Заглушка" sendmail для xampp

Главные вкладки

Аватар пользователя Anton L. Safin Anton L. Safin 30 июня 2009 в 17:59

Несмотря на то, что мой совет не относится напрямую к Drupal'у, думается, он будет полезен тем, кто тестирует сайты у себя на локальном веб-сервере под Windows.

Немного предыстории. С самого начала работы в качестве веб-разработчика я использовал Denwer, и он мне казался идеальным решением для локального тестирования сайта. Так бы, наверное, продолжалось и по сей день, если бы я не занялся вплотную Drupal'ом. И вот тут что-то моему любимому Denwer'у не понравилось - он мог несколько минут загружать страницу, при этом индикатор загрузки процессора был близок к 90%. В поисках альтернативного решения я наткнулся на пакет xampp lite, поставил его, и буквально через неделю удалил папку Denwer'а с машины.

Однако и в этой бочке меда нашлась пара ложек чего-то не очень съедобного.

Во-первых, xampp, как уважающий себя веб-сервер, не пытается самостоятельно создавать виртуальные хосты. Впрочем, пару раз в месяц добавить две строчки в httpd-vhosts.conf и hosts не составляет труда. А вот второй "фишки" Denwer'а очень не хватало. Это - отладочная заглушка sendmail, которая позволяет вместо отправки почты записывать ее в файл.

Радуйтесь все, кто пришел сюда за конкретным рецептом - вводная часть завершена. Переходим к практике. Итак, чтобы реализовать подобную функцию на xampp (впрочем, как и на любом другом веб-сервере), делаем следующее:

  1. В папке sendmail в домашней директории xampp создаем файл sendmail.php:
    <?php

    //папка в которую будем складывать почту
    define('DIR','c:/xampplite/tmp/sendmail/');

    //получаем из потока тело письма
    $stream '';
    $fp fopen('php://stdin','r');
    while(
    $t=fread($fp,2048))
        {
        if( 
    $t===chr(0) )
            break;
        
    $stream .= $t;
        }
    fclose($fp);

    //Сохраняем в файл
    $fp fopen(mkname(),'w');
    fwrite($fp,iconv("UTF-8","CP1251",$stream));
    fclose($fp);

    //Функция присвоения имени файлу
    function mkname($i=0)
        {
        
    $fn DIR.date('Y-m-d_H-i-s_').$i.'.eml';
        if ( 
    file_exists($fn) )
            return 
    mkname(++$i);
            else return 
    $fn;
        }

    ?>
  2. В файле \php\php.ini ищем строчку
    sendmail_path = "C:\xampplite\sendmail\sendmail_.exe -t"

    и заменяем ее на

    sendmail_path = C:\xampplite\php\php.exe c:\xampplite\sendmail\sendmail.php

    Естественно, пути нужно подправить в соответствии с той директорией, куда вы установили xampp.

  3. Перезапускаем сервис apache, и проверяем работу нашей заглушки - если вы все сделали правильно, все отправленные письма будут ждать вас в папке /tmp/sendmail/

Комментарии

Аватар пользователя Myron Myron 1 июля 2009 в 6:40

"Anton L. Safin" wrote:
В папке sendmail в домашней директории xampp создаем...

Архинужная вещь. К сожалению использую Wamp, но не нашел папки sendmail.

Также не нашел строки

Quote:
sendmail_path = "C:\xampplite\sendmail\sendmail_.exe -t"

в файле php.ini, который у меня находится в c:\wamp\bin\php\php5.2.9-2\php.ini
Нашел только:
sendmail_from = admin@<адрес сайта>
Поменял - не работает отсылка почты.
От Денвера отказался на 3-й день, перешел на Wamp

Аватар пользователя Anton L. Safin Anton L. Safin 1 июля 2009 в 14:51

"Myron" wrote:
К сожалению использую Wamp, но не нашел папки sendmail

Не проблема - можно ее создать или разместить php файл в любой другой папке. Просто пути нужно будет прописать правильные.

"Myron" wrote:
в файле php.ini, который у меня находится в c:\wamp\bin\php\php5.2.9-2\php.ini
Нашел только:
sendmail_from = admin@<адрес сайта>
Поменял - не работает отсылка почты.

Вставьте строчку с sendmail_path в любом месте файла php.ini и перезапустите apache. Должно заработать.

Проверить можно, создав php файл со следующим содержимым:

<?php
phpinfo
();
?>

Откройте его в браузере и найдите строчку sendmail_path. Да, в xampp такой файл уже есть, и доступен по ссылке http://localhost/xampp/phpinfo.php.

И еще - в скрипте используется функция iconv для перекодировки текста из UTF-8 в CP-1251, поэтому, если после указанных действий письмо все равно не сохраняется, возможно, дело в отсутствии библиотеки iconv. В таком случае просто исправьте 19-ю строку в файле на следующую:

<?php
fwrite
($fp,$stream);
?>
Аватар пользователя Myron Myron 8 июля 2009 в 7:43

Спасибо, дошел до последнего замечания, т.к. предыдущие не работают.
И здесь возник вопрос.
Вот здесь сказано:

"Anton L. Safin" wrote:
В таком случае просто исправьте 19-ю строку в файле на следующую:

В каком файле это надо сделать?

Аватар пользователя PVasili PVasili 8 июля 2009 в 10:40

А не пробовали denwer немного поднастроить? Ни разу не замечал проблем особых... Тем более, скоро 4 версия появится

Аватар пользователя Sergenius Sergenius 19 апреля 2010 в 19:52

Спасибо автору применил на wampserver 2 глушит и складывает в папку.

Только почему-то письма не содержат текста лишь кому от кого и тему В чём может быть проблема?

Аватар пользователя NecroHill NecroHill 20 января 2012 в 5:46

покурил интернеты и выкрутился SH скриптом:

создаем fake_sendmail.sh

#! /bin/sh
prefix="/sites/sendmail/tmp"
date=`date \+\%Y\%m\%d\-%H\-%M\-%S`
name="$prefix/email-$date.eml"
cat >> $name
chmod 777 $name

сохраняем где удобно (я сохранил в /Applications/XAMPP/xamppfiles/bin/)
делаем его исполняемым (sudo chmod +x)

в php.ini меняем sendmail_path на sendmail_path = /Applications/XAMPP/xamppfiles/bin/fake_sendmail.sh
создаем папку для сбора писем (как видно у меня это /sites/sendmail/tmp), папке выставляем на редактирование кем угодно (0777)
перезапускаем Apache и готово

работать должно на всех UNIX/LINUX системах вроде как, отличаться будет только путями

единственная проблема с этим скриптом — при отправке из PHP формы сообщений сразу нескольким адресатам или при отправки копии письма себе (что одно и то же), этот скрипт все ложит в один файл, каким образом отслеживать конец сообщения и начинать писать в новый файл?