Linux для всех

индекс
247,21

Sendmail-заглушка для Linux

Не так давно встала задача, установить заглушку для sendmail, дабы письма из PHP не отсылались на ложные адреса (при тестинге) или просто не возникала ошибка, а складывались аккуратно в папку. Аналогично тому, как это делает Денвер.
Далее…

Поиск по просторам интернета ничего не дал, кроме советов читать мануал к sendmail. Но терпение и упорство сделали свое дело. И, спустя несколько дней, на одном из форумов нахожу интересный шелл-скрипт.
Мне пришлось немного поправить его, для своих нужд. Итак, тело скрипта:

#!/bin/sh
prefix="/var/mail/sendmail/new"
numPath="/var/mail/sendmail"

if [ ! -f $numPath/num ]; then
echo "0" > $numPath/num
fi
num=`cat $numPath/num`
num=$(($num + 1))
echo $num > $numPath/num

name="$prefix/letter_$num.txt"
while read line
do
echo $line >> $name
done
chmod 777 $name
/bin/true

Скрипт сохраняем в папку /usr/bin под любым угодным вам именем и делаем исполняемым (sudo chmod +x). Я использовал fake_sendmail.sh.

Теперь все исходящие письма будут складываться в /var/mail/sendmail. Так же необходимо выставить для папки права на запись. (chmod 777 -R /var/mail/sendmail).

Примечание:
Для сбора писем почтовиком (о чем ниже), нужно в этой папке создать следующую структуру папок:
/var/mail/sendmail/
— cur
— new
— tmp
И дать права на запись.

Настройка PHP.
У меня стоит Кубунта, так что все пути относительно нее. Итак, находим в папке /etc/php5/apache2 файл php.ini и меняем в нем путь к sendmail на:

sendmail_path = /usr/bin/fake_sendmail.sh.

Все, на этом можно и закончить. Далее читать страждущим юзабилити.

Привязка локальной папки к KMail.
Запускаем KMail и переходим в опции создания нового аккаунта:
Settings -> Configure KMail -> Accounts -> Add.

Выбираем maildir mailbox, а в настройках этого аккаунта, собственно, путь к папке с письмами (/var/mail/sendmail).
Все, закончено. Теперь эти письма можно будет забирать почтовиком и читать в удобоваримом виде.
+39
20 января 2009, 18:33
110

комментарии (30)

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

. local:username

где username — ваш логин. И тогда всю вашу почту сендмайл будет складывать в ваш почтовый ящик на вашей же машине.
0
dmiceman #
А для postfix достаточно добавить в /etc/postfix/main.cf строку «default_transport = error»
+2
Patrick #
А не проще fakemail воспользоваться???
0
egorinsk #
Она требует ставить либо Перл либо Питон (под виндой к примеру). а если уже есть cygwin — не проще ли просто прикрутить скриптик, чем возиться с указанными языками.
+2
pieceofsummer #
Хотелось бы в общих чертах понять, зачем ставить 777 на текстовые файлы?
+4
AgaFonOff #
Это эмуляция обычной работы под админом в Windows :)
0
logka #
chmod -R 777 любимая команда молодых пхп программистов, которым нравится Ubuntu
0
AusTiN #
руки бы поотрывал за такое (:
0
egorinsk #
Предлагаю тоже неплохой вариант, пишется общий лог, и в папке 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
–1
Apostol #
Поправьте, пожалуйста, теги. Картину в профиле внимания портят. ;)
0
Apostol #
Метки через запятую перечисляться должны. Зачем минусовать? Хотя, как хотите. :)
+1
alrond #
Самый простой вариант:
#!/bin/sh
/usr/lib/python2.5/smtpd.py -n -c DebuggingServer localhost:25

и все письма выводятся в консоль
0
rumkin #
Большое спасибо. Только-только встал вопрос о настройке sendmail в Убунте, а тут ваша статья, очень кстати.
0
AgaFonOff #
Вы, наверное, что-то не совсем поняли. Тут нет никакого сендмейла :)
0
rumkin #
Мне именно это и нужно было. Тестирование на локальном сервере отправки почты для тестирования системы уведомлений :)
Теперь меня интересуют вопросы: какой почтовый сервер выбрать, как его установить/настроить и прикрутить к пхп?
+1
AgaFonOff #
Если где-то в сети уже есть почтовик, то попробуйте nullmailer. Он просто перебрасывает почту на smarthost.
0
rumkin #
Спасибо.
0
mariner #
спасибо, я исправлю. это мой первый пост.
0
logka #
Сегодня попросили реализовать такое и кинули ссылку на этот топик :)
Скрипт упростил. Чтобы не запоминать номер в файле используется 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

0
Polosatyi #
Огромное спасибо за статью!
0
bullgare #
В Evolution (у меня Ubuntu 10.10) в параметрах «Тип сервера» нужно выбрать «Почтовые каталоги в формате Maildir»
0
gbezyuk #
Автору — спасибо!

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

Чтобы искалось: Django Sendmail Development Plug
0
NecroHill #
единственная проблема с этим скриптом — при отправке из PHP формы сообщений сразу нескольким адресатам или при отправки копии письма себе (что одно и то же), этот скрипт все ложит в один файл, каким образом отслеживать конец сообщения и начинать писать в новый файл?

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.