Настройка почты для работы в php-fpm из chroot

Дата Автор cdb8 комментариев

После установки 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
Если вам понравилась моя статья, пожалуйста, не поленитесь кликнуть любую кнопочку ниже, или кинуть ссылку на статью в свой блог или форум. Всегда рад ответить на ваши вопросы в комментариях. Спасибо 🙂

8 комментария на «Настройка почты для работы в php-fpm из chroot»

  1. Доброго дня, благодарю за столь хорошо написанные полезные статьи, но всеже при настройке отправки почты по данной инструкции возникли определенные проблемы. Вроде все сделал как положено, но при этом отправка почты не происходит, при вызове в 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.

        • Проблему решил следующим образом, в конфиге 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»
          Может кому поможет.

  2. Здравствуйте.

    Для правильной работы у меня должен быть установлен Postfix или Exim + Dovecot?
    exim — у меня дефолтом ставится, его достаточно или надо удалять и ставить Постфикс?

  3. Exim можно настроить, я его на другой конфигурации настраивал без dovecot, но это было давно и я сейчас не подскажу. Но это если чисто слать, если принимать то видимо все хитрее.

Добавить комментарий

Ваш адрес email не будет опубликован.