Не работает функция mail php

Содержание
  1. Неотправляется почта php функцией mail на виртуальной машине битрикс
  2. Почему PHP функция mail() не работает на сервере?
  3. Настраиваем функцию mail в PHP
  4. Лирическое отступление
  5. Как настроить mail?
  6. Особенности использования
  7. Что делать, если функция не отправляет письма?
  8. Отправка с вложением
  9. Проблемы с кодировкой
  10. Что делать, если не отправляется почта из PHP
  11. Убеждаемся, что PHP точно пытается отправить почту
  12. Проверяем, что письмо может отправить администратор из консоли (без всяких там PHP)
  13. Анализируем лог postfix
  14. Отучаем SELinux блокировать почту, отправляемую из PHP
  15. Запрещаем виртуальному хосту отправлять почту
  16. 2 комментария на запись «Что делать, если не отправляется почта из PHP»:
  17. BrainyCP
  18. Не отправляется почтовые сообщения с сервера. PHP mail() не работает.
  19. Не отправляется почтовые сообщения с сервера. PHP mail() не работает.
  20. Re: Не отправляется почтовые сообщения с сервера. PHP mail() не работает.
  21. Re: Не отправляется почтовые сообщения с сервера. PHP mail() не работает.
  22. Re: Не отправляется почтовые сообщения с сервера. PHP mail() не работает.
  23. Re: Не отправляется почтовые сообщения с сервера. PHP mail() не работает.
  24. Re: Не отправляется почтовые сообщения с сервера. PHP mail() не работает.

Неотправляется почта php функцией mail на виртуальной машине битрикс

Проверка отправки почты из консоли линукс echo «Testing» | mail -s «Test» johndoe@example.comс Ошибка -bash: mail: command not found

Если php почта не отправляется, устанавливаем комманду yum install mailx

Проверяем дальше echo «Testing» | mail -s «Test» johndoe@example.comс Ошибка /usr/sbin/sendmail: No such file or directory «/root/dead.letter» 9/216 . . . message not sent.

Устанавливаем sendmail yum install sendmail sendmail-cf -y chkconfig —level 345 sendmail on service sendmail start

Проверяем дальше echo «Testing» | mail -s «Test» johndoe@example.comс Ошибка пропала, письма приходят

Но вот не задача. PHP Функция mail() не работает Вопрос решился письмом в службу поддержки firstVDS сервера У меня на сервере VDS установлено веб окрежение битрикс Необходимо было в файле /etc/php.d/bitrixenv.ini сменить параметр sendmail_path ;sendmail_path = msmtp -t -i sendmail_path = /usr/sbin/sendmail -t -i и все заработало!

PS: для работы curl потребуется еще одна настройка копируем данные из /etc/php.d/20-curl.ini.disabled в 20-curl.ini service httpd restart

Работаю © 2012 — 2021 год
Все права защищены

Навыки и умения Знание PHP5, MySQL, JS, HTML5, CSS3. Работа с технологиями XML, AJAX, GIT, SOAP Большой опыт взаимодействия с сервером. Работа с 1C-BITRIX FRIMEWORK, BITRIX24

Источник

Почему PHP функция mail() не работает на сервере?

Все время выдает ошибку. Вроде бы сервер нормально настроили, все пакеты поставили, пути проверили, а не работает.
Практически такой же сервер нормально работает с mail().

Что проверить? На что обратить внимание? Что обновить?

  • Вопрос задан более трёх лет назад
  • 28135 просмотров

Проверьте работает ли вообще функция mail на сервере:
echo «Testing» | mail -s «Test» test@example.com

Проверьте установлена ли почтовая служба: sendmail, postfix или другая.
Проверьте запущена ли почтовая служба.

Для sendmail/postfix проверьте настройки в php.ini:

Проверьте в php.ini не внесена ли функция mail в список запрещённых функций:
disable_functions

Вот что там отключено: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority

Есть что-то способное повлиять на мою проблему?

pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,
pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,
pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,
pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority

Источник

Настраиваем функцию mail в PHP

В этой статье пойдет разговор о том, как выполнить настройку своего Mail на PHP. Рассмотрим особенности использования Mail, что делать, если письма не отправляются, как выполняется отправка с вложением и какие бывают проблемы с кодировкой.

Какой бы интернет-проект на PHP вы не сделали, на нём должна быть форма обратной связи, что особенно актуально для проектов коммерческого направления. А значит, вам не обойтись без функции mail. Что же, давайте посмотрим, как использовать эту функцию для отправки сообщений.

