Comments 36
полезно, спасибо(:
а не пробовали просто менять адресата на username@localhost?
а если по условиям задачи нужно потестить как рз генерацию адресатов?
письмо — это набор заголовков и текста, который идет после них. если вы замените заголовок «To:» на локальный адрес, а дополнительно создадите еще один заголовок, например «XXX-To:», куда запишете тестируемое поле, то вы решите вашу задачу. и вместо копания в гугле и терминале, вы просто добавите пару строк кода.
Здорово, что кто то додумался написать то, что мне самому писать было лень :) Спасибо огромное!
спасибо, мне просто так удобнее отлаживать письма для разных адресатов, да еще читаемо в почтовом клиенте!
Если мне не изменяет память, то для сендмайла достаточно написать в /etc/mail/mailertable
. local:username
где username — ваш логин. И тогда всю вашу почту сендмайл будет складывать в ваш почтовый ящик на вашей же машине.
. 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»
Хотелось бы в общих чертах понять, зачем ставить 777 на текстовые файлы?
Предлагаю тоже неплохой вариант, пишется общий лог, и в папке 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
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
и все письма выводятся в консоль
#!/bin/sh
/usr/lib/python2.5/smtpd.py -n -c DebuggingServer localhost:25
и все письма выводятся в консоль
Большое спасибо. Только-только встал вопрос о настройке sendmail в Убунте, а тут ваша статья, очень кстати.
спасибо, я исправлю. это мой первый пост.
Сегодня попросили реализовать такое и кинули ссылку на этот топик :)
Скрипт упростил. Чтобы не запоминать номер в файле используется 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
Скрипт упростил. Чтобы не запоминать номер в файле используется 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
На случай, если в этот топик в поисках забежит ещё один джангист кроме меня:
В 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
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:
Нужно только убедиться в наличии /bin/cat и прав на запись в /tmp/
P.S. велосипед не мой
sendmail_path = /bin/cat > "/tmp/mail_`date +%Y-%m-%d_%H-%M-%S`"
Нужно только убедиться в наличии /bin/cat и прав на запись в /tmp/
P.S. велосипед не мой
Sign up to leave a comment.
Sendmail-заглушка для Linux