メールの署名
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>