Return-Pathってなんだろう

2010/06/25 | PHPの基本

組み込みのmail関数でReturn-Pathを設定できるということを知らなかったのでメモ。というよりも仕組みを理解していなかったのでメモ。

まずReturn-Pathというヘッダの意味を理解しないといけない。メールソフト等でメールを受信したら生データを確認してみる。そうすると、Return-Pathというヘッダがどこに記述されているかわかるのだが、必ずReturn-Pathヘッダの下にReceivedヘッダの記述があるはずだ。Recivedヘッダは、メールを受信したサーバが順々に付与していくことになるので、複数のメールサーバを経由した場合は、複数のReceivedヘッダがついているはずだ。

Receivedヘッダの記述を見るとわかるが、メール生データの上ほど新しい日時になっているはずだ。つまりメールサーバは、メールを受信するとメール生データの先頭にReceivedヘッダをつけて、次のメールサーバへリレーするようになっている。つまりこれから考えると、Return-PathヘッダはReceivedヘッダが付いた後に付加されたことになる。すなわち、メール作成時にいくらReturn-Pathヘッダ等を指定しても、メールには付与されない。Return-Pathはそもそもサーバが付与するヘッダだからだ。

ではサーバは何を判断して、Return-Pathを設定するのか。

まず根本的なことから考えなくてはいけない。メールには通常作成時にヘッダが付与される。Fromが差出人で、Toが宛先だということは半ば常識的になっている。が、実は本当はそうではない(らしい)。Fromについては御存知の通りで偽装ができるのは有名だ。スパムメールなんてのはFromはたいてい偽装だからだ。しかしToも偽装できる。これがエンベロープアドレスというものだ。

telnetで接続してメールを送信することを考える。この場合、まず差出人と宛先を指定する。しかしこの状態でヘッダを何も指定しないと、subjectもFromもToもないメールが実際に送信される。そもそもメールのヘッダに記載されているFromやToと、実際の差出人や宛先は別個のものなのだ(後者がエンベロープアドレス)。

エンベロープとはすなわち封筒だ。封筒には差出人と宛先の住所を書くだろう。しかし中に各手紙にも「〇〇さんへ」「△△より」と書くだろう。前者がエンベロープアドレス(実際の差出人と宛先)で、後者がメールヘッダだ。

そこでmail関数を考える。引数は5つ。最初の引数は宛先だが、ここは宛先なのだがToヘッダとエンベロープの宛先を兼ねていると考えればよい。2つ目と3つ目のヘッダはタイトルと本文なので説明は省略。

4つ目の引数を考える。ここでヘッダを追加することができるわけだ。Fromを指定することはよくあるだろう。ここで指定するのはメールヘッダのFromだ。ではここにToを指定するとどうなるだろうか。最初の引数で指定する宛先をA、第4引数でToヘッダでBを指定する。どちらのアドレスにもメールは届くのだが、メールを見るとToヘッダが二つ付与されているはずだ(本来は一つのはずなのだが)。

で、第5引数。ここではメール送信プログラムにコマンドラインオプションを渡すことができるのだが、ここでエンベロープの差出人を指定することができる。-fオプションとメールアドレスを指定すればよい。

で、次の問題。この設定はセーフモードが有効になっているPHPでは使えない(第5引数が使えなくなる)。

そして個人的には「どんな設定でも有効になるのかどうか」確たる証拠がない。なんとなくPHPの設定やメールサーバの設定等によっては-fオプションが無効化されている場合もあるような気がする。どんな場合に使えないのか、それともいつでも絶対使えるのか、それがわからないのだ。

以前も同じような記事を書いたが、近頃いろいろ知恵が付いてきたので、それらをからめてメモしておくことにした。

8ビットの文字をメールで送信するとき

あまり文字のことで悩みたくないが、中国語のメール送信プログラムを書いたときのメモ。

タイトル等ヘッダに関する部分は英語記述で対応することにした。マルチバイトな文字が関係しなければ悩む必要なし。

中国語だと本文は当然漢字になる。日本語みたいにISO-2022-JPに変換しちゃえばいい、という具合でもなさそう。結局こんな具合で送信することにした。

  • 本文($body)はUTF-8とする
  • このままだと8bitでメールを送る可能性があるのでimap_8bit関数で変換した。
    $body=imap_8bit($body);
    ただしimap_8bit関数はIMAPモジュールが必要になる(PHP4以上で使える)。
    PHP5.3以上ならquoted_printable_decode関数のほうがいいかも。

メールヘッダも小細工が必要で、以下のヘッダを付与した。

  • MIME-Version: 1.0
  • Content-Type: text/plain; charset=utf-8
  • Content-Transfer-Encoding: quoted-printable

MIME-Versionは必要ないかもしれない。だけど参考にしたメールソフトではついていたので、とりあえずつけておいた。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net