Веб-разработка Почтовая заглушка в Ubuntu

Как известно, в Ubuntu по умолчанию не установлены пакеты для отправки email. Таким образом при использовании Ubuntu в качестве системы для веб-разработки возникает проблема, что стандартная функция mail() в PHP работать не будет (будет всегда возвращать false). Кроме того при веб-разработке было бы полезным не просто отправлять почту с компьютера разработчика, а иметь почтовую заглушку по аналогии с той заглушкой, которая есть в пакете Denwer в Windows. Другими словами сейчас мы будем настраивать возможность отправки писем функцией mail() в локальный каталог на компьютере веб-разработчика в виде текстовых файлов в формате eml. Особенно удобной будет такая почтовая заглушка при верстке почтовых рассылок.


Изначально описание того, как сделать почтовую заглушку в Ubuntu было найдено на Хабре.

Сначала нужно создать shell-скрипт /usr/bin/fakesendmail.sh со следующим содержимым:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/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

Сделаем только что созданный скрипт исполняемым и назначим его владельцем пользователя root:

sudo chown root:root /usr/bin/fakesendmail.sh
sudo chmod 755 /usr/bin/fakesendmail.sh

Для удобного сбора писем почтовой программой (мы будем использовать для этого Evolution, который установлен в Ubuntu по умолчанию) нужно создать особую структуру каталогов и дать права на запись в них:

sudo mkdir /var/mail/sendmail
cd /var/mail/sendmail
sudo mkdir cur
sudo mkdir new
sudo mkdir tmp
sudo chmod -R 777 /var/mail/sendmail

Далее остается только настроить PHP на работу с новым скриптом-заглушкой. В зависимости от настроек веб-сервера нужно найти файл php.ini и исправить в нем директиву sendmail_path. Если используется веб-сервер Apache, то файл с настройками php следует искать по пути /etc/php5/apache2/php.ini. А вот при использовании Nginx с FastCGI настройки нужно искать по пути /etc/php5/cgi/php.ini.

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
; http://php.net/sendmail-path
sendmail_path = /usr/bin/fakesendmail.sh

Последний шаг — настройка Evolution. В нем нужно создать новую учетную запись. При этом можно указать любой email-адрес, например, test@example.org. Далее следует выбрать тип сервера «Почтовые каталоги в формате Maildir» и в качестве пути к каталогу с почтой нужно указать «/var/mail/sendmail». В диалоговом окне «Отправка почты» следует указать тип сервера «Sendmail».

Таким образом в Ubuntu можно настроить почтовую заглушку по аналогии с той, которая есть в пакете Denwer в Windows.

Комментарии (4)

  1. system

    Здравствуйте.
    Сделано всё как описано, кроме настройки Evolution, а почта всё равно не отправляется. Что ещё за нюансы могут быть? Помогите.

  2. system

    Забыл сообщить, что у меня установлен XAMPP и может надо в файле index.php указывать адрес почты как по умолчанию в XAMPPe ?

  3. system

    Ещё раз пересмотрел настройки и настроил Evolution . Не помогло. Если запускаю вручную файл fakesendmail.sh, то по адресу /var//mail/sendmail/появляется текстовый файл с названием num, а в нем число 1. Если повторно запускаю fakesendmail.sh, то вместо 1 появляется 2 и так далее. Файл php.ini находится в /opt/lampp/etc. Это я на всякий случай. Важно ли какой пользователь и группа в настройках XAMPP, а также адрес email?
    Наверное у меня всё-таки что-то с настройками в XAMPP. Подскажите в чем может быть подвох?

  4. Андрей Аносов

    Если у Вас в /var/mail/sendmail появляется файл num, то скрипт настроен правильно и работает. Загляните в каталог /var/mail/sendmail/new. Там должны быть отправленные из php письма в виде текстовых файлов в формате .eml.

  5. system

    Смотрел, пусто. Дело в том, что при тестировании сайта, нажимая на кнопку отправить, выдаёт как и задумано в случае неудачи «Сообщение Не отправлено!» Может какие первоначальные настройки нужны в XAMPP или достаточно проделать всё по вышеприведённой инструкции? В файле formdata.php и index.html вроде всё по видео уроку. Там конечно Denwer, а я решил в ubuntu учиться. XAMPP я просто распаковал через терминал по инструкции в /opt и в папку htdocs закинул Index.html и formdata.php, плюс проделал то, что здесь написано.

  6. Андрей Аносов

    Если функция mail() в php возвращает false, то это значит, что неправильно настроен sendmail в файле php.ini.
    Во-первых, убедитесь, что вы добавили значение «/usr/bin/fakesendmail.sh» именно параметру sendmail_path, а не sendmail_from.
    Во-вторых, проверьте, как у Вас подключается php к apache2. Если как модуль — то вносить правки нужно в файл /etc/php5/apache2/php.ini. Если php подключается к веб-серверу как FastCGI, то вносить правки нужно в файл /etc/php5/cgi/php.ini. Если через php5-fpm, то в /etc/php5/fpm/php.ini. После внесения правок не забудьте перезапустить веб-сервер командой sudo service apache2 restart, если php подключен как модуль apache2. Или же sudo service php5-fpm restart, если php подключается через php5-fpm.

  7. system

    Приношу свои глубочайшие извинения. Я не обратил внимане на то, что в файле php.ini, перед sendmail_path = /usr/bin/fakesendmail.sh надо убрать точку с запятой. Я же оставил так:
    ;sendmail_path = /usr/bin/fakesendmail.sh
    Спасибо огромнейшее за вашу статью и помощь.