После установки PHP как php-fpm работающего в chroot и установки сервера почты можно обнаружить, что отправка почты из PHP стандартной функцией mail не работает. И это не удивительно, т.к. стандартный вариант PHP шлет почту через sendmail, который складывает сгенерированные письма в файлики уже непосредственно тому, кто будет отсылать. Поскольку наш PHP находится в chroot, то и до sendmail он достучаться не может. Если sendmail со всеми библиотеками положить в наш chroot и как следует настроить, то это может решить проблему, но путь этот слишком сложный, в замен этого предлагаю два более простых:
- Если ваши php скрипты могут слать почту через SMTP — их надо просто настроить так, чтобы почта отправлялась с локального SMTP вашего VDS. Это не лечит mail, но и делать ничего не надо.
- Если скрипты умеют использовать только функцию PHP mail, то слать почту через mini_sendmail. Об этом варианте и пойдет речь.
Установка mini_sendmail будет произведена из сырцов. Так же нам потребуется bash скомпилированный статически (все библиотеки внутри, чтобы не тащить за собой весь linux) и утилита patch (для наложения патча на mini_sendmail).
Устанавливаем необходимый софт:
sudo apt-get install bash-static patch make gcc
Получаем сырцы mini_sendmail:
cd /usr/local/src sudo wget http://acme.com/software/mini_sendmail/mini_sendmail-1.3.6.tar.gz sudo tar xvfz mini_sendmail-1.3.6.tar.gz sudo rm ./mini_sendmail-1.3.6.tar.gz
Перед сборкой на mini_sendmail надо наложить патч, убирающий некоторый ненужный нам функционал и некоторые ошибки. Получаем патч для mini_sendmail и накладываем на сырцы:
sudo wget http://daily-notes.ru/files/2011/11/minisendmail.patch sudo patch -p0 < minisendmail.patch
Компилируем mini_sendmail:
cd /usr/local/src/mini_sendmail-1.3.6 sudo make
Компилятор будет ругаться предупреждениями, но нам это не помешает, т.к. работать mini_sendmail будет только на локальном хосте. После компиляции mini_sendmail лежит тут — /usr/local/src/mini_sendmail-1.3.6/mini_sendmail.
Теперь надо создать нужную структуру папок в chroot и разложить копии наших файликов. Пристраиваем mini_sendmail (он будет притворяться sendmail ;)):
sudo mkdir /home/koteika.ru/usr/sbin sudo cp /usr/local/src/mini_sendmail-1.3.6/mini_sendmail /home/koteika.ru/usr/sbin/mini_sendmail sudo chmod +x /home/koteika.ru/usr/sbin/mini_sendmail sudo ln -s mini_sendmail sendmail sudo mv ./sendmail /home/koteika.ru/usr/sbin/sendmail
Теперь надо добавить bash для того, чтобы PHP смог запускать mini_sendmail:
sudo cp /bin/bash-static /home/koteika.ru/bin/bash-static sudo chmod +x /home/koteika.ru/bin/bash-static sudo ln -s bash-static sh sudo mv ./sh /home/koteika.ru/bin/sh
Теперь правим конфиг php-fpm для нашего сайта (у меня это /usr/local/php/etc/pools/koteika.ru.conf). Добавим вот такую строчку:
php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -fwebmaster@koteika.ru
Где: webmaster@koteika.ru — адрес, с которого будет отправляться почта по умолчанию.
Перезапускаем php-fpm и радуемся работающей почте:
sudo service php5-fpm restart
[…] Настройка почты для работы в php-fpm из chroot. […]
Доброго дня, благодарю за столь хорошо написанные полезные статьи, но всеже при настройке отправки почты по данной инструкции возникли определенные проблемы. Вроде все сделал как положено, но при этом отправка почты не происходит, при вызове в php функции mail(), она возвращает false.
mini_sendmail скомпилировался нормально (с двумя варнингами), скопировал его в /home/rubin2.ru/usr/sbin/mini_sendmail и создал сслыку sendmail на него. Также добавил bash-static в /home/rubin2.ru/bin и сдела на него ссылку sh. Ну и в конфиг сайта php-fpm добавил путь до sendmail`a. Единственное я не ставил почтовый сервер (Postfix + Dovecot), поскольку с сайта планирую только отправку почты, прием же через yandex.
Пробовал через командную строку (правда через root) запускать sendmail находящийся в chroot окружении, запускать он запускался, но вот отравить почту мне почемуто не удалось (видать чтото не так делал). Баш тоже запускается и работает из командной строки. Что может быть не так ума не приложу, а учитывая практически полное отсутствие опыта администрирования хотелось бы услышать хоть какието намеки в какую сторону надо рыть и в чем может быть причина нефунцикрирования mail()
minisendmail делает коннект к локальному SMTP и отправляет в него запрос, после чего уже сам SMTP закидывает почту куда надо. Поскольку у вас не стоит почтового сервера — коннектиться ему некуда. Вариант — каким-то образом поправить код minisendmail чтобы можно было слать почту через внешние бесплатные smtp но они обычно просят пароля и шлют почту только с их ящиков (скажем яндекс или гугл).
Спасибо за помощь)))
Честно сказать думал, что сам sendmail занимается отправкой почты, оказывается он только посредник.
В общем установил postfix и … почти все заработало.
Из Joomla могу отправить почту если выбрать в качестве способа отправки sendmail, но при выборе php mail joomla выдает «Не удалось вызвать функцию mail.». Решил проверить и запустить php скрипт с функцией mail, и вправду функция вернула false.
Ну странно вообще. В Postfix разрешили без авторизации с локального хоста ?
Проблему решил следующим образом, в конфиге php-fpm вписал не
php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -fmail@rubin2.ru
а
php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f mail@rubin2.ru
не хватало «-i»
Может кому поможет.
Здравствуйте.
Для правильной работы у меня должен быть установлен Postfix или Exim + Dovecot?
exim — у меня дефолтом ставится, его достаточно или надо удалять и ставить Постфикс?
Exim можно настроить, я его на другой конфигурации настраивал без dovecot, но это было давно и я сейчас не подскажу. Но это если чисто слать, если принимать то видимо все хитрее.