Задержка при использовании функции mail mail () для отправки электронной почты через Exchange (использование sendmail в качестве ретранслятора) - PullRequest
3 голосов
/ 14 сентября 2009

Я использую функцию PHP mail () для отправки электронной почты с сервера Linux, но использую Exchange в качестве основного MTA. Для этого sendmail был настроен так, чтобы передавать все на локальный сервер Exchange, который затем отправляет электронные письма.

Это работает правильно, но PHP-скрипт, похоже, ожидает окончания времени ожидания до окончания. Я подумал, что, возможно, он ждет ответа от sendmail, который не приходит, становится просто ретранслятором?

Я указал параметр командной строки php.ini для «sendmail_path» -odb, который должен запускать sendmail с «фоновым» режимом доставки, что означает отключение электронной почты в отдельном процессе, а затем немедленный возврат. Но для завершения сценария PHP все равно требуется 30 секунд.

У кого-нибудь есть идеи? Я немного озадачен. Спасибо.

Ответы [ 6 ]

2 голосов
/ 10 ноября 2009

косвенное решение.

Что мы делаем, это используем систему php system () для отправки электронных писем в фоновом режиме, чтобы пользователю не приходилось ждать выхода электронного письма.

как то так ...

<?php //sendEmail.php
mail($argv[1], $argv[2], $argv[3]);
?>

ваш скрипт:

<?php
...
system("php sendEmail.php to@address.com 'subject' 'message' 1>/dev/null 2>&1 &");
...
?>
1 голос
/ 22 августа 2011

-odb устарело (sendmail версии 8.7 и выше). 1
Попробуйте использовать -ODeliveryMode=b (для командной строки sendmail или для параметра sendmail_path)
Или добавьте O DeliveryMode=b в дополнительные параметры функции PHP mail. 2 1009 *
*

1 голос
/ 10 ноября 2009

Многое не могу сказать, не заглядывая в логи php / mail. Но почему вы не отправляете из PHP напрямую на ваш MTA? просто используйте библиотеку типа PHPMailer , и аутентификация будет простой.

Также для целей отладки вы можете установить postfix (в linux с менеджером пакетов это занимает 3 секунды) и установить его в качестве ретранслятора, журналы Postfix довольно обширны в подробном режиме, и вы можете обнаружить, было ли узкое место sendmail.

0 голосов
/ 27 сентября 2014

У меня был похожий вопрос . В моем случае команда инфраструктуры фактически добавила 30-секундную искусственную задержку. Я думаю, что на самом деле это больше похоже на настройку для ожидания подтверждения того, что электронное письмо действительно отправлено, что по умолчанию ожидает 30 секунд, чем кто-то явно устанавливает 30-секундную задержку произвольно. В любом случае, звучит так, будто вы в одной лодке. Узнайте, кто управляет сервером Exchange, расскажите им, что происходит, и посмотрите, смогут ли они определить настройки. В моем случае мне приходилось регистрировать, что происходило с Wireshark, прежде чем я убедил команду, что на самом деле есть проблема с Exchange, а не с моим приложением.

0 голосов
/ 10 ноября 2009

Альтернативой может быть использование PEAR Mail . Я использовал его для отправки писем на серверы qmail и SMTP.

0 голосов
/ 29 сентября 2009

Если это поможет, мой sendmail_path выглядит так:

sendmail_path = /usr/sbin/sendmail -t -i
...