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

Вы можете оставить комментарий, или отправить трэкбек на ваш сайт.

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

  1. Круто :3
    Буду иметь ввиду…

  2. Guedda:

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

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

    • Guedda:

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

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

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

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

        • Guedda:

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

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

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

      • Николай:

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

  4. zuk0:

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

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

  5. Дмитрий:

    Добрый день, Игорь.
    Объяснима ли такая ситуация, и, что посоветуете сделать?
    Установлен только 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.

  6. Дмитрий:

    Для майла такое было:
    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

  7. Дмитрий:

    ip белый. Извиняюсь за глупый вопрос: как проверить ящик postmaster@domain.com если он на этом домене не заведен?

  8. Юрий:

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

  9. Алексей:

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

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

  10. Алексей:

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

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

  11. Алексей:

    спасибо за внимание)

  12. Василий:

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

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

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

  14. Простое человеческое спасибо! ))))

  15. Иван:

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

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

  17. Добряк:

    Итак для 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

    Профит!

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

  19. Проблема решена. Достаточно было назначить на /etc/ rwxr-xr-x

  20. Здравствуйте, благодарю за статью, отличная справка — самое то что нужно. Но вот еще появилась вот такая проблема, в том что в поле 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. Как с этим справиться тоже не знаю.

        • Разобрался, нужно было FromLineOverride=YES ставить, а потом в PHP скрипте уже задать From)

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

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

  21. Привет. Кто-нибудь разобрался с www-data на яндексе?

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

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

Оставить комментарий