Назад | Перейти на главную страницу

Функция php mail () мучительно медленная на локальной машине разработки

Общие сведения: если вы настроили локальный сервер apache для целей разработки, возможно, вы столкнулись с проблемой, когда sendmail требует много времени (не менее одной минуты) для отправки электронных писем. Это очень неприятно, если вы пытаетесь отладить проблему с созданным вами электронным письмом.

В Интернете есть несколько сообщений на форумах, в которых обсуждается эта проблема. Однако ни одна из тем не описывала, что делать, достаточно подробно для моих ограниченных знаний. Вот шаги, которые у меня сработали:

1) найдите свое имя хоста (если вы его забыли) с помощью этой команды:

:~$ cat /hosts/hostname

myhostname

2) отредактируйте файл /etc/hosts и убедитесь, что первая строка следующая:

127.0.0.1 localhost.localdomain localhost myhostname

3) отредактируйте файл конфигурации sendmail ( /etc/mail/sendmail.cf в Ubuntu) и раскомментируйте строку #O HostsFile=/etc/hosts

4) Перезагрузите компьютер. Теперь компьютер должен загружаться намного быстрее, и функция mail () должна возвращаться почти сразу. ОДНАКО электронные письма не будут отправлены, если вы не выполните шаг 5.

5) Вы должны использовать опцию sendmail '-f' всякий раз, когда используете почтовую функцию. Например:

mail('recipient@somewhere.com', 'the subject', 'the message', null, '-fsender@somewhere.com');

Мой вопрос к моим коллегам-сбойникам:

Какие дальнейшие изменения можно внести, чтобы мне не приходилось использовать параметр sendmail -f? Хотя добавить опцию -f не так уж сложно, это проблема, когда ваша CMS (например, Drupal) не использует опцию -f при отправке почты. Вам нужно будет взломать основной модуль, чтобы добавить эту опцию.

Я знаю, что вы спрашиваете не об этом, но почему вы не пробуете Postfix или Exim? Оба они доступны для ubuntu (Postfix - это даже mta по умолчанию в системах Ubuntu), и оба предоставляют совместимую команду sendmail, которая работает очень хорошо. IMHO sendmail устарел, и у вас будет больше шансов получить поддержку с более современным MTA.

Это сработало для меня:

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

См. Инструкции здесь, как это сделать: https://help.ubuntu.com/community/Postfix (Возможно, он уже установлен, и двоичный файл sendmail может быть псевдонимом для postfix)

  • Следуйте инструкциям здесь:

http://lenss.nl/2009/01/making-php-mail-work-on-ubuntu-through-postfix/

mkfifo /var/spool/postfix/public/pickup

Найти sendmail обработать

ps aux | grep mail

Убей это

kill <thepid>

Начать сначала postfix

/etc/init.d/postfix restart

Я думаю, вы можете просто установить параметр myorigin для любого активного доменного имени, такого как доменное имя, которым вы владеете.

Это может быть или не быть решением для вас: добавьте mail.force_extra_parameters = "-fsender@somewhere.com" на ваш php.ini файл. Это заставляет PHP автоматически добавлять -fsender@somewhere.com в качестве пятого параметра функции PHP mail ().

Это жестко запрограммированное значение и применимо только в php.ini, поэтому оно не будет очень гибким, но, возможно, сработает для вас в вашем случае разработки?

Наблюдая за сетевым трафиком (подумайте tcpdump) или запустив strace в ваших процессах sendmail или apache, вы должны иметь представление о Зачем эта задержка существует для того, чтобы вы могли решить основную проблему.

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

Я никогда не сталкивался с проблемой использования mail () в PHP, которая не была бы результатом проблемы с MTA.

В вашем файле php.ini он покажет, какую команду он запускает для отправки электронной почты (по умолчанию: «sendmail -t -i»). Попробуйте отправить электронное письмо из командной строки, используя это - готов поспорить, это медленно.

Обычно нужно проверять, правильно ли настроен DNS-сервер на машине (и может ли он разрешать все адреса, настроенные в MTA), и что, если настроено интеллектуальное реле, имя разрешается в адрес, к которому система может подключиться.