ページ更新: 2005-12-23 (金) (6367日前)
(2001.06.02作成) feelH"+Trevaで写真を撮ってメールで送ってWebに載せる……つもりだったが、途中で放置。 目次 [編集]目的 #feelH" + Treva を使うと、Trevaで撮った写真をメールに添付して送ることができる。 これを使って、特定のメールアカウントにメールを送ると、Webに掲載されるようにする。 用途は「旅行や宴会の最中に、その内容をレポートする」を想定。 なお、J-Phoneなどの携帯やPC+デジタルカメラにも対応できるだろうが、持っていないので対応しない。 [編集]仕様 #特定のメールアカウントにメールを送ると、Webに掲載されるようにする。 いたずら防止のため、発信元のアカウントは feelH" に限定する。 掲載する内容は、メールの題名、メールの本文、メール送信時刻、画像。 なお、feelH" で撮った画像はbmp形式で 8568byteもあるので、pngに変換する。 (ImageMagickで可能なら) feelH"+trevaで撮った画像のパレットの内容がこう:
(IrfanViewer 3.30 と Picture Publisher 8 で確認。たぶんファイルサイズを減らすために feelH"はパレット情報を固定で持っているのではないだろうか。なお、カレンダ壁紙などはパレット情報が入っており、feelH"とPCの双方で正常に表示できる。よって、feelH"自体はパレットに対応していると思う。) 掲載されるページの場所はメールにて指示(Subjectや本文で)するか、あるいは時刻などで自動的に決定する。 [編集]動作環境 #一般のプロバイダのことは想定しない。自作サーバかハウジングが対象。 そこで、procmail 、MIME::Parser 、Image::Magick など、一般のプロバイダには用意されていないが入手が容易なツール/ライブラリを多用することにした。 [編集]方針 #
実装 #まず、MIME::Parser と Image::Magick と procmail を入手しておく。debian なら apt-get install libmime-perl perlmagick procmail を実行すれば良いだろう。そうでなきゃ perl -MCPAN -eshell して、install モジュール。 私はpostfixを使っていて、しかも procmailをローカルメーラに使っていないので、次の .forward と .procmailrc を用意した。 /.forward "|exec /usr/bin/procmail" /.procmailrc PATH=$HOME/bin:/usr/bin:/usr/local/bin: LOCKFILE=$HOME/.lockmail :0 c * ^From: .*@pdx.ne.jp | feelhpic.pl :0 /dev/null /feelhpic.pl (標準入力からメールを受け取り処理するスクリプト) MIME::Parser のサンプルスクリプト mimedump を参考にした。(作成中) 参照:perldoc の MIME::Parser MIME::Entity MIME::Head MIME::Body Image::Magick #!/usr/bin/perl use strict; use MIME::Parser; use MIME::WordDecoder; use Image::Magick; my $outputdir= '/home/feelh/public_html'; my $mail_from; my $mail_date; my $mail_subject; my $mail_body; #------------------------------ # # dump_entity ENTITY # # Recursive routine for dumping an entity. # sub dump_entity { my ($entity) = @_; # HEAD $mail_from .= $entity->head->get('from'); $mail_date .= $entity->head->get('date'); $mail_subject .= $entity->head->get('subject'); # BODY my @parts = $entity->parts; if (@parts) { # multipart... my $i; foreach $i (0 .. $#parts) { # dump each part... dump_entity($parts[$i]); } } else { # single part... # Get MIME type, and display accordingly... my ($type, $subtype) = split('/', $entity->head->mime_type); my $body = $entity->bodyhandle; if ($type =~ /^(text|message)$/) { # text $mail_body .= $body->as_string; } else { # binary my $filename= $entity->head->recommended_filename; $filename =~ s/.bmp$/.png/i; my $image = Image::Magick->new(magick=>'bmp'); $image->BlobToImage($body->as_string); (ここらへんでパレットの差し替えをやる。:作成中) $image->Write("$outputdir/$filename"); chmod(0644, "$outputdir/$filename"); } } 1; } #------------------------------ # # main # sub main { # read STDIN my $buf; { local $/; $buf= <>; } # Parse setting... my $parser = new MIME::Parser; $parser->output_to_core(1); $parser->tmp_recycling(1); $parser->tmp_to_core(1); $parser->use_inner_files(1); my $entity = $parser->parse_data($buf) or die; # Parse and dump dump_entity($entity); # ここで、HTMLのインデックスファイルを作る(作成中) print "From: $mail_from"; print "Date: $mail_date"; print "Subject: $mail_subject"; print $mail_body; print "\n"; 1; } exit(&main ? 0 : -1); #------------------------------ 1; |