iモードでメールを全文読みたい!
AccessCount -> 6250

2001年12月現在、iモードではメールを約250文字までしか読むことができません。
ケータイ同士でのやりとり程度でしたらこれでも構わないのですが、
私のように自分宛の通常メールをケータイに転送している人も少なくないでしょう。

これでは重要なメールのお尻が切れてしまいますし、メールマガジンなどでは装飾文字(***,---等)に
文字数が取られてしまい、内容はほとんど見ることができません。

今回はMHonArcという有名な「メール」→「HTML」コンバートプログラムを少し改良し、
この問題を解決したいと思います。

ホーム以下のディレクトリしか使用しませんので、自分でサーバを運用していない方でも、
プロバイダによっては設置可能な場合もあるかもしれません。
このページの内容を参考にトライしてみてはいかがでしょうか?


MHonArcとは?:
  MHonArcとはperlで作られたとても有名な「メール」→「HTML」コンバートプログラムです。
  メールマガジンをHTML化するのによく用いられています。
  詳しい情報は本家(http://www.oac.uci.edu/indiv/ehood/mhonarc.html)をご覧ください。
  今回はFreeBSDのPortsパッケージ(/usr/ports/japanese/mhonarc)からインストールした、
  MHonArc 2.3.3を使用しました。

どうやって実現するのか?:
  iモードで250文字以上のメールを読みたいからと言っても、当然iモード側を改造できるわけはありません。
  今回は携帯電話に転送されて来るメールの一番最初の行にURLを表示することによって、
  解決しようと思います。iモードに転送されてきたメールを読んでみて重要なメールなようであれば、
  リンクをクリックするといった感じです。

  流れ:
  メール受信 → MHonArc(改)起動 → iモード用HTMLファイル作成
   → メールにURLを追加 → iモードにメールを送信

  またおまけ機能として余分な装飾文字(***,---等)をカットする機能を付けてみることにします。

動作条件:
  ・perl5以上があること
  ・sendmail互換のプログラム(ex. /usr/sbin/sendmail)が動作していること(qmail, postfixでもOK)
  ・nkfが入っていること

  私はFreeBSD + Postfixで構築してみました。


Step1:MHonArcを改造する(その1)

MHonArcは著名なソフトとはいえ、中を開けば単なるperlスクリプトです。ガンガン改造してみましょう。
まずはオリジナルを壊さないようにコピーします。すでにmhonarcがインストール済みでしたら、
/usr/local/bin/mhonarcあたりにあると思います。無い方はWebからダウンしてきましょう。
私はホームに「cus_mhonarc」というディレクトリを新たに作り、そこに「cus_mhonarc.pl」という名前でコピーしました。

$ cd ~
$ mkdir cus_mhonarc
$ cp /usr/local/bin/mhonarc cus_mhonarc/cus_mhonarc.pl


そして編集します。
$ cd ~/cus_mhonarc
$ vi cus_mhonarc.pl


どうもmhonarcの中を見てみると、このプログラム内ではほとんどなにもやっておらずmhamain.plを呼んでいるだけのようです。
とりあえずそちらを改造することにしますので、mhonarcの方は2カ所だけの変更にとどめ、

一番上の方にある
  use lib qw(/usr/local/lib/perl5/site_perl/5.005/MHonArc); を
   ↓
  use lib qw(/home/hogehoge/cus_mhonarc);  に変更。

下の方にある
  require 'mhamain.pl' || die qq/ERROR: Unable to require "mhamain.pl"\n/;  を
   ↓
  require 'cus_mhamain.pl' || die qq/ERROR: Unable to require "cus_mhamain.pl"\n/;
に変更しました。

別にオリジナルのmhonarcをいじって構わないのであれば、ここは読み飛ばしてもかまわないです。


Step2:MHonArcを改造する(その2)

続いて隠れた本体であるmhamain.plを改造します。
こちらもオリジナルを壊さないようにまずはじめにコピーを行います。
めんどくさいのでライブラリをまるごとコピーしてしまいます。

$ cp /usr/local/lib/perl5/site_perl/5.005/MHonArc/* ~/cus_mhonarc/

改造版であることがわかりやすいようにmhamain.plをリネームしておきます。

cd ~/cus_mhonarc
$ mv mhonarc.pl cus_mhamain.pl

続いて修正です。
$ vi cus_mhamain.pl

mhamain.plの詳細はソースを見てもらえばわかると思うで省略しますが、
要はHTML本文をプリントする前に割り込みを入れればよいので、

  print $msghandle "<!--X-Body-of-Message-->\n";

# add >>
  require 'mhonarc_mail_fw.pl';
# <<

  print $msghandle $Message{$index}, "\n";

というように1000行目付近に割り込みプログラムに飛ぶように追加しました。

またiモードからではヘッダ部のリンク表示はいらないので、
970行目付近の
  print $msghandle $template;
という一文をコメントアウトしました。
これは必須というわけではありません。


Step3:割り込みプログラムを書く

さてStep2から呼び出されるプログラム、mhonarc_mail_fw.plを作成します。
ここでは主に次のような処理を行っています。

 ・動作ログの出力
 ・***,---等の飾り文字を削除
 ・本文をメールに転送
 ・メール転送の本文の先頭行にメール内容のHTMLへのリンクを入れる。

サンプルとして次のようなプログラムを載せますので参考にしてください。
赤字部分はご自分の環境に読み替えて設定してください。

設定ごとにソース自体を変更するのは美しくないので外部の設定ファイルを
読むように変更すると良いかもしれません。

# --------------- sample : mhonarc_mail_fw.pl ---------------

#!/usr/bin/perl

&mail_fw_init();
&mail_fw_main();
&mail_fw_end();


##### 初期化処理 #####
sub mail_fw_init {
  require 'base64.pl';

  $forward_mailaddress = "hogehoge\@docomo\.ne\.jp";    # 転送先メールアドレス
  $maildir = "/home/hogehoge/public_html/maildir";    # 受信メール置き場
  $htdocs_dir = "http://www.hogehoge.com/~hogehoge/maildir/";    # 公開URL
  $logfile = "$maildir"."/mailfw.log";    # ログファイル名
  $midfile = "$maildir"."/mid.txt";    # メールIDカウントファイル名

  $mid = (&mid_count);    # メールIDの取得
}


##### メイン処理 #####
sub mail_fw_main {
  # ログに処理開始メッセージ出力
  &write_log (&get_now_time."\t"."$mid\t".">>>>> Script start >>>>>\n");
  
  # メールヘッダ読込処理
  if ($From{$index} =~ /</) {
    ($_, $header_From) = split /</, $From{$index};
      $header_From =~ s/>//;
    } else {
      $header_From = $From{$index};
  }

  # ログにヘッダ情報出力
  &write_log (&get_now_time."\t"."$mid\t"."From: ".$header_From."\n");

  # メールファイル出力とメール送信
  &mail_fw_output;
  
}


##### ログ書き込み処理 #####
sub write_log {
  open LOGFILE, ">>$logfile" or die "Cannot open $logfile :$!\n";
  flock LOGFILE, 2;    # 排他ロック
  print LOGFILE "$_[0]";
  flock LOGFILE, 8;    # ロック解除
  close LOGFILE;
}


##### メールIDカウント処理 #####
sub mid_count {
  open MIDFILE, "$midfile" or die "Cannot open $midfile :$!\n";
  flock MIDFILE, 2;    # 排他ロック
  $_ = (<MIDFILE>+1);
  flock MIDFILE, 8;    # ロック解除
  close MIDFILE;

  open MIDFILE, ">$midfile" or die "Cannot open $midfile :$!\n";
  flock MIDFILE, 2;    # 排他ロック
  print MIDFILE $_;
  flock MIDFILE, 8;    # ロック解除
  close MIDFILE;
  return $_;
}


##### 現在の時刻を取得 #####
sub get_now_time {
  my($now_time, $wday, $mon, $mday, $hhmmss, $year);
  
  $now_time = gmtime(time() + 9*60*60);    # 現在時刻(GMT時刻)に9時間加算
  ($wday, $mon, $mday, $hhmmss, $year) = split(/ /,$now_time);
  return "$mday-$mon-$year($wday) $hhmmss";
}


##### メールファイル出力とメール送信 #####
sub mail_fw_output {

  # メールを出力
  open MAIL, "| /usr/sbin/sendmail '$forward_mailaddress'";
  print MAIL "To: $forward_mailaddress\n";
  print MAIL "From: ".$From{$index}."\n";
  print MAIL "Error-To: $forward_mailaddress\n";
  print MAIL "Subject: ".$Subject{$index}."\n";
  print MAIL "Content-Transfer-Encoding: 7bit\n";
  print MAIL "Content-Type: text/plain\; charset=iso-2022-jp\n";
  print MAIL "\n";
  
  # メール内容のURLを出力
  print MAIL ($htdocs_dir."msg");
  printf MAIL ("%05d", $mid);
  print MAIL (".html\n");

  # メール本文データの整形(HTML)
  $Message{$index} =~ s/\*+/*/g;
  $Message{$index} =~ s/\++/+/g;
  $Message{$index} =~ s/\-+/-/g;
  $Message{$index} =~ s/\=+/=/g;
  $Message{$index} =~ s/\_+/_/g;
  $Message{$index} =~ s/\.+/_/g;

  # メール本文の整形(転送メール)
  $_ = $Message{$index};
  s/<.*>//g;
  s/\&gt\;/>/ig;
  s/\&lt\;/</ig;
  
  print MAIL $_;    # MAILを出力

  close MAIL;
}


