サーバーがUNIXやLinuxなどの場合は可能なら適切な第5引数を付加するべきです

Envelope Fromに気をつけろ!!

Envelope Fromって何じゃらほい?

Envelope FromはいわゆるヘッダーFromとは意味が異なり,SMTPレベルできっちり評価される(はず)の送信もと情報です.
Envelope Fromについての説明は面倒なので割愛(詳細を知りたい方はそもそもSMTPを勉強してください)しますが,それの設定はいろんな書籍や情報サイトでぞんざいにされがちです.
しかし昨今一番大きな影響としてはspamかどうかの評価にも利用されることが多いことを認識すべきです.ようするにこれを適当に扱っていると「このメールはspamかも!!」って評価される可能性が高くなるということです.

また,エラーメールは通常Envelope Fromに戻るので,大量メール配信のソフトウェアの開発時には積極的に送信メール認識に利用されていますね.

っで,IDEA*IDEAの何をどう指摘したのか

// TO:アドレスの取得 if (preg_match ('/[\n\r]To:.*([a-f0-9]{32})'.’@checkpad.jp'.'/', $email, $matches)) { $to_address = $matches[1]; } else { mail ("me@mail.com", "Failed to capture mail", $email, "From: me@mail.com"); exit; }

この実装だとEnvelope Fromが「anonymous@example.com」とかになる可能性があります.
ウェブサーバーから同様な処理でメールを送ると「apache@example.com」とか「nobody@example.com」になる場合も多いですね.
これらを回避するには手っ取り早いところではmail()第5引数で適切に設定をするべきです.

$sender = 'sender@example.com';
mail('to@example.com', 'subject', 'body', 'From: '.$sender, '-f'.$sender);

あわせて-fに渡すメールアドレスはフォームなどの値をそのまま渡したり信頼できない値を渡さないように注意することが必要しまほう.

さらに注意点としてはPHPの設定次第では第5引数の設定ができません.このときは下記のいずれかの選択肢を選ぶことをお勧めします.

  • 単純に第5引数を指定できないことを諦める
  • php.iniでmail.force_extra_parametersを指定する(htaccessでもできるんだっけ?)
  • mail(),mb_sendmail()の使用を諦め,PEAR::Mailなどを使用する

ちなみにWindowsの場合は第4引数をPHP自体が解析し,Fromフィールドの値をEnvelope Fromとして使用します.

どうやって確認するん?

テストコードを作成してコードの評価をして〜ってのが王道だと思いますが,手っ取り早いところだとmaillogが見れるならmaillogを見るのが手っ取り早いかもしれません.
maillogのto=とかfrom=とかはEnvelope TO,Envelop Fromなので,意図した値になっているか確認すればいいでしょう.

#流量が多いとgrepとか何かを併用しないと面倒くさかったりしますけど

あとは届いたメールのメールヘッダーを確認するという方法があります.
通常Envelope Fromは受け手のメールサーバーがReturn-Pathというかたちでメールヘッダーにそれを記録します.よってこれを確認するのもいいと思います.
ただし明示的にメールヘッダーにReturn-Pathを書いているメールメッセージに対してEnvelope Fromを上書きしないメールサーバーがあるようなのでこの確認方法を用いる場合は念頭に入れておいてください.

#8年位前にこういう実装をして怒られたことがある(苦笑

細かいつっこみ

あと細かいですが,

なお、unknown mailer errorとか出たらPHPにバグがある可能性大です。
ウォッチポイントを設定してログを吐き出したりしつつ、ちゃんとデバッグしましょうね。

細かいですけどPHPのバグじゃなくてPHPスクリプトのバグですよね?
PHP(自体)のバグだと普通の人調査ほぼ不可能ですよね(苦笑

関連情報

昔作成したmail()内の解析情報です.
mail()などの公式マニュアルです.わからなくてもある程度最後まで読んでおくことをお勧めいたします
mb_sendmail()の公式マニュアルです.mb_sendmail()は何気にmail()のラッパー関数かと思われがちですが,そうではないので問題発生時はそれを意識して調査するといいでしょう.