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

21

Исходная информация: Если вы настроили локальный сервер 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) Каждый раз, когда вы используете функцию mail, вы должны использовать опцию sendmail '-f'. Например:

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

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

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

Майкл Б
источник
1
в моей системе Ubuntu командаcat /etc/hostname
zkent

Ответы:

6

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

CoreDump
источник
Даже если почтовые системы лучше, чем sendmail, проблема заключается в том, чтобы обслуживать сервер разработки, который отражает рабочий сервер. sendmail - почтовый агент по умолчанию для php.
Майкл Б
1
Вы имеете в виду sendmail софт или sendmail бинарный? Потому что exim и Postfix также имеют sendmailдвоичный файл, который принимает те же параметры, что и исходный sendmail, для обеспечения совместимости.
coredump
Я не большой поклонник Exim из прошлого опыта, но дал Postfix попытку и сразу решил проблемы, с которыми мы сталкиваемся в Sendmail!
quickshiftin
2

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

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

Смотрите здесь инструкции о том, как это сделать: 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' для любого активного доменного имени, такого как ваше доменное имя.

Майкл Б
источник
Отлично! Сделал это ПОСЛЕ того, как меня мучили два часа. =)
Ханнес Шнайдермайер
1

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

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

Янне Пиккарайнен
источник
0

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

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

tylerl
источник
1
Задержка была вызвана тем, что имя хоста было одним словом, а не полным доменным именем (полное доменное имя). Указав sendmail в / etc / hosts и указав localhost.domain в качестве первого доменного имени (которое является полным доменным именем), задержки не происходит. Это было исправлено в шагах 1-4. Остается проблема с использованием '-f' - все еще значительное улучшение в том, что нужно ждать 2 минуты для отправки почты.
Майкл Б
0

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

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

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

symcbean
источник