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オプションが無効化されている場合もあるような気がする。どんな場合に使えないのか、それともいつでも絶対使えるのか、それがわからないのだ。

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

PHP4でのコンストラクタの挙動の覚書(2)

2010/04/23 | PHPの基本

PHP4のコンストラクタのメモをもう一つ。継承先のクラスにコンストラクタがなかった場合の挙動。使用するコードは同じもので、継承先のコンストラクタをコメントアウトした。

class hoge
{
function hoge(){print(‘hoge’);}
}
class fuga extends hoge
{
//function fuga(){print(‘fuga’);}
}
$obj=new fuga;

実行結果はこうなる。

hoge

「こういう仕様である」と理解して使えば問題ないのだろうけど、まともな発想に立てば使いにくい。他の言語はどうなのか全く知らないけれど、とまどう人も多いのではなかろうか。

といっても、PHP4はかなり駆逐されてしまっているので、こういう話題もほとんど出てこないだろうけど。

PHP4でのコンストラクタの挙動の覚書

2010/04/21 | PHPの基本

PHPはバージョン5からクラスのコンストラクタを__constructと記述できるようになった。もちろんバージョン4の時と同様に、クラス名と同じ名前のメソッドでもOKだ。PHP4の時のクラスを拡張した際のコンストラクタの挙動について、毎回忘れることがあるのでメモしておく。

class hoge
{
function hoge(){print(‘hoge’);}
}
class fuga extends hoge
{
function fuga(){print(‘fuga’);}
}
$obj=new fuga;

このコードを実行した際にhogeクラスで用意したコンストラクタhoge()は動作しない。実行結果はこうなる。

fuga

parent::__construct()みたいに呼び出すのと同様に$this->hoge()と呼び出す必要がある。

いつも「どうだったっけ」となるのでメモしておく。

phpMyAdminでインポートファイルのサイズを増やす

2009/12/25 | MySQL, PHPの基本

MySQLのダンプデータが60MBほどあった。phpMyAdminでインポートしようと思ったのだが、アップロードできるファイルの最大は16MBとなっていた。60MBのファイルと言っても所詮テキストファイルだから圧縮してしまえば12MBになるから、アップロード自体は出来る。しかしいろいろ考えて、アップロード出来る容量を増やすことにした。

ここのサイズ指定は、単純にphp.iniの設定に依存しているらしい。おそらく.htaccessを設置すれば事足りるだろうが、設置するとInternal Server Errorが表示されてしまう。とりあえずローカルな環境(Windows)で試そうと思っているのだが、なにか問題でもあるのだろうか。

本筋でないことに時間を割くのが嫌なので、php.iniを変更することにした。よくよく考えればおバカな話だが、読み込んでいるphp.iniがどのファイルか分からなくて、何回変更しても、変更した設定が有効にならなかった(正しいファイルを変更していないのだから当たり前)。初心に帰って、phpinfo()で表示されるphp.iniの場所を頼りに設定ファイルを編集した。

Windows版Xamppでは、xampp/apache/bin/php.iniを使用しているらしいことがわかったので、そのファイルを編集した(xampp/php/配下にもphp.iniやphp5.iniがあるので注意が必要)。修正箇所は以下の3つ。

  • memory_limit 512M
  • post_max_size 256M
  • upload_max_filesize 128M

なんとも大盤振る舞いだが、ローカルな環境だから気にしないでいい。php.iniを修正したので、修正後はapacheの再起動が必要。再起動後にphpMyAdminのインポートの項目を見ると「最長: 131kKiB」となっていたkKiBだからMiB、つまり131MiBになった。これで無事一発で処理が完了した。

もし処理が遅い場合はmax_execution_timeの設定を増やしておけば良いかもしれない。

short_open_tag

2009/12/16 | PHPの基本

PHPでプログラムを記述する際は、プログラムの前後を「<?php」「?>」でくくらなければならないのは当たり前中の当たり前。その省略形「<?」「?>」でもOK。後者の記述はPHPの設定でshort_open_tagが有効になっているかどうかによって決定されるが、たいていの場合は有効になっている。

この場合<?=$hoge ?>なんていう省略した記述が出来るので便利といえば便利なのだが、時として厄介や問題を生じさせることがある。

例えば、一昔前はHTMLの記述は<html>で始まるのが当たり前だった。しかし今ではDOCTYPEの宣言やらXML宣言を冒頭に記述することがほぼ常識的となっている。ここでXML宣言が問題となる。XML宣言の記述例は以下のとおりだ。

<?xml version=”1.0″ encoding=”UTF-8″ standalone=”yes”?>

問題はこの宣言もPHPタグの省略形と同様に「<?」「?>」でくくっているからだ。だからこの宣言を記述したHTML文書の拡張子を単に.phpとし、PHPプログラムを記述しようとすると当然のごとくエラーになる。これには注意が必要だ。さらに最近のレンタルサーバの設定ではdisplay_errorsの設定が無効になっているのでエラーも吐いてくれない。だから拡張子を.phpにしたとたん「何も表示されなくなった」という事象も発生する。

この問題を回避するためには、やはりデフォルトの設定としてshort_open_tagを無効にして、PHPは必ず「<?php」「?>」でくくることをオススメする。具体的には.htaccessを作成して(これも最近のレンタルサーバでは当たり前のように使えるようになっている)、そこに次の一行を加えておけばよい。

php_flag short_open_tag off

PHPの次のバージョンあたりで消え去ってほしい記述方法だ。


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