mots quotidiens.
Daichi Mochihashi (持橋大地) daichi <at> ism.ac.jp by hns, version 2.10-pl1.

先月 2010年02月 来月
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28

2010年02月10日(水) [n年日記]

#1 Gnus+nnmhでMail

研究には直接関係ない話。
個人的に, メーリングリストの過去メールをまとめ読みする必要が生じた。 今でも, MLのメールを後でゆっくり読みたい等ということは結構あるのではないかと 思います。
こういう目的にはメーラーではなく, 既読/未読を管理でき, メールをスレッド表示 してくれるニュースリーダーが便利です。昔はメールを持ち帰って, GNUSでメールを 読んでいました。 (正確に言うと, 指導員室の SparcStation でMLのメールを tar+gz で固めて持ち帰った後, Macの漢字Talk7上の Mac MiNT (System7用のUnix環境)上の Nemacs 3.3.2+GNUS 4.1 で メールを読んでいました。..マニア!)

GNUSはサーバを ":Mail" のように指定すると mhspool.el (現在はnnmh.el) の機能で ~/Mail を読んでくれるという機能があり, 現在も使えるようですが, 実際に起動してみると, あるはずのメールフォルダが表示されません。 Gnusはその後 Nana Gnus やら September Gnus やら専門のマニアでないと付いて いけない世界に突入していたため見送っていたのですが, そろそろEmacsも枯れてきた ので大丈夫だと思い, 決意して設定してみました。
かなり色々壁があったので, 以下その過程のメモ。

・ ステップ1:

さて, まず, 例えば Thunderbird ではメールは ~/.thunderbird/*.default/Mail/Local Folders/ 以下にある一つの ファイルに mbox 形式でまとめられているので, それをバラす必要があります。 *1
これにはMHを使うと簡単です。MHは最近のLinuxには入っていないようなので, http://www.nets.ne.jp/~matsu/MH/ あたりから src.rpm をgetしてbuildします。 MHの inc コマンドは通常 /usr/spool/mail/`whoami` のメールボックスを読みますが, これは -file オプションで変えられるので, .mh_profile に Path: Mail 等を書いて おいてから,
% inc +foo-ml -file /tmp/FOO-ML
で ~/Mail/foo-ml/ にメールを inc してばらします。

・ ステップ2:

ここで Gnus を起動するわけですが, 実際にやってみると, 上のfoo-mlも何も表示 されません。この原因は, 昔のGNUSと異なり, 明示的にUをタイプしてディレクトリを 「講読」しないと表示されないことのようなので, Infoを読むと
(define-key ctl-x-map "g" 'gnus)
(setq nnmh-directory "~/Mail")
(setq gnus-select-method '(nnmh ""))
(setq gnus-options-subscribe ".*")
(setq gnus-options-not-subscribe "*draft*")
のように書くと, 自動的にフォルダが講読されるようです。

・ ステップ3:

これでメールフォルダを Gnus 5.9 で読めるようになったわけですが, 実際に読んでみると, 多くのGmail関係のメールの From: や Subject: が(none)と 表示されます。(!)
少し調べたところ, どうもこれは Gmail の付ける長い符号化されたsignatureヘッダ や, Received: が連続に連続を重ねると発生するらしく, どちらも読むためには不要なので, 下のようなスクリプトであっさりカット。そもそも nnmh は勝手に自分で管理用の ヘッダを付加するようなので, ヘッダを削ることは問題ないと思います。
#!/bin/env perl

while (<>)
{
    if (1 .. /^$/) {
        if (/^$/) {
            print_header($header);
        } else {
            $header .= $_;
        }
    } else {
        print;
    }
}
    
sub print_header
{
    my $buffer = "\n" . shift;
    my @header = split(/\n([A-Z][\w\d\-]*:) /, $buffer);
    shift @header;

    while (my ($label, $content) = splice(@header, 0, 2))
    {
        unless ($label =~ /signature/i || $label =~ /^received/i)
        {
            printf("%s %s\n", $label, $content);
        }
    }
}
ここまでやって, ようやくGnusでメールが読めるようになりました。万歳。
以前と比べて, じっくりメールを読むことは減ってきているように思いますが, こうしてオフラインでゆっくり読める環境も大事なように思います。


*1: Gnusのnnmboxを使うとmbox形式のファイルを直接読めますが, これは当然メールボックスを直接1つだけ指定することを想定しているので, こうした用途には向かないと思います。

1 days displayed.
タイトル一覧
カテゴリ分類
 なかのひと
Powered by hns-2.10-pl1, HyperNikkiSystem Project