PHPプロ!TIPS+

stdinからのメール処理でメール情報を取得する

最近は携帯サイトなどで、特定のメールアドレスにメールを送信するとそのサイトの日記として、登録されるようなものをよく見かけます。
今回はPEAR::MailのmimeDecode.phpを使用して、送信されてきたメールのタイトル、本文、添付ファイル(画像)を取得する方法をご紹介します。

まずは、今回のTipsではメールの詳細な設定(postfix,qmailのエイリアス設定など)は省略させていただきます。

エイリアス例を基に説明させていただきます。

例:
diary:      "|/usr/local/bin/php /***/****/diary.php"

上記では「diary@***.jp」のようなメールアドレスにメールを送信すると、 「/***/****/diary.php」を実行するような設定になっています。

実装内容について

  1. 1. stdinでメールの内容を読み込みます。
  2. 2. 読み込んだ内容をPEAR::MailのmimeDecodeでメールの内容を分解します。
  3. 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の用途として使用することもできます。

このようにメールと組み合わせることによって、いろいろな用途で使うことができると思います。

バックナンバーについて

TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。

Tipsꗗy[W 

Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)