必要になったので作ってみた。
とりあえず最小機能。添付以外は捨て。
テーブル作成。画像データはバイナリ、MEDIUMBLOB型として格納。
CREATE TABLE IF NOT EXISTS `images` (
`id` int(10) unsigned NOT NULL auto_increment,
`from` varchar(80) collate utf8_unicode_ci default NULL,
`name` varchar(80) collate utf8_unicode_ci default NULL,
`type` varchar(80) collate utf8_unicode_ci default NULL,
`data` mediumblob default NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=32 ;
~/.forwardを編集。
"|exec /usr/bin/procmail"
~/.procmailrcを編集
SHELL=/bin/bash PATH=/usr/bin:/bin :0 | $HOME/bin/mailparse.pl
スクリプトはこんな感じで。
#!/usr/bin/perl use strict; use MIME::Parser; use DBI; my $parser = MIME::Parser->new; $parser->output_to_core(1); #メール取得 my $entity = $parser->parse(*STDIN); #添付ファイルがないなら終了 exit unless $entity->is_multipart; #送信元アドレス取得 my $header = $entity->head; my ($from) = $header->get('From') =~ /<(.+)>/; #DB接続、クエリ準備 my $dbh = DBI->connect("DBI:mysql:dbname:localhost", "username", "password") or die "Could not connect to database: " . DBI->errstr; my $query = "insert into images values(NULL,?,?,?,?)"; my $sth = $dbh->prepare($query); #添付ファイル処理 my $count = $entity->parts; for(my $i = 1; $i < $count; $i++){ my $filename = $entity->parts($i)->head->recommended_filename; my ($filetype) = $filename =~ /\.(jpg|jpeg|png|bmp|gif)$/; next unless $filetype; my $imagedata = $entity->parts($i)->bodyhandle->as_string; $sth->execute($from, $filename, $filetype, $imagedata); #print "from:$from\nfilename:$filename\nfiletype:$filetype\n"; } $sth->finish(); $dbh->disconnect();
修正予定です。
・ファイル種別の判別を拡張子ベースじゃなくす
・携帯メールがさばけてない
・画像をDB保存じゃなくてファイル保存にする
・メール配送部分(普通のメールと区別)
実際はメールアドレスじゃなく別テーブルから引いたユーザIDをDBに格納してます。