Материал из ISPWiki
Настройка почтового сервера sendmail (решение проблемы с отправкой почты из скриптов)
В некоторых случаях бывает, что почтовый сервер Sendmail не отправляет почту, возвращая ошибку:
Также в логах может быть ошибка вида:
Проблема, как правило, вызвана несуществующим hostname сервера, либо несуществующим почтовым адресом при отправке.
В таких случаях необходимо указать существующий почтовый адрес. В ISPmanager его можно прописать в свойствах WWW домена в поле "E-Mail администратора".
При указании адреса в конфигурации веб-сервера Apache в описании виртуального хоста:
Если используется PHP в режиме как CGI или как FastCGI, запись прописывается в файле
Отключение проверки корректности адреса отправителя при отправке почты
Sendmail по умолчанию запускается с Message Submission Program (MSP). Это отдельный процесс для обработки почтовой очереди.
Рассмотрим его отключение в системе FreeBSD
Появилась на продакшен сервере вот такая ошибка
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
Чтобы отловить ошибку пробовал ловить 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
Ума не приложу в какую сторону копнуть ещё или как получить больше информации об ошибке.
Иногда бывает, что при отправке письма, через sendmail(почтовый сервер), письмо возвращается с ошибкой:
Apr 15 19:15:31 myhost sendmail[5806]: mATM4O8w58095806: Losing ./qfmATM4O8w58095806: savemail panic
Apr 15 19:15:45 myhost sendmail[5806]: mATM4O8w58095806: SYSERR(www): savemail: cannot save rejected email anywhere
При этом в логах периодически появляется:
stat=Data format error
Данная проблема обычно появляется, из-за несуществующего почтового адреса при отправке, либо несуществующего сервера hostname.
Для решения проблемы необходимо указывать правильный email. Его можно прописать в панели ISPmanager во вкладке свойств WWW в поле Email администратора.
Данный email также необходимо прописать в конфигурациях apache при описании виртуального хоста:
При использовании PHP в режимах FastCGI или CGI данная строка вносится в файл
Как отключить проверку правильности email отправителя, когда отправляет email
Sendmail запускается, по умолчанию, с MSP (Message Submission Program). Данный процесс запускается отдельно, чтобы обрабатывать почтовую очередь.
Рассмотрим пример отключения Sendmail в системе FreeBSD