Ubuntu php mail не отправляет письма

Обновлено: 04.07.2024

Для начала напомню, что начиная с php 5.3 можно включить лог для всей исходящей почты, отсылаемой через функцию mail() из php. Достаточно в конфигурацию php.ini добавить такую настройку:

При этом важно, чтобы пользователь, от которого работает php, имел доступ к файлу /var/log/phpmail.log на запись. Рекомендую для комфортной отладки создать файл и позволить всем в него записывать, примерно так:

Если у вас php работает как модуль Apache, то перезапустите последний.

Записи в логе будут примерно такие:

Если версия php у вас поновее чем 5.3, то в лог добавятся дата и время (что, конечно, очень полезно). Например, PHP версии 5.5.32 точно добавляет дату и время (но с какой в точности версии это началось — я не знаю). Всё-таки главное в этом логе — абсолютный адрес скрипта и номер строки, с которой вызывалась функция.

В общем, следующий тривиальный скрипт должен обязательно оставить след в логе:

У меня была как раз такая ситуация: php исправно делал свою работу и записи в логе почты оставлял (ничего при этом не оставляя в логе ошибок).

Одновременно с этим почта у меня прекрасно отправлялась из серверной консоли. Проверить можно так:

Если вдруг на вашем сервере нет утилиты mail , то установите пакет mailx вот так:

Анализируем лог postfix

Пришлось заглядывать в лог почтовика. Он пишется в файл /var/log/maillog (актуально для CentOS).

И вот там-то нашлись неприятные записи такого характера:

Даже минимальный опыт общения с линуксом подсказывает, что тут дело либо в несоответствии прав/владельцев, либо в какой-то дефолтной защите, типа фаерволла или… SELinux. В данном случае «виноват» последний.

Отучаем SELinux блокировать почту, отправляемую из PHP

Проверить можно такой командой:

И после этого ждите несколько секунд, пока снова не увидите приглашение командной строки. Без ключа -P блокировка снимется только до перезагрузки.

Запрещаем виртуальному хосту отправлять почту

Иногда бывает такая ситуация, что надо наоборот запретить отправлять почту какому-то сайту. Например, если ясно, что на нём вирус, но на лечение вируса нужно время.

Тогда действуем от противного — в настройки виртуального хоста проблемного сайта добавляем параметр:

И перезапускаем Apache, чтобы изменения вступили в силу. Либо вы можете включить упомянутый выше параметр SELinux, однако, учтите, что это не поможет, если в вашей системе SELinux отсутствует или перманентно отключен.

2 комментария на запись «Что делать, если не отправляется почта из PHP»:

> Если версия php у вас поновее чем 5.3, то в лог добавятся дата и время (что, конечно, очень полезно).
У меня php 5.4, но дата и время в лог не добавляется! Есть решение?

Leonid, а у меня PHP 5.5.32 пишет в лог даты. Запись выглядит примерно так:
[05-Apr-2016 15:22:28 Europe/Moscow] mail() on [/var/www/xxx/public/sites/. . MailSystem.class.php:47]: To: xxx@xxx -- Headers: MIME-Version: 1.0 Content-Type: text/html; charset=UTF-8; Content-Transfer-Encoding: 8Bit X-Mailer: Drupal Return-Path: xxx@xxx Sender: xxx@xxx From: xxx@xxx Bcc: xxx@xxx

C какой точно версии даты начали писаться — не скажу. Пока только известно, что PHP 5.3.3 их не пишет. И ваш 5.4 — тоже. А 5.5.32 уже точно пишет.

Если вы не хотите обновлять php, то, пожалуй, единственное решение в том, чтоб написать свой скрипт-прокладку, который потом указать в sendmail_path. То есть php будет на этот скрипт передавать письма, скрипт будет их желаемым вами образом логировать, а потом уже отдавать в настоящий sendmail для реальной отправки.

Самый простой вариант скрипта-прокладки выглядит примерно так:
sendmail_path = "tee -a /var/log/phpmail.log | /usr/sbin/sendmail -t -i" 🙂

Ремарка для новичков: это надо прописать в /etc/php.ini , предварительно создав файл /var/log/phpmail.log с правами на запись.


Комментарии к этой записи в RSS.

Основная задача этого блога, показать как работать в Ubuntu комфортно и с удовольствием!

Search form is empty!


Итак, задача: настроить на локальном сервере, под управлением ОС Ubuntu отправку почты стредствами php-функции mail().

1. Установка SendMail из репозитория Ubuntu

2. Проверка работоспособность smtp-сервера при помощи коммандной строки и telnet-протокола

3. Настройка php.ini

Находим и редактируем следующую строчку

Для debian установка такая:

Необязательно, но желательно - обновляем репозиториум командой: apt-get update

Затем ставим sendmail командой: apt-get install sendmail-bin

14 комментариев: Leave Your Comments

Добрый день есть проблема в вожу HELO localhost выдает ошибку,
500 5.5.1 Command unrecognized: "HELLO localhost"

не подскажите как можно решить ?

вместо HELLO надо ввести HELO

421 4.3.0 collect: Cannot write ./dfq3CIMoh1007381 (bfcommit, uid=0, gid=113): No such file or directory
Connection closed by foreign host.
на "test message
. "
Почему так?

Через smtp все шлет через консоль. но mail() не работает. точнее работает но не отдает по факту отправки true и по итогу получаю 504 от сервера

После того как я выполнил второй пункт статьи все прошло нормально без ошибок..но проблема в том что не доходят письма на почту..это связано с тем что я сижу под VirtualBox?Если нет то в чем проблема и как её решить!

Как? Тож сижу под виртуал бокс.

У меня вот последние строчки выдаются и все на том, почта не приходит
- 250 2.0.0 vBRGYmr2006713 Message accepted for delivery
- Connection closed by foreign host. (эта строчка - после длительного ожидания)

VarangaOfficial - информация о препарате от грибка варанга - самая большая и исчерпывающа подборка фактов. Воспользовавшись данным ресурсом, вы сможете узнать полную информацию касающуюся представленного средства. Лично увидеть данные о клиническом тестировании геля, прочитать реальные отзывы пользователей и медицинского персонала. Изучить инструкцию по применению, прочитать об особенностях и методах работы комплекса, уяснить, как работает крем Варанга, где можно заказать оригинальный сертифицированный препарат и, как избежать покупки подделки. Мы очень тщательно и скурпулезно проверяем размещаемые на сайте данные. Предоставляем нашим пользователям сведения, взятые только из достоверных источников. Если вы обнаружили у себя признаки грибкового поражения стоп или уже довольно продолжительное время, без ощутимых результатов стараетесь излечиться от этого коварного, неприятного недуга, наш сайт покажет вам легкий и быстрый способ решения проблемы. Присоединяетесь и живите полноценной, здоровой жизнью. Теперь все ответы можно отыскать на одном сайте.

Записки для себя и других.

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

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

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

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

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

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

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

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

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

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

Sendmail

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

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

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

Похожие записи

Запись опубликована автором Igor Ovsiychuk в рубрике Ubuntu с метками mail, mta, php, postfix, sendmail, ssmtp, почта. Добавьте в закладки постоянную ссылку.

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

Сам несколько часов мучался с Postfix, пока не узнал о ssmtp 🙂

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

Проверьте почту в папке спам. Скорей всего письмо попало туда. По крайней мере у меня так было. Еще можете проверить на всякий случай логи.

В спаме тоже нет. А какие именно логи смотреть, если не сложно, скажите?
И еще подскажите, зачем параметр -t указывать в php.ini?

var/log/mail.err попробуйте без -t

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

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

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

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

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

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

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

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

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

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

а вы не смотрели логи? Нету не чего интересного?

в таком случае к сожалению не чем, не помогу. Самому не хватает знаний

спасибо большое. Пригодиться:)

И такой момент: если настроить отправку через SSMTP нужно ли удалять sendmail?

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

насколько я понял то все нормально. После отправки происходит что-то типа отключения.

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

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

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

без проблем, обновил пост, и показал как можно настроить под яндекс

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

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

к сожалению в связке с прокси не пробовал. не помогу

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

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

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

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

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

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

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

Так отправляй по защищенному. У я ндекса есть справка на этот случай. Нафига тебе 25 порт?

SSMTP этот способ намного удобней чем через sendmail.
А вообще с последним таки надо разобраться, но у меня почему-то не отправляло почту.

Хотя, вот на соседнем серваке под bsd все отлично работает, правда настраивал давно, уже и не помню какие были подводные камни.

Я полагаю, мне нужно включить это или что-то? Как мне это сделать?

Из почтового руководства php:

Требования

Чтобы функции почты были доступны, PHP требует установленной и работающей системы электронной почты. Используемая программа определяется настройками конфигурации в файле php.ini.

Это означает, что вам нужно установить какой-нибудь почтовый сервер и настроить php для его использования. Обычно этот почтовый сервер является постфиксом в Ubuntu. Однако - если сторона php, которую вы кодируете, в конечном итоге будет храниться на стороне хостинг-сервиса (например, xmission), то, скорее всего, почтовый сервер там уже будет установлен. В этом случае просто протестируйте свой сайт онлайн, а не локально.

