メールの署名
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でさくっと書く。
CPANのFile::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>