ローカル開発マシンでphp mail()関数が非常に遅い


21

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

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

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

:~$ cat /hosts/hostname

myhostname

2)ファイル/etc/hostsを編集し、最初の行が次であることを確認します。

127.0.0.1 localhost.localdomain localhost myhostname

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

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

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

mail('recipient@somewhere.com', 'the subject', 'the message', null, '-fsender@somewhere.com');

私の仲間のサーバー障害者に対する私の質問は:

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


1
私のUbuntuシステムでは、コマンドはcat /etc/hostname
zkent 14

回答:


6

これはあなたが求めているものではないことを知っていますが、なぜPostfixやEximを試さないのですか?それらは両方ともubuntuで利用可能であり(PostfixはUbuntuシステムのデフォルトmtaです)、両方とも非常にうまく機能する互換性のある「sendmail」コマンドを提供します。IMHO sendmailは一種の時代遅れであり、最新のMTAでサポートのチャンスが増えます。


sendmailよりも優れたメールシステムがある場合でも、問題は運用サーバーをミラーリングする開発サーバーを維持することです。sendmailは、phpのデフォルトのメールエージェントです。
マイケルB

1
ソフトウェアをsendmailするのか、バイナリをsendmailするのか?EximとPostfixには、sendmail互換性のために、元のsendmailと同じオプションを受け入れるバイナリも含まれているためです。
コアダンプ

私は過去の経験からEximのファンではありませんが、Postfixを試してみて、すぐにSendmailで起こった問題を解決しました!
quickshiftin

2

これは私のために働いた:

  • 後置記号をインストールする

:ここでこれを行う方法について、ここでの説明を参照してください 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時間悩ませた後でした。=)
ハンネスシュナイダー

1

これはあなたのための解決策かもしれませんし、そうでないかもしれません:mail.force_extra_parameters = "-fsender@somewhere.com"あなたのphp.iniファイルに追加してください。これにより、PHP の5番目のパラメーターとしてPHPのmail()関数に-fsender@somewhere.comが自動的に追加れます。

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


0

ネットワークトラフィックを(考えて見てtcpdump)、または実行することによってstrace、あなたのsendmailまたはApacheプロセスに、あなたはのアイデアを得ることができる必要があり、なぜその遅延はあなたが根本的な問題を解決することができるようにそこにあります。

通常、その範囲の遅延はDNSルックアップの失敗によるものですが、見るまでわかりません。根本的な問題を修正しない限り、どのように回避しようとしても問題になる可能性があります。


1
この遅延は、ホスト名がFQDN(完全修飾ドメイン名)ではなく単一の単語であることが原因でした。sendmailが/ etc / hostsを指し、localhost.domainを最初のドメイン名(FQDN)として持つことにより、遅延は発生しません。これは手順1〜4で修正されました。残りの問題は「-f」を使用する必要があることです。メールを送信するのに2分間待たなければならないという点で、依然として大きな改善です。
マイケルB

0

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.