##### 終了処理 #####
sub mail_fw_end {
  &write_log (&get_now_time."\t"."$mid\t"."<<<<< Script end <<<<<\n");
}

# ------------------------------------------------------


Step4:フォルダやログの用意・MHonArcの設定

プログラム側の作成が終わりましたので、そこから使用されるフォルダやログの用意と
MHonArcの設定ファイルを作成します。

まずはフォルダとログを用意します。
Step2のプログラム(mhonarc_mail_fw.pl)の先頭部で設定した通りにフォルダとログファイルを作成します。

$ cd ~/public_html
$ mkdirmaildir
$ chmod 777 maildir
$ cd maildir
$ touch mailfw.log
$ touch mid.txt
$ chmod 777 *


mid.txtはメールのカウントファイルになります。初期値は-1に設定します。
$ vi mid.txt

-1
と書き込み保存します。


続いてMHonArcの設定ファイルを変更します。
デフォルトだと「/usr/local/share/examples/MHonArc/mhonarc.rc.sample」あたりにあるのではないでしょうか。
とりあえずコピー&リネームして設定を行います。

$ cp /usr/local/share/examples/MHonArc/mhonarc.rc.sample ~/cus_mhonarc/mhonarc.rc
$ vi ~/cus_mhonarc/mhonarc.rc


