[Perl] => [メール]
MIME::Parserはメールを解析し、ヘッダーや添付などを取り出してくれるモジュールです。これを利用すればメールの添付ファイルのみ取り出すこともできます。以下の例ではメールの受信時に直接プログラムにパイプすることを想定しております。(ただし添付ファイルに日本語が含まれるファイルはうまく動きませんので注意)
[例]
use File::Basename;
use MIME::Parser;
my $parser = MIME::Parser->new;
#ファイルの一時保存場所を指定
$parser->output_dir('/tmp');
#標準入力からメールを取得
my $entity = $parser->parse(*STDIN);
#FromとSubjectのみ取り出し
#$entity->head;
#my $from = $header->get('From');
#my $subject = $header->get('Subject');
#添付ファイルがある場合のみ処理
if($entity->is_multipart){
#パートの数(本文と添付ファイルの合計数)
$count = $entity->parts;
#メール本文以外(添付のみ)を取り出し(本文は0番目のため、一番目から取り出し)
for($i = 1; $i < $count; $i++){
#ファイル名を含むパスを取り出し
$path = $entity->parts($i)->bodyhandle->path;
#ファイル名を取り出し
$filename = (fileparse($path))[0];
#添付ファイルを書き出し
open(FILE, "> /var/spool/mail/mail/$filename");
print FILE $entity->parts($i)->bodyhandle->as_string;
close(FILE);
}
}
※ $entity->as_stringはヘッダーを含むメール本文、 $entity->bodyhandle->as_stringは本文のみ取り出します。
※ Command died with status 1 というエラーでメールが帰ってきたばあい、パイプしているプログラムに実行権限が付いていない可能性が高いです。
Net::POP3 - メールの取得
MIME::Lite - 添付付きメールの送信
メールの送信をするには-Net::SMTP
メールの文字化け
Email::Valid - メールの書式並びにMXのチェック