最近は携帯サイトなどで、特定のメールアドレスにメールを送信するとそのサイトの日記として、登録されるようなものをよく見かけます。今回はPEAR::MailのmimeDecode.phpを使用して、送信されてきたメールのタイトル、本文、添付ファイル(画像)を取得する方法をご紹介します。
まずは、今回のTipsではメールの詳細な設定(postfix,qmailのエイリアス設定など)は省略させていただきます。
エイリアス例を基に説明させていただきます。
例: diary: "|/usr/local/bin/php /***/****/diary.php"
上記では「diary@***.jp」のようなメールアドレスにメールを送信すると、「/***/****/diary.php」を実行するような設定になっています。
実装内容について
- 1. stdinでメールの内容を読み込みます。
- 2. 読み込んだ内容をPEAR::MailのmimeDecodeでメールの内容を分解します。
- 3. 分解した内容からタイトル、本文、添付ファイルを取り出します。
下記が実装例のスクリプトになります。
<?php
require_once 'Mail/mimeDecode.php';
// メールデータ取得
$params['include_bodies'] = true;
$params['decode_bodies'] = true;
$params['decode_headers'] = true;
$params['input'] = file_get_contents("php://stdin");
$params['crlf'] = "\r\n";
$structure = Mail_mimeDecode::decode($params);
//送信者のメールアドレスを抽出
$mail = $structure->headers['from'];
$mail = addslashes($mail);
$mail = str_replace('"','',$mail);
//署名付きの場合の処理を追加
preg_match("/<.*>/",$mail,$str);
if($str[0]!=""){
$str=substr($str[0],1,strlen($str[0])-2);
$mail = $str;
}
/*
*「$structure->headers['to']」で送信元のメールアドレスも取得できます。
*/
// 件名を取得
$diary_subject = $structure->headers['subject'];
switch(strtolower($structure->ctype_primary)){
case "text": // シングルパート(テキストのみ)
$diary_body = $structure->body;
break;
case "multipart": // マルチパート(画像付き)
foreach($structure->parts as $part){
switch(strtolower($part->ctype_primary)){
case "text": // テキスト
$diary_body = $part->body;
break;
case "image": // 画像
//画像の拡張子を取得する(小文字に変換
$type = strtolower($part->ctype_secondary);
//JPEGチェック(GIFやPNG形式の画像チェックなども可
if($type != "jpeg" and $type != "jpg"){
continue;
}
//添付内容をファイルに保存
$fp = fopen("/tmp/picture.jpg" . $type,"w" );
$length = strlen( $part->body );
fwrite( $fp, $part->body, $length );
fclose( $fp );
break;
}
}
break;
default:
$diary_body = "";
}
/*
* 取得したメールアドレス、タイトル、本文、画像を使用してデータベースなどに取り込む
*/
?>
上記のスクリプトで格納されていている変数の説明をします。
- $diary_subjectにはメールのタイトルが格納されています。
- $diary_bodyにはメール本文が格納されています。
- 「/tmp/picture.jpg」には添付した画像が保存されます。
上記の内容に加えて、Fromのメールアドレスからユーザ情報と結びつけることができます。これで特定のメールアドレスにメールを送信するだけで、日記としてデータベースなどに登録することができますね。
ここでは日記として説明しましたが、携帯ではPCのように<input type="file">を対応している機種が少ないので、携帯からの画像UPLOADの用途として使用することもできます。
このようにメールと組み合わせることによって、いろいろな用途で使うことができると思います。
この記事は、アシアルが運営するPHP開発者のためのポータル&コミュニティサイト「PHPプロ!」で毎週配信しているPHP・TIPSメーリングリストを再録したものです。
同サイトでは、他にもPHP最新ニュースや、困ったときのQ&A掲示板、初心者向けのPHP講座など、PHP開発者をサポートする情報を掲載しています。