Лирическое отступление

Прежде чем двигаться дальше, давайте немного вспомним теорию. Чтобы отправлять письма, нам потребуется почтовый сервер SMTP. Но это не проблема, т. к. он есть практически на всех современных платных хостингах. SMTP — сетевой протокол (protocol), используемый для передачи почты в сетях TCP/IP. Почтовые серверы и прочие агенты пересылки задействуют SMTP для получения и отправки сообщений.

Читайте также:  Почему после переустановки виндовс не работает тачпад

Для приёма почты нам понадобится POP-сервер. Также следует понимать, что сам по себе PHP не отправляет сообщение, а лишь передаёт команды приложению sendmail — именно оно занимается отправкой, следовательно, его нужно иметь (если используете Денвер, то данное приложение уже встроено). Вдобавок ко всему, все сообщения почты помещаются в директорию под названием «tmp/!sendmail».

Как настроить mail?

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

Общее описание функции:

Список основных параметров: 1. to — получатель (получатели) письма. Формат должен соответствовать » RFC 2822. Пример — [email protected]; 2. subject — тема отправляемого письма; 3. message — отправляемое сообщение. Строка отделяется символом CRLF (\r\n). Сами строки не д. б. длиннее семидесяти символов. 4. additional_headers — этот параметр является необязательным. Обозначает строку либо массив, которые вставляются в самый конец отправляемых заголовков. 5. additional_parameters — тоже необязателен. Используют для передачи дополнительных флагов в качестве аргументов командной строки для программы, которая сконфигурирована для отправки писем и указана директивой sendmail_path. К примеру, есть возможность установить отправителя при применении sendmail и с помощью опции -f.

Если вы являетесь веб-мастером и используете Денвер, то информация, которая будет вами отправлена, сохранится на виртуальном диске Z в папке «tmp!sendmail».

Особенности использования

Работа функции mail в PHP зависит от ряда нюансов, включая вид операционной системы, выполненные настройки и параметры. Вот некоторые особенности: — во время отправки письма заголовок Form задаётся через необязательный параметр «additional_headers». Если его нет, нередко возникает ошибка при отправлении; — заголовки разделяйте символами перевода на новую строку и перевода каретки (\r\n); — следите, чтобы длина строки не превышала 70 знаков, для регулировки тоже используйте (\r\n).

Что делать, если функция не отправляет письма?

Даже если учесть всё вышеперечисленное, mail в PHP иногда не работает, причём на локальном сервере всё отправляется нормально. Одна из причин — некорректная настройка функции непосредственно на хостинге. Для решения проблемы рекомендуется обратиться к конфигурационному файлу php.ini и посмотреть на параметры функции «disable_functions». Дело в том, что нужная вам функция mail() может не работать, если она занесена в php.ini в раздел запрещённых (disable_functions).

Идём дальше. Мы можем проверить работоспособность, написав простой код и разместив его в корневом каталоге созданного веб-проекта (сайта):

Если всё функционирует верно, на экране браузера мы увидим цифру один — «1». Её нам вернёт «print» после выполнения. В качестве кодировки рекомендуется использовать UTF-8.

Важный момент! Если вы в качестве локального сервера используете OpenServer, то письма будут сохраняться в папке C:\openserver\userdata\temp\email. Естественно, если вы его установили на локальный диск «С».

Отправка с вложением

Давайте посмотрим, как отсылать сообщения, включающие в себя прикреплённый файл. Воспользуемся для этого функцией sendMailAttachment() :

Проблемы с кодировкой

Бывает, что после доставки сообщения поступают в виде вопросов «?» либо каких-то непонятных символов. Это свидетельствует о проблемах с кодировкой. Проблема может заключаться в заголовке From. Такие заголовки по стандарту должны быть в US-ASCII. Существуют 2 формы кодирования —BASE64 и Quoted-Printable. BASE64 более универсальна и может работать с UTF-8, поэтому лучше использовать ее. Пример:

Однако в данном варианте заголовки могут быть нечитаемы. Для решения данной проблемы следует написать заголовок так:

Также необходимо использовать исключительно кодировку UTF-8.

Как видите, работа функции mail в PHP совсем несложна. Да, мы рассмотрели лишь наиболее распространённые ошибки, возникающие при её реализации. Однако никто не мешает повысить свои навыки PHP-программирования на наших курсах.

Источник

Что делать, если не отправляется почта из PHP

