PHPmailer smtp для обмена - "Команда DATA END завершилась неудачно" через 30 секунд (но без таймаута)

Я использую последнюю версию PHPMailer 5.2.24 (проблема та же, что и в старых версиях) на PHP 7.0.

Отправка писем через SMTP с Exchange 2016. Около 95% писем работает, как и ожидалось, но всякий раз, когда ответ 250 от Exchange на последнюю команду DATA END длится дольше, чем 30 секунд, поток прерывается.

Время ожидания в PHPMailer установлено равным 300, и в журналах я могу подтвердить, что время ожидания здесь не является проблемой.

На самом деле, все письма успешно отправлены, насколько я могу судить (я подтвердил это примерно в 30 из 30 случаев).

$this->mailer->isSMTP();
$this->mailer->Timeout = 300;
$this->mailer->Host = 'mail.myhost.com';
$this->mailer->SMTPAuth = true;
$this->mailer->Username = 'Domain\\Username';
$this->mailer->Password = '*****';
$this->mailer->SMTPSecure = 'tls';
$this->mailer->Port = 587;

Пример низкоуровневого журнала: (я добавил 2 пользовательских вывода отладки внутри get_lines() class.smtp.php, чтобы показать, что fgets() возвращает false, и показать stream_get_meta_data())

2017-08-23 13:46:05 Level 1; message: CLIENT -> SERVER: .

2017-08-23 13:46:35 Level 4; message: SMTP -> get_lines(): $data is ""
2017-08-23 13:46:35 Level 4; message: SMTP -> get_lines(): $str === false 
2017-08-23 13:46:35 Level 4; message: SMTP -> [timed_out => false, blocked => 1, eof => 1, stream_type => tcp_socket/ssl, mode => r+, unread_bytes => 0, seekable => false]
2017-08-23 13:46:35 Level 2; message: SERVER -> CLIENT: 
2017-08-23 13:46:35 Level 1; message: SMTP ERROR: DATA END command failed: 

В других случаях с ответом быстрее 30 с это выглядело бы так:

2017-08-23 23:25:02 Level 1; message: CLIENT -> SERVER: .
2017-08-23 23:25:28 Level 4; message: SMTP -> get_lines(): $data is ""
2017-08-23 23:25:28 Level 4; message: SMTP -> get_lines(): $str is  "250 2.6.0 <...> [InternalId=10677288697896, Hostname=myhost] 32443 bytes in 26.353, 1,202 KB/sec Queued mail for delivery"
2017-08-23 23:25:28 Level 2; message: SERVER -> CLIENT: 250 2.6.0 <...> [InternalId=10677288697896, Hostname=myhost] 32443 bytes in 26.353, 1,202 KB/sec Queued mail for delivery
2017-08-23 23:25:28 Level 1; message: CLIENT -> SERVER: QUIT 

Так что же можно

$str = fgets($this->smtp_conn, 515);

причина сбоя ровно через 30 секунд (30 секунд после его выполнения, а не с момента запуска скрипта), когда это не тайм-аут потока и не тайм-аут выполнения php. (Здесь не выдается никаких исключений, я удалил @ из fgets() в исходном коде PHPMailer, чтобы подтвердить это)

Скрипт работает без max_execution_time.

Мой администратор Exchange не знает, что может вызвать это, и у меня нет смысла начинать с того, что я даже не знаю, где прерывается поток - PHP, веб-сервер, Exchange, где-то между?

Любые идеи, что еще я мог проверить или что может быть причиной этого?

1 ответ

Я предполагаю, что это max_execution_time вашей установки PHP, которая по умолчанию равна 30 секундам, и здесь всегда происходит сбой, потому что это единственная вещь в вашем коде, которая занимает столько времени.

Попробуйте увеличить его в своем php.ini или позвонив set_time_limit() заранее.

Другие вопросы по тегам