2010年10月26日火曜日

procmailで特定のメールの広告を消して携帯に転送してみた

 便利なのでメールの一部を携帯に転送している。当然,サイズが大きいものは転送しないようにしている。他にもブラックリストがあって,そのリストにあるメールアドレスからのメールも転送しない。で,その携帯に転送しているメールの中に,警察の交通取り締まりをチェックするサイトからのメールがある。交通取り締まりをしてるのを見かけると,みんなで投稿する,ってやつ。ところが,そのサイトからのメールに広告がついてくる。最後についてくるのならいいのだが,最初に入っている。そのため,携帯の通知メールには広告しか入れず,肝心の情報を得るにはサーバーからメールのメインパートをダウンロードしてこないといけない。それって余計にお金がかかるってことやん。そこで,メールの先頭の広告を削ってから携帯に転送をかけようと考えた。今回はその顛末を書こう。

まずは ~/.procmailrc で procmail の設定を書こう。
SENDMAIL=/usr/sbin/sendmail
KEITAI=yyyyy@docomo.ne.jp
....
....
....
# ************************************************
# 携帯に転送する xxxxx@gmail.com 宛メールの処理
:0
* ^(To|Cc).*xxxxx@gmail.com
| /home/aaaa/bin/rm_ad_advert.pl | $SENDMAIL -oi $KEITAI
ここで$KEITAIは携帯のメールアドレス,$SENDMAILは sendmail コマンドをフルパスで指定している。また,メールは gmail へ送られたものを,このサーバーに転送して処理をさせている。

 最初の「:0」が処理の開始を示している。次の「* 」で始まる行で該当するメールを正規表現で判定している。ここでは,「To」フィールドまたは「Cc」フィールドが「xxxxx@gmail.com」となっているメールを対象にしている。その次の行が肝心の処理をしている部分で,パイプでメールを外部スクリプトに送り込み,その結果を sendmail コマンドで携帯に転送している。

 では,肝心の処理スクリプトの中身はというと以下のようにしてみた。
while (<STDIN>) {
$input = $_;
chomp($input);

if ($input =~ /^\[PR\]/) {
    while (<STDIN>) {
        $input = $_;
        chomp($input);
        if ($input =~ /\x21\x3d\x21\x3d\x21\x3d\x21\x3d/) {
            $input = <STDIN>;
            chomp($input);
            last;
        }
    }
}

if ($input !~ /\x21\x3d\x21\x3d\x21\x3d\x21\x3d/) {
    if ($input ne '') {
        print $input."\n";
    }
} else {
    exit;
}
}
まず,パイプ処理で入力させるので,読み込むファイルは標準入力から読み込む。そのため「<STDIN>」で読み込んでいる。後は,先頭が「[PR]」で始まる行があれば,それ以降を数行読み飛ばして捨てている。広告の終わりは全学のロングダッシュ「―」が並んでいる行なのだが,その判定条件として「¥x21¥x3d」を用いている。これは JIS コードでの「―」を表している。そのまま「―――――」と記述しても,マッチしないとして広告の後ろの部分が全部処理されずに終わってしまった。文字コードは難しいねぇ。また,肝心の取締り情報の終わりもロングダッシュが複数並んでいるので,それ以降は処理しないで終了している。

0 件のコメント: