opium
@opium
Просто люблю качественно работать

Проблема отправки почты через mail() в php

Появилась на продакшен сервере вот такая ошибка

Severity: Warning
Message: mail(): Could not execute mail delivery program '/usr/sbin/sendmail -t -i'
Filename: libraries/Email.php
Line Number: 1545
framework code igniter

Код в этом файле такой:
if ( ! mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str, "-f ".$this->clean_email($this->_headers['From']))) { return FALSE; } else { return TRUE; }

Чтобы отловить ошибку пробовал ловить exception его нет
try { тут код с майл; } catch (Exception $e) { print $e->getMessage(); } return true;

Вывел echo все переменные на продакшене и на тестовом, вроде тут тоже все одинаковое.

Код одинаковый с тестовым сервером, на тестовом такое же окружение в такой же ос(amazon linux аналог centos) все работает и шлет. Изменений в момент когда все сломалось в окружение я не вносил.

Файл /usr/sbin/sendmail присутствует, имеет нормальные права и нормально запускается.

Функция mail используется в других частях кода и там все в порядке.
В php.ini всего две строчку для настройки mail
sendmail_path = /usr/sbin/sendmail -t -i
mail.add_x_header = On

Пробовал убирать -t -i для теста, чтобы проверить используется ли этот php.ini, после этого ошибка изменилась на не могу вызвать sendmail но без параметров -t -i

Скрипт запускаю в консоли, memory_limit 1500MB, памяти свободной куча, проца тоже, файл подкачки пустой.

конфиг php.ini не менялся несколько месяцев, конфиг sendmail также не менялся несколько месяцев.

Обновил для пущей уверенности php до 5.3.25 и sendmail до 8.14.4
Ума не приложу в какую сторону копнуть ещё или как получить больше информации об ошибке.
  • Вопрос задан
  • 11359 просмотров
Пригласить эксперта
Ответы на вопрос 8
@mayorovp
А веб-сервер случайно не в chroot'е?
Ответ написан
@lubezniy
В логи почтовика что-нибудь пишется?
Ответ написан
Anonym
@Anonym
Программирую немного )
Exception там и не будет.
Код упростите до
return mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str, "-f ".$this->clean_email($this->_headers['From']));


При условии, что в других местах mail() работает, то проблема скорее всего в параметрах. Попробуйте захардкодить для теста.
Логи можно еще посмотреть здесь:
/var/log/maillog
/var/log/mail.*
Ответ написан
Чтобы точно узнать в sendmail или php проблема — попробуйте вызвать sendmail из консоли, и отправить какое-нибудь тестовое письмо вручную. Если отправится — значит проблема в php. Если не отправится — или сразу узнаете в чем ошибка, или смотрите в настройки sendmail, т.к. проблема могла появиться из-за смены требований к отправке писем у шлюза (через что идет отправка у самого sendmail). Опять пробовать нужно отправлять на разные хосты.

А вообще, используйте PHPMailer
Ответ написан
alexxxst
@alexxxst
Я бы все-таки From: добавил в заголовки, а не отдельным параметром к sendmail.
Ответ написан
Комментировать
MiXei4
@MiXei4
Простой скрипт <?php mail(....); ?> работает?
Ответ написан
happyproff
@happyproff
Счастливый веб-разработчик
Сделайте var_dump абсолютно всех параметров, которые передаются в sendmail ($this->_recipients и т.д.) и попробуйте запустить из php, затем из консоли mail() точно с такими же параметрами. Если снова словите ошибку, поиграетесь с параметрами и найдёте проблемный. Если отправится, то проверьте от какого пользователя запускается php (var_dump(exec('whoami'))), затем попробуйте отправить именно от него (su username).
Ответ написан
sattvadigit
@sattvadigit
Web developer
Выяснили в чём проблема? Тоже самое происходит на AWS, не могу победить никак =(
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы