MHonArc の日本語化


0. まえがき

MHonArc を使って日本語のメールを処理しようとするといろいろと問題が起こります。 良く紹介される廻避法は、nkf 等を使って事前に (あるいは MHonArc の中で) EUC に変換してしまう方法です (*1)。 しかし、この方法は (お手軽ではありますが) MIME 的には正しいとは言い難く、MHonArc のポリシーにそった方法とは思えません。

そこでここでは、MHonArc 日本語化のよりエレガントな解を模索することにしましょう。 手っ取り早く結論を知りたいという方は まとめ をごらんください。

なおここで使用している MHonArc のバージョン は v2.4.0 です。


(*1) この文章を書いた当時はこういう方法が良く紹介されていたのですが、 私がこのような文章を書いたせいか、最近はあまり見なくなったような気がします。


1. <序論> なぜ化けるのか?

「あいうえお」の 5 文字を iso-2022-jp で表現すると、

^[ $ B $ " $ $ $ & $ ( $ * ^[ ( B
のようになります (`^[' は ESC (0x1b) です)。

最初の `^[$B' の 3 文字が「ここから日本語 (もう少し正確には JIS X 0208-1983) が始まるよ」ということで、最後の `^[(B' が「ここで日本語が終わりだよ (もう少し正確にはここから ASCII が始まるよ)」ということです。 `^[$' の後の 2 文字ずつ ($", $$, $&, $(, $*) がそれぞれ「あ」「い」「う」「え」「お」に対応します。 したがって、「う」は

^[ $ B $ & ^[ ( B
となります。

ところで HTML では & や <, > などはそれぞれ &amp;, &lt;, &gt; と書かねばなりません。 そのため、MHonArc を含む HTML filter の類はこの変換を行なおうとします。

しかし、単純に変換したのでは (つまり日本語化されていない場合)、

^[ $ B $ & ^[ ( B   (=「う」)
も、
^[ $ B $ & a m p ; ^[ ( B
と変換されてしまうことになります。 これは「う瘢雹」の 3 文字に対応します。

これが「化ける」原因 (の一部) なのです。

iso-2022-jp 等の詳細については

などを参照して下さい。

なおこの文章では、charset=iso-2022-jp と言っておきながらそれ以外の charset になっている、といったような場合については扱っていません。

2. 本文の日本語を通す

実は MHonArc でメール本文の日本語を通すためには、特になにもする必要がありません。 mhtxtplain.pl を見ると分かるように、すでに日本語化がされているのです。 しかし、実際にやってみるといくつかのメールが化けることがあります。 これは主に、

  1. MIME message でない (Mime-Version: header が無い)
  2. MIME message だが charset が指定されていない (つまり Content-Type: が ``text/plain; charset=iso-2022-jp'' ではなく ``text/plain'' などになっている)
  3. charset=iso-2022-jp と宣言しておきながら本文が Shift-JIS だったり、Shift-JIS を base64 で encode している
ことが原因です。 1. と 2. は共に charset が指定されていないため charset=us-ascii として扱われてしまいます。 (RFC 2045, 5.2. Content-Type Defaults 等を参照)。

後者はともかく、前者が化けるのはちょっと悲しいので、どうにかしましょう。 そのためには、MHonArc の resource を、

<MIMEARGS>
text/plain:default=iso-2022-jp
</MIMEARGS>
のようにします。 この設定によって、charset の default を iso-2022-jp にすることができます。 ただし、この方法は charset が無い message を全て iso-2022-jp として扱ってしまうので、Content-Type: の正しくない (= 本文が iso-2022-jp なのに Content-Type: に ``charset=iso-2022-jp'' が無い) message まできちんと読めてしまうのが欠点です。

なお、3. については化けるのが「正しい」と思われますので、ここでは考慮しません。

3. Header の日本語を通す

3.1 Subject: の日本語を通す

まず MIME encode された Subject: を decode するために、

<DECODEHEADS>
という resource を設定します。

また、直接 iso-2022-jp を含んだ Subject: を認めるかどうかは議論の余地があるところでしょうが、 これを処理しておかないと他のところにも影響してしまう (tag がきちんと閉じられなかったりする) ことがあるので、次のようにして、 MIME encode されていない日本語サブジェクトのフィルターを指定しておいた方が良いでしょう。

<CHARSETCONVERTERS>
plain;          iso_2022_jp::str2html;     iso2022jp.pl
</CHARSETCONVERTERS>

なお、document (doc/resources/charsetconverters.html) の Default Setting に iso-2022-jp のときのフィルターが入っていないように書かれていますが、 実際には入っていますので、iso-2022-jp については指定する必要はありません。

3.2 From: の日本語を通す

MHonArc では、From: が MIME encode されていても、decode され た文字列に @ 等が含まれていると、正しく変換されないことがあります。 もう少し詳しく説明すると、mhutil.pl の field_add_links (という関数) のなかの正規表現
([\!\%\w\.\-+=/]+@[\w\.\-]+)
にマッチするような場合に、正しく変換されません (なお \w は英数字と `_' にマッチします)。 例えば、「垣垣」の場合、
^[ $ B 3 @ 3 @ ^[ ( B
となり、B 3 @ 3 の部分がこの正規表現にマッチしてしまい、 E-mail address とみなされてしまうために、
^[$<A HREF="mailto:B3@3">B3@3</A>@ ...
のような謎のタグが生成されることになります。

これに問題を廻避するには、

<NOMAILTO>
を使うと良いでしょう。 これにより、From: の部分はそのまま表示されるようになります (もちろん、根本的に対処するにはソースに手を入れるしかありません)。

なお「From: の日本語を通す」と書いていますが、

To:, From:, Cc:, Sender:, Reply-To:, Resent-To:, Resent-Cc:
などについて、同様の問題があります。

4. その他の問題

4.1 TITLE の問題を廻避する

Subject: がとても長くて、日本語を含んでいる場合に <TITLE> の処理が上手くいかないことがあります。

これは、<TITLE> を Subject: の最初の 72 文字 (というか 72 bytes) で切っているためで、72文字目に日本語がかかっていると、^[(B (「ここで日本語が終わりだよ (もう少し正確にはここから ASCII が始まるよ)」 を示す文字列) が落ちてしまうことによるものです。 (必要なら 「1. <序論> なぜ化けるのか?」 も参照して下さい。)

この問題は、MsgPgBegin という resource を設定することにより 廻避できます。 具体的には、

<MsgPgBegin>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML//EN">
<HTML>
<HEAD>
<TITLE>$SUBJECTNA$</TITLE>
<LINK REV="made" HREF="mailto:$FROMADDR$">
</HEAD>
<BODY>
</MsgPgBegin>
とすると良いでしょう。 なお default では、上の、
<TITLE>$SUBJECTNA$</TITLE>
の部分が
<TITLE>$SUBJECTNA:72$</TITLE>
となっています (詳しくは MHonArc のアーカイヴに含まれる doc/resources/msgpgbegin.html を参照して下さい)。

(Notice)

5. まとめ

MHonArc で日本語を通すには、resource を

<DECODEHEADS>
<MIMEARGS>
text/plain:default=iso-2022-jp
</MIMEARGS>
<CHARSETCONVERTERS>
plain;          iso_2022_jp::str2html;     iso2022jp.pl
</CHARSETCONVERTERS>
<NOMAILTO>

<MsgPgBegin>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML//EN">
<HTML>
<HEAD>
<TITLE>$SUBJECTNA$</TITLE>
<LINK REV="made" HREF="mailto:$FROMADDR$">
</HEAD>
<BODY>
</MsgPgBegin>
のように設定するだけです。

6. 最後に

「MHonArc の日本語化」などというタイトルを付けてしまいましたが、実は やっていることは「日本語化」などというたいそうなものではなく、 MHonArc の resource をいくつか設定しただけです。 MHonArc 自身には何一つ手を加えていません。

こんなに簡単に済んでしまうのは MHonArc が MIME に基づいた設計になっていることと、拡張を意識した実装になっているからでしょう。 せっかくの MHonArc の特徴ですから、これを活かした使い方をすることは重要なことです (もちろん MHonArc に限ったことではありませんが)。

もし、上記の方法だけではうまくいかない場合などがありましたらぜひ 御連絡下さい。 また、こういう方法のほうが良い、といった御意見等もお待ちしております。

(謝辞)

4.1 の TITLE に関する問題は、何人かの方にメールで指摘していただいて気付いたものです。

その後、とりあえず問題点と発生する状況を known problems として書いておいたところ、別の方から解決法 (の糸口) を教えていただきました。

指摘して下さったみなさん、ありがとうございました (そして、遅くなってごめんなさい)。


Last modified: Sat Jun 11 07:41:33 JST 2011