メール投稿した画像をサーバに保存する方法
※この記事は,ウェブアプリ(プログラミング)に関するページです
興味のある方のみ御覧ください。
iPhone(iPod touch)のSafariでは
アップロードフォームが無効化されています。
iphoneから,自分のレンタルサーバの,指定するディレクトリへ
ファイル名を指定してアップロードすることは困難です。
(800円出すならば,FTP On The Goで片付ける手もあります)
また,メールし放題のプランに入っている不肖の身として
携帯からのアップロードは,写メですれば無料ということもあり
メールから自レンタルサーバに画像をアップロードする
PHPスクリプトを書くことにしました。
動作確認はXREAサーバ(PHP 5.25,Apache 1.3.37)で
セーフモードでの実行で確認しています。
必要要件は,PEARのNet_POP3,Mail_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のフィルター機能で投稿元アドレスを限定すれば良いと思います。

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