web-dev-qa-db-ja.com

php mail()関数がローカル開発マシンでひどく遅くなる

背景:開発目的でローカルのApacheサーバーを設定している場合、sendmailがメールを送信するのに長い時間(少なくとも1分)かかるという問題が発生している可能性があります。生成した電子メールの問題をデバッグしようとすると、これは非常にイライラします。

この問題については、インターネット上にいくつかのフォーラム投稿があります。しかし、私の限られた知識のために十分に詳細に何をすべきかを説明したテーマはありませんでした。これが私のために働いたステップです:

1)次のコマンドを使用して、ホスト名を見つけます(忘れた場合)。

_:~$ cat /hosts/hostname_

myhostname

2)ファイル_/etc/hosts_を編集し、最初の行が次のようになっていることを確認します。

_127.0.0.1 localhost.localdomain localhost myhostname_

3)sendmail構成ファイル(Ubuntuでは_/etc/mail/sendmail.cf_)を編集し、行_#O HostsFile=/etc/hosts_のコメントを外します

4)コンピュータを再起動します。これでコンピュータの起動がはるかに速くなり、mail()関数がほぼすぐに戻るはずです。ただし、ステップ5を実行しない限り、メールは実際には送信されません。

5)メール機能を使用する場合は、必ずsendmailの「-f」オプションを使用する必要があります。例えば:

mail('[email protected]', 'the subject', 'the message', null, '[email protected]');

仲間のサーバー障害者への私の質問は:

Sendmail -fオプションを使用する必要がないように、さらに変更を加えることができますか? -fオプションを追加することはそれほど難しくありませんが、CMS(Drupalなど)がメールの送信時に-fオプションを使用しない場合は問題になります。このオプションを追加するには、コアモジュールをハックする必要があります。

21
Michael B

これは私のために働きました:

  • Postfixをインストールする

これを行う方法については、こちらの手順を参照してください: https://help.ubuntu.com/community/Postfix (すでにインストールされている可能性があり、 「sendmail」バイナリは実際にはpostfixのエイリアスである場合があります)

  • ここの指示に従ってください:

http://lenss.nl/2009/01/making-php-mail-work-on-ubuntu-through-postfix/

mkfifo /var/spool/postfix/public/pickup

sendmailプロセスを見つける

ps aux | grep mail

それを殺します

kill <thepid>

再起動postfix

/etc/init.d/postfix restart

'myorigin'パラメータを、所有しているドメイン名などのアクティブなドメイン名に設定するだけでよいと思います。

2
Michael B

これはあなたが求めていることではないことを知っていますが、なぜPostfixやEximを試さないのですか?どちらもubuntuで利用でき(PostfixはUbuntuシステムのデフォルトのmtaでもあります)、どちらも非常にうまく機能する互換性のある「sendmail」コマンドを提供します。 IMHO sendmailは日付が付けられており、より近代的なMTAでサポートされる可能性が高くなります。

6
coredump

これは解決策かもしれませんし、そうでないかもしれません。追加mail.force_extra_parameters = "[email protected]"php.iniファイルに。これは、PHP自動的に[email protected]をPHPのmail()関数の5番目のパラメータとして追加します)にします。

これはハードコードされた値であり、php.iniにのみ適用できるため、あまり柔軟ではありませんが、開発ケースではおそらく機能しますか?

1

PHP)でmail()を使用して問題に遭遇したことはありません。これはMTAの問題の結果ではありませんでした。

Php.iniファイルには、メールを送信するために実行するコマンドが表示されます(デフォルト: "sendmail -t -i")。これを使用してコマンドラインからメールを送信してみてください-遅いと思います。

チェックする通常のことは、マシン上でDNSサーバーが正しく構成されているかどうか(そしてMTAで構成されているすべてのアドレスを解決できるかどうか)、およびスマートリレーが構成されている場合、名前がシステムが接続できるアドレスに解決できることです。

0
symcbean

ネットワークトラフィックを監視する(tcpdumpと考える)か、sendmailプロセスまたはApacheプロセスでstraceを実行することにより、なぜ遅延が発生するかを理解できるはずです。根本的な問題を修正できるようにあります。

通常、この範囲の遅延はDNSルックアップの失敗が原因ですが、見ない限りわかりません。根本的な問題を修正しない限り、どうやってそれを回避しようとしても、それはおそらく問題になるでしょう。

0
tylerl