メール投稿した画像をサーバに保存する方法

※この記事は,ウェブアプリ(プログラミング)に関するページです

興味のある方のみ御覧ください。

iPhone(iPod touch)のSafariでは

アップロードフォームが無効化されています。

iphoneから,自分のレンタルサーバの,指定するディレクトリへ

ファイル名を指定してアップロードすることは困難です。

(800円出すならば,FTP On The Goで片付ける手もあります)

また,メールし放題のプランに入っている不肖の身として

携帯からのアップロードは,写メですれば無料ということもあり

メールから自レンタルサーバに画像をアップロードする

PHPスクリプトを書くことにしました。

動作確認はXREAサーバ(PHP 5.25,Apache 1.3.37)で

セーフモードでの実行で確認しています。

必要要件は,PEARのNet_POP3Mail_MimeDecodeがインストールされていること。

PHP4.3以上ぐらいであれば動作すると思うのですが

確認環境がないこともあり,保証はしません。

スクリプトのダウンロードはここから

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<?php
//データの保存ディレクトリ(最後に必ず「/」を入れる)
//あと適切なパーミションを与えておく。
$dir='/***/public_html/pictures/';

//gmailのアカウント情報
$gmail_name='あなたのアカウント名@gmail.com';
$gmail_pwd='gmailのパスワード';
 
//     ↑設定ここまで↑

//PEARの読み込み
require_once 'Net/POP3.php';
require_once 'Mail/mimeDecode.php';

$pop3=&new Net_POP3();
//gmailに接続
if($pop3->connect('ssl://pop.gmail.com',995)){
  //gmailへのログイン処理
  if($pop3->login($gmail_name,$gmail_pwd)){
    //未読メールリストの取得
    $list=$pop3->getListing();
   
    //未読メールを一件ずつ処理
    for($i=0;$i<count($list);$i++){
      //メールデータを取得
      $msg=$pop3->getMsg($list[$i]['msg_id']);
     
      //MAIL_mimeDecodeの初期化
      $decoder=new Mail_mimeDecode($msg);
     
      //パラメータの設定
      $structure=$decoder->decode(
        array(
        'include_bodies'=>true,
        'decode_bodies'=>true,
        'decode_headers'=>true
        )
      );
     
      if(file_exists($dir.$filename)){
        //die('重複ファイルがあるので処理を終了します。');
      }
      //マルチパートを1パートずつ処理
      foreach($structure->parts as $parts){
        switch(strtolower($parts->ctype_secondary)){
          //保存除外項目
          //(jpegを保存したくなければcase 'jpeg':を追加)
          case 'plain':
          case 'html':
          break;
          //それ以外は保存
          default:
          /*今回は件名にファイル名を指定している設定
          処理を簡潔にするために半角英数記号のみ使うことを想定*/

         
          //件名を取得
          $filename=$structure->headers['subject'];
         
          //保存処理
          $fp=fopen($dir.$filename,'w+');
          fputs($fp,$parts->body);
          fclose($fp);
         
          //1メールにつき1ファイル添付の設計なので
          //このメールの処理は終了(foreachレベルまでbreak)
          break(2);
        }
      }
     
      if(file_exists($dir.$filename)){//ファイルが保存できている
        //メールをサーバから削除
        $pop3->deleteMsg($list[$i]['msg_id']);
        //メッセージの表示
        echo $filename.'の保存に成功しました';
      }else{//ファイルが保存できていない場合
        //メッセージの表示
        echo $filename.'の保存に失敗しました';
      }
    }
  }else{
    echo 'gmailへのログインに失敗しました。';
  }
}else{
  echo 'gmailへの接続に失敗しました';
}
?>

設定する項目は,4行目の保存ディレクトリと,

7,8行目のgmailアカウント情報です。

処理を煩雑にさせないためにも,

専用のgmailアカウントを用意するのが良いと思います。

あとPOP3アクセスを有効にするのをお忘れないように。

このgmailアカウントに

ファイルを1つのみ添付し,件名にファイル名を指定

することで,ファイルをアップロードするような仕様としています。

件名に「test.jpg」と指定して添付送信すれば

test.jpgがサーバに保存されます。

42行目のコメントアウトを外してもらえれば,重複するファイルがあった場合

保存しなくなります。

察しの良い方は気づかれたかも知れませんが,

4行目の$dirをpublic_htmlレベルまでにしておいて,

件名で「pictures2/test.jpg」とすれば

異なるディレクトリへのアップも可能です。

1メール複数ファイルの添付や,元ファイル名を使っての保存は

スクリプトが煩雑になるため,今回は採用しませんでした。

これをcronで定期実行すれば,メールで画像アップロードできますし

cronが使えない環境であれば,画像をアップしたあと,

Safariなり携帯なりで,ページにアクセスしてPHPを実行すれば良いことです。

投稿者を限定したい場合は,PHPのスクリプトに組み込むよりも

gmailのフィルター機能で投稿元アドレスを限定すれば良いと思います。

  1. コメントはまだありません。

  1. トラックバックはまだありません。