2009-09-14 4 views
3

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

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

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

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

+1

попробуйте спросить на serverfault.com // это не связано строго с программированием, я не думаю, что это не то, от чего вы программируете, что не удается. –

+1

он должен управляться программированием, потому что скрипт не распознает, что sendmail завершен и истекает время. возможно, с некоторым кодом контекстного кода/примера, который мы могли бы помочь в дальнейшем. –

ответ

-1

Если это любая помощь моя sendmail_path выглядит следующим образом:

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

Косвенным решение.

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

что-то вроде этого ...

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

сценарий:

<?php 
... 
system("php sendEmail.php [email protected] 'subject' 'message' 1>/dev/null 2>&1 &"); 
... 
?> 
0

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

1

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

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

0

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

0

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