Тривиальные ситуации, когда имеется непорядок со значением sendmail_path в конфигурации php, решаются легко. Проверьте через phpinfo(); , чтобы у вас было задано значение типа /usr/sbin/sendmail -t -i в конфиге, и чтобы за /usr/sbin/sendmail действительно скрывался установленный и работающий MTA. Но сегодня пришлось побеждать менее типовую проблему: из php-скрипта почта как бы отправлялась, но где-то дальше сообщения терялись.

Читайте также:  Керхер как починить шланг пылесоса

Убеждаемся, что PHP точно пытается отправить почту

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

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

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

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

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

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

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

Проверяем, что письмо может отправить администратор из консоли (без всяких там PHP)

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

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

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

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

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

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

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

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

Если вывод будет httpd_can_sendmail —> off , то значит вашу почту блокирует SELinux. Чтобы его от этого отучить на постоянной основе выполните команду:

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

Кстати, пусть вас не смущает, что в параметрах SELinux упомянут httpd. Даже если у вас Apache отсутствует в принципе, а используется, например, связка nginx и php-fpm, то почта всё равно может блокироваться с аналогичными симптомами. Решается проблема точно также и для php-fpm (меняем ту же переменную).

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

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

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

И перезапускаем 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

Читайте также:  P601 не работает wifi

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.

Источник

BrainyCP

Панель управления сервером

Не отправляется почтовые сообщения с сервера. PHP mail() не работает.

Не отправляется почтовые сообщения с сервера. PHP mail() не работает.

Сообщение voland700 » Пт ноя 22, 2019 1:30 pm

На VPS сервере установлена панель BrainyCP, не работает отправка почтовых сообщений.

С ящика настроенного через панель управления хостинга (Beget) – почтовые сообщения отправляются. Но с доменов, с сайтов работающих на хостинге, под BrainyCP – сообщения не уходят.
PHP функция mail() – не работает, сообщения не отправляются.

В чем может быть проблема? Куда смотреть? Как поправить?

Re: Не отправляется почтовые сообщения с сервера. PHP mail() не работает.

Сообщение sbury » Вт ноя 26, 2019 8:47 am

зайдите по ссш под именем пользователя и дайте команду

покажите скриншот ее вывода

Re: Не отправляется почтовые сообщения с сервера. PHP mail() не работает.

Сообщение voland700 » Ср ноя 27, 2019 11:26 am

С ssh — с root — использую его. Соединился с сервером и в результате указанной команды получил это.

настроил почтовый ящик в панели BrainyCP, с него почтовые сообщения отправляются. Однако с сайта работающего на SMC Bitrix. сообщения не отправляются.
Тестовый файл, для проверки mail() из корня сайта возвращает — Функция mail не работает, свяжитесь с администрацией хостинга.

Re: Не отправляется почтовые сообщения с сервера. PHP mail() не работает.

Сообщение sbury » Чт ноя 28, 2019 7:56 am

Re: Не отправляется почтовые сообщения с сервера. PHP mail() не работает.

Сообщение voland700 » Чт ноя 28, 2019 10:20 am

Как зайти по SSH — под пользователем которому принадлежит сайт?

Пол-года года назад, сайт на SMC Bitrix работающий под веб окружением Bitrix ENV перенес на BrainyCp.
На VPS сервер установил BrainyCp, в панели создал хост-аккаун, и развернул на нем сайт из архива. Поскольку я и являюсь владельцем данного сайта, все действия, в том числе перенос скриптов сайта делал под root — правами.

Владелец сайта я, работаю под root пользователем, других пользователей нет.
Создан хост-аккаунт с пользователем с отдельным логином и паролем — естественно, по ним соединится с сайтом по SSH не получается.

Re: Не отправляется почтовые сообщения с сервера. PHP mail() не работает.

Сообщение KyKyIIIKuH » Чт ноя 28, 2019 10:40 am

Как зайти по SSH — под пользователем которому принадлежит сайт?

Пол-года года назад, сайт на SMC Bitrix работающий под веб окружением Bitrix ENV перенес на BrainyCp.
На VPS сервер установил BrainyCp, в панели создал хост-аккаун, и развернул на нем сайт из архива. Поскольку я и являюсь владельцем данного сайта, все действия, в том числе перенос скриптов сайта делал под root — правами.

Владелец сайта я, работаю под root пользователем, других пользователей нет.
Создан хост-аккаунт с пользователем с отдельным логином и паролем — естественно, по ним соединится с сайтом по SSH не получается.

Текущая версия: 1.0839.20210226
Последняя доступная версия: 1.0839

Источник

Оцените статью