Как стать автором
Обновить

Комментарии 36

полезно, спасибо(:
а не пробовали просто менять адресата на username@localhost?
а если по условиям задачи нужно потестить как рз генерацию адресатов?
письмо — это набор заголовков и текста, который идет после них. если вы замените заголовок «To:» на локальный адрес, а дополнительно создадите еще один заголовок, например «XXX-To:», куда запишете тестируемое поле, то вы решите вашу задачу. и вместо копания в гугле и терминале, вы просто добавите пару строк кода.
На вкус и цвет, как говорится…
Лично мне проще один раз прикрутить скрипт и пользоваться чем каждый раз добавлять/убирать 2 строчки кода. Возможно Вы считаете по другому, но, повторюсь, кому как удобнее.
Здорово, что кто то додумался написать то, что мне самому писать было лень :) Спасибо огромное!
спасибо, мне просто так удобнее отлаживать письма для разных адресатов, да еще читаемо в почтовом клиенте!
Если мне не изменяет память, то для сендмайла достаточно написать в /etc/mail/mailertable

. local:username

где username — ваш логин. И тогда всю вашу почту сендмайл будет складывать в ваш почтовый ящик на вашей же машине.
Чтобы никто больше не мучился, вот неплохая инструкция по этому поводу:
Сделайте бэкап sendmail.mc и sendmail.cf.

Сначала проверьте, что /etc/mail/sendmail.mc содержит строку:

FEATURE(`mailertable',`hash -o /etc/mail/mailertable.db')dnl

Если её там нет — добавьте (у меня например не было).

Скомпилируйте изменения конфига (мне лично тут потребовалось колдовство с chmod & chown):

$ m4 /etc/mail/sendmail.mc>/etc/mail/sendmail.cf

Добавьте изменения в /etc/mail/mailertable.
(строка. local:username)

Сгенерируйте базу mailertable.db:
$ makemap hash /etc/mail/mailertable </etc/mail/mailertable

Перезапустите sendmail.

$ service sendmail restart

А для postfix достаточно добавить в /etc/postfix/main.cf строку «default_transport = error»
Она требует ставить либо Перл либо Питон (под виндой к примеру). а если уже есть cygwin — не проще ли просто прикрутить скриптик, чем возиться с указанными языками.
Хотелось бы в общих чертах понять, зачем ставить 777 на текстовые файлы?
Это эмуляция обычной работы под админом в Windows :)
chmod -R 777 любимая команда молодых пхп программистов, которым нравится Ubuntu
руки бы поотрывал за такое (:
Предлагаю тоже неплохой вариант, пишется общий лог, и в папке mail для каждого адреса создается свой лог (написано на sh.exe из cygwin):

maildir="/d/www/mail"
mainlog="/d/www/mail.log"
tmpfile="/d/www/mail.tmp"

function cleanup()
{
rm -f "$tmpfile"
exit 1
}

trap cleanup ERR 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

# Имя файла с логом (определяется из заголовка To:)
filename="_unknown"

# Красивый заголовок
echo "-----------------------" >> "$mainlog"
echo "-----------------------" >> "$tmpfile"

while read line
do
[[ "${line#To: }" != "$line" ]] && filename="${line#To: }"
echo "$line" >> "$mainlog"
echo "$line" >> "$tmpfile"
done

echo >> "$mainlog"
echo >> "$mainlog"

echo >> "$tmpfile"
echo >> "$tmpfile"

mv "$tmpfile" "$maildir/$filename.log"

Для подключения скрипта под Win пишем что-то вроде:

sendmail_path = sh.exe /d/web-server/sendmail.sh

в php.ini
Поправьте, пожалуйста, теги. Картину в профиле внимания портят. ;)
Метки через запятую перечисляться должны. Зачем минусовать? Хотя, как хотите. :)
Самый простой вариант:
#!/bin/sh
/usr/lib/python2.5/smtpd.py -n -c DebuggingServer localhost:25

