AmazonLinuxサーバーでMantisBT1.2.6を使用しています。 PHP mail()関数の上に階層化された独自のメール送信クラスがあります。実際には、smtpまたはsendmailを直接使用する他のオプションがありますが、私はPHPメール。次にPHPメールはsendmailを使用します。
スマートホストを使用するようにsendmailを構成しました。これは、mail()関数を介してメッセージを正常に送信するための小さなPHPプログラムを作成できるため、正常に機能していました。
しかし、MantisBTによって送信されたメールは到着せず、返送されませんでした。
/var/log/maillog
スマートホストに正常に送信されているMantiBTメッセージを示しました
(relay=my-smarthost-hostname) with "stat=Sent (ok nnnn qp nnnn)"
/ etc/mail/authinfoファイルを変更して間違ったパスワードを使用すると、maillogにそのリレーの「stat = Serviceunavailable」と表示されました。
したがって、問題はMantiBTコードの微妙なものでなければならなかったようです。 xdebugを使用してmail()に対して行われた呼び出しを見つけ、そのパラメーターの値を取得し、それらを別のphpファイルに抽出して操作しました。 4番目のパラメーターの「From:」に加えていくつかのヘッダーを渡しましたが、RFC(2)821で要求されているように、\ r\nではなく\ nだけで区切られている可能性があるため、問題が発生しました。 。しかし、ヘッダー文字列の\ nを\ r\nに変更するコードを追加しましたが、違いはありませんでした。
結局、問題の原因は(正しい)「Date:」ヘッダーの存在でした。そのヘッダーをmail()の4番目のパラメーターから削除すると、メールはすぐに配信されました。そのため、そのヘッダーを生成しないようにMantisBTソースを編集しましたが、すべて問題ありませんでした(MantisBTソースを編集して、「-f」オプションと送信者アドレスの間にスペースを入れないようにしました)。
したがって、私の質問は、mail()の4番目のパラメーターに「Date:」ヘッダーが存在すると、スマートホストを介した送信で問題が発生することがわかっているかどうかだけです。スマートホストがDateヘッダーを表示したくない場合は、後続のメッセージでメールログにバウンスまたはメッセージが表示されることを期待しませんか?
PSメールログで送信されたokメッセージを確認したとき、実際にはNetwork Solutionsのテクニカルサポートに電話しましたが、それをDateヘッダーに分離する前に。当然、それは何も役に立ちませんでした。POPまたはIMAP用に電子メールクライアントを構成する方法の説明だけです:-)
どうやら私は自分の方法論のペタルによって持ち上げられてきました。
日付ヘッダーによってメッセージが配信されずにスマートホストによって受け入れられた理由は、テストごとにヘッダーのタイムスタンプを変更しなかったためと思われます。そのため、スマートホストは、同じメッセージIDとタイムスタンプを持つ複数のメッセージが着信するのを確認し、重複を配信しませんでした。
動作させる過程で、-fオプションが受信者アドレスとして使用されているエラー(おそらく「-f」と送信者アドレスの間のスペースが原因)やその他の問題が発生しました。したがって、その問題を修正したときに、メッセージが正常に送信された可能性があります。しかし、その後、成功が重複メッセージトラップでスタックしたことを確認しようとします。もちろん、実際には、タイムスタンプがメッセージIDと重複することはありません。これは、mail()に渡されるパラメーターをスタンドアロンの静的テストケースにキャプチャすることによるアーティファクトにすぎません。
とにかく、これですべての設定が完了したと思います。DateヘッダーをMantisBTコードに復元します。
これまでメールの送信をあまりいじったことがなかったので、これは私にとって学習体験でした。そして、おそらくこれは他の誰かに役立つでしょう。送信メールをテストしたい場合、不変のMessageIDヘッダーとDateヘッダーを持つ固定ヘッダーを使用できないことを知ってください!