基本的にはデフォルトのままでOKですが、iモードからも使いやすくするために項目を幾つか追加しました。
このファイルは別に変更しなければ動かないというものではなく、見やすくするために修正するものです。

# ↓表示しないヘッダを設定します
<EXCS>
reply-to
in-reply-to
sender
delivered-to
subject
references
user-agent
</EXCS>


# ↓インデックスのファイル名を設定します
<IDXFNAME>
index.html
</IDXFNAME>



その他詳細はMHonArcの解説ページを参考にしてください。


Step5:メール側の設定

続いてメール側の設定を行います。受信したメールをプログラムに喰わせてやらなくてはなりません。
ご自分の環境に合わせて、「.forward」「/etc/aliases」「.qmail」など好きな場所に設定してください。

私は「/etc/aliases」に設定しました。

# vi /etc/aliases
で以下の記述を追加します。

fw_hogehoge
: "|exec /usr/local/bin/nkf -ms | /home/hogehoge/cus_mhonarc/cus
_mhonarc.pl
-rcfile /home/hogehoge/cus_mhonarc/mhonarc.rc -add -out /home
/hogehoge/public_html/maildir
;chmod 664 /home/hogehoge/public_html/maildir/*.html"


※全てを一行で書くこと。赤字部分は自分の環境のディレクトリ構成に合わせ書き直すこと。
  緑字部分は転送用のアカウント名です。

エイリアスの更新も忘れずに行います。
# newaliases

これでfw_hogehoge@hogehoge.com宛に送信したメールは今回作成したプログラム宛に転送されます。


Step6:テスト&デバッグ

さて全ての設定が終了しました。早速テストしてみましょう。
Step5で設定した「fw_hogehoge@hogehoge.com」宛にメールしてみましょう。
/home/hogehoge/public_html/maildir内にhtmlファイルが作られると同時に
Step3のプログラム内で設定した「hogehoge@docomo.ne.jp」にメールが転送されるはずです。
ブラウザからも「http://hogehoge.com/~hogehoge/maildir/」で確認できます。

うまくいかない場合はプログラムのエラー、ディレクトリ構成、パーミッションなどを確認してみてください。
帰ってくるエラーメールやログも参考になると思います。
ひっかかりやすいのはパーミッションの設定間違いですのでよく確認してみてください。


最後に:

以上簡単ですが、mhonarcを利用したiモードメール閲覧の仕掛けを解説させていただきました。
mhonarcについては豊富な解説ページがありますし、ソースもキレイで理解しやすいです。
さらに改良し、より使いやすいシステムを構築してみてください。
また今のままだとiモードのページ容量上限を越えた場合エラーになっていまいます。
5kb程度でページ分けを行うように改造すると良いと思います。


その他:

  ※ ページ内の情報に誤りがあるときはご指摘ください。