• 締切済み

Perl MIME::Parser モジュールを使わないで添付を取り出す

携帯から.forwordを使ってCGIを起動しメールに添付されている画像を サーバーに保存する事を考えております。 MIME::Parser モジュールを使った方法はよく見かけるのですが モジュールを使わずに@line=<STDIN>だけで複数ある添付ファイルを取り出し保存する事はできるでしょうか?

みんなの回答

  • okmotokun
  • ベストアンサー率59% (92/155)
回答No.2

for(@lines){ if(/\sboundary="?([^"\s]+)/){$boundary=$1} if(/^--$boundary(-*)/){ if($fname&&$fdata){ open(FH,">$fname"); binmode FH; #【Windowsの場合】 if($encode eq'base64'){print FH decode_base64($fdata)} #【※】 close FH; } last if($1); $attach++; $start=$fname=$fdata=$encode=""; } if($attach){ if(/^Content\-Type: ([^;\s]+)/i){$ftype=$1} if(/^Content\-Transfer\-Encoding: ([^\s]+)/i){$encode=$1} if(/\sfilename="?([^"\s]+)/){$fname=$1} if(!$start&&!/\w/){$start=1;next} if($fname&&$start){$fdata.=$_} } } 【※】デコード関数名 decode_base64は、MIME::Base64を使う場合です。 base64.plを使う場合は、base64::b64decode です。

参考URL:
http://webmastertool.jp/
gc10sh
質問者

お礼

ソースまで付けて頂きありがとうございます。 無事保存することができました。 ご丁寧な対応ありがとうございました。

  • okmotokun
  • ベストアンサー率59% (92/155)
回答No.1

@line をforで読みながら (1)最初に出現する Content-type のパラメータ boundaryの値を $boundaryに入れる。 (2)「--$boundary」が出現するまで読み飛ばし、 (3)Content-Transfer-Encoding: xxxxx でエンコード方式を取得。(たいていの添付ファイルは base64) (4)filename=xxxxx でファイル名を取得。 (5)空行が出現したら、その次の行から $fdataに保存。 (6)「--$boundary」が出現したら、$fdataを(3)のエンコード方式でデコードし、(4)のファイル名でファイルに保存する。 ※(6)の$boundaryの末尾にハイフン2個が付いているときは終り、付いていないときは次のファイルがあるので、(3)~(6)を繰り返す。

gc10sh
質問者

お礼

早速のご回答ありがとうございます。 とても参考になりました。

gc10sh
質問者

補足

すみません 1~4までは何とかできましたが (5)空行が出現したら、その次の行から $fdataに保存。 この部分の書き方がわかりません。 空行の判断は/^$/でマッチすればよいのでしょうか? また、--$boundaryが現れるまで$fdataに複数行を代入するには どのようにすればよいのでしょう?すみませんヒントだけでもお願いします