Если вам нужно протестировать его в вашей собственной системе или вы хотите разместить его на своем домашнем сервере, выполните следующие действия:

Установить постфикс

Установка: postfix / sudo apt-get install postfix Во время процесса вас спросят, в каком режиме вы хотите установить postfix. Есть четыре возможных режима:

  • Интернет : Ваш собственный почтовый сервер.
  • Спутник : внешний почтовый провайдер (например, Google) будет использоваться для отправки и получения почты. Сервер не будет получать почту.
  • Smarthost : смесь между двумя. Почта хранится локально, но отправляется через внешнего почтового провайдера.
  • Только местный : вас это не касается. Это системный внутренний почтовый сервер. Вы можете только отправлять почту от пользователя к пользователю в системе.

Остальные параметры установки зависят от вашего выбора этой общей конфигурации.

Скорее всего, вы выберете спутниковую установку. Это означает, что почта будет отправлена ​​через внешнего провайдера. В качестве smtp-сервера (сервера исходящей почты) вам нужно будет указать своих провайдеров smtp. Остальные варианты говорят сами за себя.

Конфигурация после установки

Большинство smtp-серверов требуют аутентификации по паролю для отправки почты. Поэтому postfix нужно будет знать этот пароль. Также есть такие вещи, как шифрование, которое нужно учитывать (что вам придется гуглить). Вот как вы настраиваете postfix с использованием аутентификации по паролю (sasl):

Установите libsasl2-модули

Установите libsasl2-modules и sasl2-bin , щелкнув значки Центра программного обеспечения или из терминала, используя:

Включите sasl-auth, добавив эти строки в /etc/postfix/main.cf

Создайте файл /etc/postfix/sasl_password с такой строкой:

Подставьте реальный пароль, имя пользователя и smtp-адрес.

Вы , возможно , придется обойти «разрешение отказано» ошибка по chown postfix:postfix /etc/postfix заранее.

Это должно делать это в большинстве случаев. Тем не менее, некоторые провайдеры SMTP требуют определенного адреса в качестве отправителя или шифрования.

Связанный: PEAR :: Mail интерфейс также может быть интересен для вас.

Gmail (и, возможно, другим службам) может не понравиться то, что вы пытаетесь отправлять почту таким образом, поскольку это может считаться небезопасным по их стандартам, и это может заблокировать вашу попытку, т. Е. На экране ничего не произойдет, или какое-то место всего процесса заблокирует ваша аутентификация. Также ваш POP3 должен быть включен.

Чтобы противостоять этому, смотрите здесь. (Если вы хотите быть в безопасности, создайте фиктивную учетную запись Gmail)

Favorite

Добавить в избранное

Главное меню » Linux » Использование функции mail() в PHP в Ubuntu

Преимущество готовой базы email ИП и юридических лиц

Настройка конфигурации

Выполните следующую команду, чтобы установить пакет msmtp в Ubuntu для настройки почтового сервера:

Создайте файл конфигурации с именем /etc/msmtprc с помощью следующей команды:

Добавьте в файл следующее содержимое. Добавьте действующий адрес электронной почты для пользователя и действующий пароль для пароля, который будет использоваться для отправки электронного письма. Установите адрес электронной почты отправителя для значения формы .

Выполните следующие команды, чтобы установить владельца и разрешения для файла / etc / msmtprc :

Откройте файл php.ini и измените следующий контент со следующими значениями:

Эта функция может принимать четыре аргумента. Первый аргумент принимает адрес электронной почты получателя. Второй аргумент берет тему электронного письма. Третий аргумент принимает тело письма. Последний аргумент является необязательным и содержит дополнительную информацию об электронном письме в виде строки или массива.

Отправка электронной почты с помощью функции mail()

В этом разделе статьи показаны различные примеры отправки электронной почты с помощью функции PHP mail().

Читать Ubuntu 18.04.6 LTS выпущен с патчами BootHole и последними обновлениями безопасности

Пример 2. Отправьте электронное письмо в формате HTML.

Пример 3. Отправьте электронное письмо с вложением.

Содержимое текстового файла считывается и кодируется перед прикреплением, а функция md5() используется в сценарии для генерации случайного числа для смешанного содержимого. Вся необходимая информация добавляется в переменные $headers и $message перед отправкой электронного письма.

Читать Какие типы сервисов существуют в Kubernetes?

Заключение

В PHP существует множество способов отправки электронных писем. Функция PHP mail() не работает должным образом в Ubuntu после настройки конфигурации. В этой статье показаны необходимые конфигурации и способ отправки электронных писем с помощью функции PHP mail().

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Читайте также: