LAMP. Отправка почты функцией PHP mail().

Если после установки например LAMP сервера у вас не работают скрипты с функцией php mail(), точней письма просто не отправляются, то это значит что вам нужно установить почтовый сервер, например Postfix. Но Postfix — это огромный с кучей возможностей почтовый сервер, и мне он был не к чему. Мне нужно было лишь заставить работать функцию mail(), точней просто отправлять письма с сервера, например при регистрации, или заказе товара в интернет-магазине, и т.д. Поискав информацию, я нашел очень хороший, минимальный MTA, для таких целей. Таким оказался — SSMTP. Нету не чего лишнего, прост в установке, и настройке. Давайте установим и настроем ssmtp для отправки писем, например через gmail.

Для установки SSMTP выполните в терминале:

sudo apt-get install ssmtp

Отредактируем файл-конфигурации:

sudo gedit /etc/ssmtp/ssmtp.conf

Добавим туда следующие строчки, заменяя их на свои данные:

root=youremailhere@gmail.com
mailhub=smtp.gmail.com:587
AuthUser=yourgmailusername
AuthPass=yourgmailpassword
UseSTARTTLS=YES

По-сути, по таком же примеру можно настроить почту и под любого другого сервиса почты.

Есть еще и другой способ, ниже я приведу пример настроек для yandex.ru

sudo gedit /etc/ssmtp/revaliases

Пишем следующие строчки, и не забываем их изменить под свои данные

root:pupkin@yandex.ru:smtp.yandex.ru:465
UserUbuntu:pupkin@yandex.ru:smtp.yandex.ru:465
www-data:pupkin@yandex.ru:smtp.yandex.ru:465

Сохраняем и закрываем.

Редактируем конфиг:

sudo gedit /etc/ssmtp/ssmtp.conf

И все содержимое заменяем следующим:

hostname=localhost
FromLineOverride=NO
AuthUser=pupkin@yandex.ru
AuthPass=12345
mailhub=smtp.yandex.ru:465
UseTLS=YES

Подставляем свои данные, сохраняем, и закрываем.

Далее откроем php.ini и отредактируем его:

sudo gedit /etc/php5/apache2/php.ini

находим параметр: sendmail_path, раскоментируем его и добавляем путь к ssmtp:

sendmail_path = /usr/sbin/ssmtp -t

Сохраняем изменения и перезагружаем апач:

sudo /etc/init.d/apache2 restart

Sendmail

Но существует и второй способ, и он еще проще. Но вся проблема в том, что он не у всех работает, иногда нужно звонить провайдеру, или теребенить в тех поддержку, чтоб прописали PTR запись

Установим  sendmail

sudo apt-get install sendmail

отредактируем php.ini И дадим знать для php, что  мы будем отправлять почту, через sendmail

sudo gedit /etc/php5/apache2/php.ini

в параметре sendmail_path пропишем следующее:

sendmail_path = /usr/sbin/sendmail -t

Перезагрузим веб-сервер

sudo /etc/init.d/apache2 restart

Пост обновлен! 28.12.2011

LAMP. Отправка почты функцией PHP mail().: 56 комментариев

  1. Добрый день.
    Попробовал сегодня второй легкий способ (что с sendmail) на своем LAMP (Ubuntu 11.10)
    Во-первых, очень долго отрабатывает скрипт отправки, а во-вторых, на почту все-таки не приходит письмо, которое должно приходить.
    Не знаете, в чем может быть проблема?

  2. а вообще в силу того, что письма мои идут в папку спам, я пока отказался от sendmail использую первый способ. Хотя проверял и второй. Но пока не было времени разобраться почему письма в «спам» уходят. Как только решу вопрос, то сразу и обновлю статью

    • Попробовал ssmtp. Оно отправляет, но кидает в спам. А sendmail вообще не отправляет.

      • мне сложно что-то сказать. но у меня все работает. Статьи тут из личного опыта, поэтому за работоспособность их отвечаю.

        Проверьте установлены ли у Вас пакеты:
        sandmail-base
        sandmail-bin
        sandmail-cf

        если устанавливаете sendmail, то удалите ssmtp.
        После каждого изменения php.ini нужно рестартить апач

        • Остановился на ssmtp. Мне этого достаточно. Главное проверять, как почта приходит.

          Спасибо огромное за статью.

          • нет за что. Загляните вечерком. Или уже завтра утром. Специально для вас, сегодня еще раз проверю sendmail на свежо-установленном lamp

      • В спам попадает потому что спам-фильтру не нравятся заголовки письма. Например: X-Mailer

  3. Автор, ты учебник русского языка вообще видел когда-нибудь? Почитай, а то любой «Джамшут» грамотней пишет.
    Про ssmtp молчу, хихикая, поскольку пользуюсь gentoo, а там именно он стоит «из коробки».

    • 1. Я с Украины, и русский язык вообще не изучал, и учебник даже не видел.
      2. Я здесь пишу статьи для себя, а не сдаю экзамен
      3. Покажите ошибки в орфографии.
      4. Поздравляю Вас, что вы на gentoo, зачем тогда вообще читаете эту статью?
      5. Нечего сказать по теме, проходите мимо.

  4. Добрый день, Игорь.
    Объяснима ли такая ситуация, и, что посоветуете сделать?
    Установлен только sandmail, скрипт сайта через php-mail без успешно отправляет письма. Попробовал в консоли: echo aaaa | sendmail your@email.com, на mail и yandex не пришло, а на yahoo пришло.
    следовательно sandmail работает, но почему так выборочно? Сервер в америке физически располагается (дешевле и производительнее) или может у них в список Магнитского и наши почтовые сервисы попали?

      • Логи конечно смотрел, но интересное, из за отсутствия опыта, не увидел.
        При отправке на яндекс было такое сообщение:
        (0/0), delay=00:00:02, xdelay=00:00:02, mailer=esmtp, pri=120300, relay=mx.yandex.ru. [77.88.21.89], dsn=4.0.0, stat=Deferred: 451 4.7.1 Sorry, the service is currently unavailable. Please come back later.

  5. Для майла такое было:
    delay=00:00:01, xdelay=00:00:01, mailer=esmtp, pri=120302, relay=mxs.mail.ru. [94.100.176.20], dsn=5.0.0, stat=Service unavailable

  6. Игорь огромнейшее спасибо! Я весьма ламер и только вот с какого то раза поднял LAMP на Ubuntu 11.10. В сайте который пишу была необходимость реализовать возможность обратной связи. К вашей статье сначала отнесся с недоверием в силу того, что в файле ssmtp.conf не было пунктов AuthUser=,
    AuthPass=, UseSTARTTLS= вовсе (а мы помним что я ламер и был искренне уверен что если закоментаренных пунктов нет, то значит все, капец, добавлять ничего нельзя). Убил двое суток в установке postfix, скъюрелмаил и тп — все бестолку. В итоге отважился, установил ssmtp и настроил все по инструкции — о чудо — все заработало! Sendmail правда почту все же не захотел отправлять (я удалил предварительно ssmtp как написано), но это вероятно я что то недоделал — поровну. Вариант с ssmtp абсолютно рабочий. Спасибо еще раз!

  7. Здравствуйте, настраивал так же как у вас, но не прописывал в php.ini путь к ssmtp, работало, потом прописал ssmtp -t, тоже работало какое-то время, потом перестало.
    Опять гуглил, попробовал ваш вариант /usr/sbin/ssmtp -t опять заработало…мистика, я чего-то недопонимаю…
    После этого в логах при отправке пишется така строка:
    221 2.0.0 Service closing transmission channel Но сообщение при этом приходит, я этого раньше не видел, оно нормальное?

    Спасибо за внимание.

  8. ок. А по первой части вопроса почему так могло произойти нет мыслей?

    • если в php.ini Не прописан sendmail_path, тогда php не будет знать с помощью чего ему отправлять письма. т.е. письма отправляться не должны. По поводу почему у вас то работало, то перестало, к сожалению, конкретно ответить не могу, т.к. я как и Вы (наверное) только учусь, и обо всех нюансах еще знаю:)

  9. а можно примерчик не через gmail а скожем через mail.ru или yandex?
    через gmail пол инета завалено.

  10. В конфиге строка
    UseSTARTTLS=>YES

    уберите знак «>», я не заметил его, искал почему не отправляет 🙂

  11. Здравстуйте! Спасибо за статью, помогла! Первый вариант, правда, почему-то не сработал, зато второй сработал. У меня вот какой вопрос: отправлять к себе в локалхост получается, а вот на внешние адреса — нет:(. Выдается connection timed out. Можно ли как-то решить эту проблему? Может быть, дело в том, что я сижу через прокси и с динамическим IP?

  12. Все сделал, как описано у Вас в статье, перегрузил apache, а все равно если смотреть конфигурационный файл php.ini через cms в админ панели изменений не происходит да и почта не отправляется

  13. Итак для 2 способа через sendmail на примере Debian
    1)/etc/mail/sendmail.mc
    2)
    после
    define(`_USE_ETC_MAIL_’)dnl

    добавить

    define(`MAIL_HUB’, `youdomain.ru.’)dnl
    define(`LOCAL_RELAY’, `youdomain.ru.’)dnl

    3)/etc/init.d/sendmail restart

    Профит!

  14. Благодарю за статью! Всё почти заработало, но при попытке отправить письмо средствами php сталкиваюсь с траблой в логе: «could not find password entry for UID 33» (UID 33 — www-data. апач-юзер). Задал пароль для него — результат нулевой. В чем может быть проблема?

  15. Здравствуйте, благодарю за статью, отличная справка — самое то что нужно. Но вот еще появилась вот такая проблема, в том что в поле from попадает имя пользователя от которого был запущен скрипт с функцией mail, а я хочу сделать так что бы в там писалось имя почтового ящика.

    Я пробовал в файле ssmtp.conf прописывать параметр rewriteDomain — но не получается.

    • у меня тоже такая проблема. Пользуюсь от гугла почтой. Так вот отправитель всегда заменяется на гугловскою почту, как-то гуглил — оказалось что гугл специально заменяет отправителя на себя. Я смерился.

      • Из того что нагугли я Вот здесь https://debian.pro/1128

        ======цитата======
        /etc/ssmtp/revaliases, при помощи которого мы сообщим ssmtp, что к почте определенных локальных пользователей нужно принудительно выставлять заголовок From
        ======конец цитаты=====

        так вот потом еще вот такое нашел, но воплотить в жизнь пока не получилось

        ======цитата======
        Пользователям, не указанным в этом файле, отправить почту с сервера не получится (smtp-сервер даст им отлуп, дескать «вы не можете слать с ящика xxx@debian.pro»).
        Но при этом, в случае с ПДД яндекса у вас есть адский чит. Можно пойти в настройки ящика на pdd.yandex.ru (в моем случае — dev@debian.pro) и добавить ему алиасом ящик inky@debian.pro. Тогда локальный пользователь inky сможет слать почту как inky@debian.pro с теми же учетными данными.
        А можно поступить ещё круче и добавить домен-алиас. И к ящику dev@debian.pro добавить алиас me@vlad.pro. И сделать в файле revaliases такую конструкцию:
        ======конец цитаты=====

        пока я с это немножко отложил, но нада будет вернутся, и попробовать довести до ума, а пока юзаю phpmailer — там с подстановкой отправителя все нормально. Но опять же есть свои бока:
        — если настроить отправку писем из почты Яндекса, в папку исходящих не попадает отправленная почта, при вто-вточ аналогичной ситуацыи с гуглом все ок, отправленные письма без проблем складируются в папочку «исходящие». Пытался найти что нит в настройках почтового ящика Яндекса — пока безрезультатно.

      • Как я понял у Миколы другая проблема. В From вставляется имя пользователя ОС от которого запускался скрипт отсылки почты, например www-data. Как с этим справиться тоже не знаю.

          • Александр! Спасибо за ответ. Плохо что нету уведомлений, а то я вот только сейчас увидел.

            Я попробую по Вашему описанию исправить ситуация с подстановкой отправителя в From и отпишусь.

  16. Спасибо автору.
    по поводу ssmtp — не советую ни кому.
    Во первый, почему-то не заработало по 25-му порту с mail.ru
    во-вторых при неудачной попытке отправить письмо зависает весь апач (!)
    в третьих smtp мало где остался (в новых ящиках яндекс и джимайл уже не нашел)

  17. Спасибо, у меня связка lighttpd + php + интернет-магазин и все заработало через ssmtp!
    Во время отправки lighttpd действительно подвисает, но как временная мера решение с ssmtp мне подходит)
    Позже буду пробовать через sendmail, ему ведь не нужно участие http-сервера напрямую?)

  18. Уведомление: Ubuntu | LAMP. Отправка почты функцией PHP mail(). | Блог. Личные записки. — chertov.xyz

  19. Через Senmail так и не получилось, AiContactSafe просто подвисал, а при обновлении страницы появлялось сообщение об успешной отправке, но в почте его так и не было. Удалили через Synaptic все что связано с Sendmail, установил через терминал SSMTP, перезагрузил Apache через терминал и все заработало.

Добавить комментарий для Dmitriy Koreshkov Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *