― Web Technology and Life ―

perlでメールの添付ファイルを受け取って加工する方法

2015-04-20
Email::MIME使ってメールをパースして添付データを取り出したかったんだけど、なんかググってもあまりでてこなかったので、ドキュメント見ながらこちこちやってみたので、メモっておきます。

前説

Perlにメールに添付ファイルをつける方法は以下のようにいくつか出てくるんだけど

受信したメールをどうこうする方法があまりでてこない。(MIME::Parserを使った方法はみかけたけど、ぼくはEmail::MIMEを使っているのでコッチで何とかする方法が知りたかった)

コード

というわけでこんな感じ。

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use Email::MIME;
use Encode;
use MIME::Base64 qw(encode_base64 decode_base64);
use Text::CSV;
use File::Temp;


my $email = Email::MIME->new($message);

my @parts = $email->parts;

for my $part (@parts) {
    if ($part->filename) {
        my $dir = File::Temp::tempdir(CLEANUP => 1);

        my $file = $dir."/".$part->filename;

        open my $fh,">",$file;
            print $fh decode("cp932",decode_base64($part->body_raw));;

        open $fh,"<",$file;

        my $csv_parser = Text::CSV->new ( { binary => 1, } )
            or die "Cannot use CSV: ".Text::CSV->error_diag ();
        $csv_parser->column_names (qw/id name/);

        my $rows = $csv_parser->getline_hr_all($fh);

        for my $rows(@$rows){
            warn $rows->{id};
        }


    }else{
        open my $fh,">","./honbun.txt";
            print $fh decode("iso-2202-jp",$part->body_raw);
        close $fh;
    }
}

悩み

添付ファイルの確認の仕方はこれてよいか?

よしなにしたいメールの添付ファイルって、だいたいCSVか画像かだと思うのだけど、Email::MIMEのfilenameメソッドで添付ファイルかどうか確認しても良いのか疑問だった。添付ファイルだってことはそもそもファイル名あるよね?って前提の確認方法だけど、これがベストプラクティスなのかどうか謎。

decode_base64やってよいのやら?

メールの圧縮とかあまりわかっていないんだけど、なんとなく添付ファイルのbodyをdecode_base64かけたらうまく変換できたので、満足しているんだけどこれもベストプラクティスなのかどうか謎。

Text::CSVに生データ渡せたっけ?

これはメールというよりText::CSVの話なんだけど、添付ファイルの中身ってdecode_base64でとるとファイルじゃなくてデータでとるからそれを画像の場合はそれを出力して保存すれば終了って話なんだけど、CSVファイルとかはデータをほげほげしたかったりするのにText::CSVってファイルハンドルを投げ込むインターフェースになっているからそのために一旦ファイルに吐き出して、ファイルハンドルとってそれをText::CSVに投げ込むのが不毛な感じ。

悩み解決募集中

Text::CSVのドキュメント長いから、一旦これでいいやーってやめちゃったんだけど、なんかあればTwitterとかはてなブコメ頂けると嬉しいっす!!

Perl update_at : 2015-04-20T17:38:30
hirobanex.netの更新情報の取得
 RSSリーダーで購読する   
blog comments powered by Disqus