メールの署名

30分プログラム、その172。メールの署名リストを作る。

昨日に続いてメールねた。今度は、みんなの署名をリストアップしてみる。

署名の抽出

署名は、「-- 」のあとにあると信じておく。一応RFCにもある載っている内容らしい。

で、Apple Mailでは次のような形で保存されている。

3557      
Delivered-To: mzp@example.com
Received: by 10.142.192.5 with SMTP id p5cs64719wff;
        Thu, 4 Oct 2007 00:47:45 -0700 (PDT)
.....
.....

これはテストメールです。
-- 
MIZUNO Hiroki<mzp@example.com>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" \
     "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>color</key>
	<string>b85895</string>
	<key>flags</key>
	<integer>10251140097</integer>
	<key>original-mailbox</key>
	<string>imap://mzp%40example.com/INBOX</string>
	<key>remote-id</key>
	<string>53</string>
</dict>
</plist>

なので、"-- "からXML宣言までを取り出す。これぐらいならsedで十分。

s/^<?xml.*//g
s/<!DOCTYPE.*//g
/^-- $/,/^$/p

で、今後のことを考えて署名を別々のファイルとして取り出す。ついでに空ファイルを削除する。

$ for i in *.emlx \
sed -n -f sign.sed $i > sign/$i

$ rm-empty sign

rm-emptyは昔書いたシェルスクリプト

#!/bin/sh
find . -size 0 ! -name '*.svn*' -exec rm {} \;

重複の削除

上記で取り出した署名には重複が大量にあるので、それを削除する。
ファイル版uniqのようなものがあればいいのだけれども、残念ながら知らないので、Perlでさくっと書く。
CPANFile::Find::Duplicatesを使えば簡単に書ける。

#! /usr/bin/perl
# -*- mode:perl; coding:utf-8 -*-
#
# funiq.pl -
#
# Copyright(C) 2007 by mzp
# Author: MIZUNO Hiroki <hiroki1124@gmail.com> 
# http://mzp.sakura.ne.jp/
#
# Timestamp: 2007/11/02 23:26:54
#
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
#

use strict;
use warnings;
use File::Find::Duplicates;

sub uniq(@){
    do{
	my %s;
	grep { !$s{$_}++ } @_
    };
}

my @dupes = find_duplicate_files('/Users/mzp/tmp/sign','/Users/mzp/tmp/sign');

for my $dupset (@dupes){
    my @files = uniq sort @{$dupset->files};
    shift @files;
    if(@files){
	print "@files\n";
	map {unlink $_} @files;
    }
}

結果

-- 
======================================================================
Shop hoge hogeのためのお店
  http://example.com
 0120-xxx-xxx       お客様専用フリーダイヤル
  072-xxx-xxx        業者の方はこちらにおかけ下さい。

-- 
YAMADA Ichiro<foo@example.com>

-- 
YAMADA Ichiro<bar@example.com>

-- 
Ichiro YAMADA
<baz@example.com>

-- 
YAMADA Ichiro

-- 
YAMADA Ichiro<baz@example.com>