3

PHP の mail() 関数を使用して Linux サーバーから電子メールを送信していますが、Exchange をメインの MTA として使用しています。これを実現するために、sendmail はすべてをローカルの Exchange サーバーに中継するように設定されており、そこから電子メールが送信されます。

これは正しく機能していますが、PHP スクリプトは終了する前にタイムアウト制限まで待機しているようです。sendmail からの応答を待っているのかと思ったのですが、それが来ないのはただの中継になるのでしょうか?

「sendmail_path」-odb に php.ini コマンド ライン オプションを指定しました。これは、sendmail を「バックグラウンド」配信モードで開始する必要があります。つまり、別のプロセスで電子メールを送信してからすぐに戻ることを意味します。ただし、PHP スクリプトが終了するまでにはまだ 30 秒かかります。

誰にもアイデアはありますか?私は少し困惑しています。ありがとう。

4

6 に答える 6

2

間接的な解決策。

私たちがしているのは、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 &");
...
?>
于 2009-11-09T23:06:07.140 に答える
1

-odb非推奨になりました(sendmailバージョン8.7以降)。1(sendmailコマンドラインまたはsendmail_path設定に)を使用するか、PHP関数の追加パラメーターを 追加すること
を検討してください。2-ODeliveryMode=b
O DeliveryMode=bmail

于 2011-08-22T13:04:50.777 に答える
1

php/mailログを見ずに多くを言うことはできません。しかし、PHPから選択したMTAに直接送信してみませんか?PHPMailerのようなライブラリを使用するだけで、認証が簡単になります。

また、デバッグの目的で、postfixをインストールして(Linuxではパッケージマネージャーを使用して3秒かかります)、リレーとして設定できます。Postfixログは冗長モードでかなり広範囲に渡り、sendmailがボトルネックであるかどうかを検出できます。

于 2009-11-09T23:28:26.790 に答える
0

別の方法として、PEARのメールを使用することもできます。qmailおよびExchangeSMTPサーバーに電子メールを送信するために使用しました。

于 2009-11-09T23:17:47.367 に答える
0

同様の質問がありました。私の場合、インフラストラクチャ チームは実際に 30 秒の人為的な遅延を追加していました。誰かが恣意的に30秒の遅延を明示的に設定するよりも、デフォルトで30秒待機するメールが実際に送信されたことの確認を待つ設定に似ていると思います。とにかく、あなたは同じ船に乗っているように聞こえます。Exchange サーバーの管理者に確認し、何が起こっているかを伝えて、設定を見つけられるかどうかを確認してください。私の場合、実際に問題が発生したのは Exchange であり、私のアプリケーションではないことをチームに納得させる前に、実際に Wireshark で何が起こっているかをログに記録する必要がありました。

于 2014-09-26T20:07:35.230 に答える
-1

それが助けになるなら、私のsendmail_pathは次のようになります:

sendmail_path = /usr/sbin/sendmail -t -i
于 2009-09-29T09:13:58.740 に答える