管理しているサイトで、携帯からの写真の投稿や空メールを受信しての登録などで、PHPでメールを受信する必要があったので、そのスクリプトを書いたことがあった。最初はよくわからなかったのでネットをあちこち探しながら調べながらプログラミングしたのだが、備忘録として載せておくことにする。
function mail_receive($user, $pwd)
{
$host = "xxx.xxx.xxx.xxx";
$port = 110;


$fp = fsockopen($host, $port);


// ログイン
$line = fgets($fp, 512);
fputs($fp, "USER $user\r\n"); // USER名
$line = fgets($fp, 512);
fputs($fp, "PASS $pwd\r\n"); // パスワード
$line = fgets($fp, 512);
if( !eregi("OK", $line) ) // ログイン失敗?
{
fclose($fp);
return false;
}


// メールボックス内のデータを取得
fputs($fp, "STAT\r\n");
$line = fgets($fp, 512);
list($stat, $num, $size) = explode(' ', $line);
if( 0+$num == 0 ) // データがない?
{
fclose($fp);
return false;
}


// それぞれ受信して、配列に納める
for($id=1;$id<=$num;$id++)
{
fputs($fp, "RETR $id\r\n");
$line = fgets($fp);


$msg[$id] = "";
while( !eregi("^\.\r?\n", $line) )
{
$line = fgets($fp, 512);
$msg[$id] .= $line;
}


fputs($fp, "DELE $id\r\n");
$line = fgets($fp, 512);
}


fputs($fp, "QUIT\r\n");
fclose($fp);


return $msg;
}


アカウント名とパスワードを指定して呼び出すと、メールを受信して、配列に受信テキストを納めて返すという関数だ。
$host と $port は固定にしてあるが、汎用的にするなら引数にしてもかまわない。これはそのサイトではどのアカウントであってもメールサーバーが変わらないので、そうしてあるだけなので。メールサーバーによっては途中のコマンドとか多少変更する必要などがあるかもしれない。また手抜きして受信途中でエラーとかタイムアウトとかの処理を入れていないのでご注意。