メールの添付画像をDBに格納

必要になったので作ってみた。
とりあえず最小機能。添付以外は捨て。


テーブル作成。画像データはバイナリ、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に格納してます。