и все письма выводятся в консоль
Большое спасибо. Только-только встал вопрос о настройке sendmail в Убунте, а тут ваша статья, очень кстати.
Вы, наверное, что-то не совсем поняли. Тут нет никакого сендмейла :)
Мне именно это и нужно было. Тестирование на локальном сервере отправки почты для тестирования системы уведомлений :)
Теперь меня интересуют вопросы: какой почтовый сервер выбрать, как его установить/настроить и прикрутить к пхп?
Если где-то в сети уже есть почтовик, то попробуйте nullmailer. Он просто перебрасывает почту на smarthost.
Спасибо.
спасибо, я исправлю. это мой первый пост.
Сегодня попросили реализовать такое и кинули ссылку на этот топик :)
Скрипт упростил. Чтобы не запоминать номер в файле используется date с наносекундами. Ну и права конечно же.

#!/bin/sh
prefix="/mnt/php_mail"
date=`date \+\%Y\%m\%d\%H\%M\%N`

name="$prefix/$date.eml"
while read line
do
echo $line >> $name
done
chmod 666 $name

у меня почему-то наносекунды не выводятся, просто N показует и все, хотя остальное — ок
Поправочка: нужно использовать IFS, а также $line должен быть в кавычках, иначе обрезаются пробелы по краям, что критично для заголовков писем. Они могут либо вообще не открываться в почтовых программах, либо быть обрезанными
#!/bin/sh
prefix="/var/www/sendmail"
date=`date \+\%Y\%m\%d\%H\%M\%N`

name="$prefix/$date.eml"
while IFS= read line
do
echo "$line" >> $name
done
chmod 666 $name
Огромное спасибо за статью!
В Evolution (у меня Ubuntu 10.10) в параметрах «Тип сервера» нужно выбрать «Почтовые каталоги в формате Maildir»
Автору — спасибо!

На случай, если в этот топик в поисках забежит ещё один джангист кроме меня:
В django, начиная с версии 1.2, все извращения с sendmail остались позади.
Существуют различные email-backends, в том числе file-backend

Чтобы искалось: Django Sendmail Development Plug
единственная проблема с этим скриптом — при отправке из PHP формы сообщений сразу нескольким адресатам или при отправки копии письма себе (что одно и то же), этот скрипт все ложит в один файл, каким образом отслеживать конец сообщения и начинать писать в новый файл?
может кому-то пригодится, набрел на статью, описывающую скрипт-заглушку, написанный на самом php
www.drupal.ru/node/31183

Для себя немного переписал и на freebsd завелось нормально
в php.ini
sendmail_path = "/usr/local/bin/php /localetc/sendmail_stub/fake.php"

и сам fake.php

$sendMailStubObj = new SendMailStub();
$sendMailStubObj->main();

class SendMailStub
{
    private $_saveEmailsPath = "/mnt/windev/tmp/__sendmail/"; //change path HERE

    function main()
    {
        //--- get email from the stream ---//
        $stream_data = '';
        $stream_handler = fopen('php://stdin', 'r');
        while ($t = fread($stream_handler, 2048)) {
            if ($t === chr(0))
                break;
            $stream_data .= $t;
        }
        fclose($stream_handler);

        //save to file
        $fwrite_handler = fopen($this->_generateUniquePath(), 'w');
        fwrite($fwrite_handler, $stream_data);
        fclose($fwrite_handler);
    }

    private function _generateUniquePath()
    {
        $i = 0;
        do {
            $path = $this->_saveEmailsPath . $this->_generateFname($i);
            $i++;

            if($i > 100){
                break;
            }
        } while (file_exists($path) == true);

        return $path;
    }

    private function _generateFname($i = 0)
    {
        $parts = array(
            date('Y-m-d_H-i-s'),
        );

        if ($i > 0) {
            $parts[] = "_{$i}";
        }
        $parts[] = ".eml";

        $fname = implode("", $parts);

        return $fname;
    }
}
Будьте аккуратны с использованием этого варианта.

while read line
do 
    echo $line >> $name 
done 

будет интерпретировать текст письма как баш скрипт и, например, * заменит на список файлов в текущей директории.

Правильный вариант
while read line
do 
    echo "$line" >> $name 
done
Есть чудесная заглушка прямо в php.ini:

sendmail_path = /bin/cat > "/tmp/mail_`date +%Y-%m-%d_%H-%M-%S`"


Нужно только убедиться в наличии /bin/cat и прав на запись в /tmp/

P.S. велосипед не мой
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории