2017-08-24 6 views
0

PHP 7.0では最新のPHPMailer 5.2.24(問題は以前のバージョンと同じです)を使用しています。PHPmailer交換する - 30秒後に "DATA ENDコマンドが失敗しました"(ただしタイムアウトはありません)

Exchange 2016でSMTP経由でメールを送信します。メールの約95%は期待どおりに機能しますが、Exchangeから最終DATA ENDコマンドまで250回の応答が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; 

低レベルのログの例:(私は関数fgets()がfalseを返すことを示すとstream_get_meta_dataを表示するclass.smtp.phpの)(GET_LINES内部2つのカスタムデバッグ出力を追加())

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: 

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 

だから何でし

:他のケースでは

応答で速く30代よりも、それは次のようになります。

は、ストリームのタイムアウトではなく、PHPランタイムのタイムアウトではなく、正確に30秒(実行後30秒後、スクリプトの開始以降ではない)に失敗します。 (ここに例外は投げられません、私はこれを確認するために元のPHPMailerコードのfgets()を削除しました)

スクリプトはmax_execution_timeなしで実行されています。

私のExchange管理者は、これを引き起こす原因は何もわからないし、ストリームがどこで壊れているか知っていないとしても、まずはポイントがありません。

その他のアイデア他に何が確認できるのですか、これを引き起こす原因は何ですか?

+0

おそらくPHPのバグです。 https://github.com/PHPMailer/PHPMailer/issues/604を参照してください。 – Synchro

+0

私の問題は、リンクされたバグの反対によく似ています - 私の問題は、タイムアウトが機能していないということではありません(動作しています。それは30秒の制限の前にタイムアウトに走った)。私の問題は、ストリームが何とか30秒後に途切れて、300秒のタイムアウトまで開いていないということです。 – SunDawn

答えて

0

PHPインストールのmax_execution_timeだと思いますが、デフォルトでは30秒に設定されていますが、これはコード内で唯一時間がかかるため、ここでは常に失敗します。

php.iniでそれを増やしてみるか、あらかじめset_time_limit()に電話してみてください。

+0

私はそれが実行時ではないと言いました。その時点で私のスクリプトは正常終了しています.crontabで実行時間制限なしで実行しています。 fgets()は30秒後に失敗します。この時点でスクリプト全体がすでに31秒以上実行されている可能性があります。 – SunDawn

+0

OK - これを試して、それが興味深いものと一致するかどうか確認してください: 'php -i | grep 30'を実行します。 – Synchro

+0

何もない - 3306のmysqli.defaultポートの外に:) – SunDawn

関連する問題