ページ更新: 2005-12-23 (金) (4288日前)

(2001.06.02作成)

feelH"+Trevaで写真を撮ってメールで送ってWebに載せる……つもりだったが、途中で放置。

目次

[編集]

目的 #

feelH" + Treva を使うと、Trevaで撮った写真をメールに添付して送ることができる。 これを使って、特定のメールアカウントにメールを送ると、Webに掲載されるようにする。

用途は「旅行や宴会の最中に、その内容をレポートする」を想定。

なお、J-Phoneなどの携帯やPC+デジタルカメラにも対応できるだろうが、持っていないので対応しない。

[編集]

仕様 #

特定のメールアカウントにメールを送ると、Webに掲載されるようにする。

いたずら防止のため、発信元のアカウントは feelH" に限定する。

掲載する内容は、メールの題名、メールの本文、メール送信時刻、画像。

なお、feelH" で撮った画像はbmp形式で 8568byteもあるので、pngに変換する。

(ImageMagickで可能なら) feelH"+trevaで撮った画像のパレットの内容がこう: palette.png
なので、パレットを付け替える。

(IrfanViewer 3.30 と Picture Publisher 8 で確認。たぶんファイルサイズを減らすために feelH"はパレット情報を固定で持っているのではないだろうか。なお、カレンダ壁紙などはパレット情報が入っており、feelH"とPCの双方で正常に表示できる。よって、feelH"自体はパレットに対応していると思う。)

掲載されるページの場所はメールにて指示(Subjectや本文で)するか、あるいは時刻などで自動的に決定する。

[編集]

動作環境 #

一般のプロバイダのことは想定しない。自作サーバかハウジングが対象。

そこで、procmail 、MIME::Parser 、Image::Magick など、一般のプロバイダには用意されていないが入手が容易なツール/ライブラリを多用することにした。

[編集]

方針 #

  1. 画像受信用にメールアカウントを1つ用意する
  2. .procmailrc で特定のメールだけ、スクリプトに渡す
  3. スクリプトは:
    1. 標準入力からメールを受け取って、
    2. MIME::Parser でメールヘッダ、本文、添付ファイル(feelH"なので、*.bmp)を取り出し、
    3. Image::Magick でパレットを調整し、 *.png に変換して、HTMLファイルと同じパスに格納。
    4. メールヘッダと本文を使ってHTMLファイル(インデックス)を作成(更新)する。
[編集]

実装 #

まず、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;