2012年3月24日土曜日

mboxから重複メールを削除

昨日見つけたツールは捌ける数が
max a few hundred at the time
とのことなので、4万通以上のメールが誤操作で更に4倍ほどに膨れ上がった今となっては、とても使えない。なので、エクスポートしたmbox形式のメールアーカイブから、重複メールを取り除くフィルタをRubyで書いた。

#!/usr/bin/ruby
require 'digest/md5'
class Msg
  def initialize
    @str = ''
    @id = nil
    @eoh = nil
  end
  def <<(line)
    @str << line
    unless @id or @eoh
      if line =~ /^$/
        @eoh = true
      elsif line =~ /^Message-ID:\s*(.+)$/i
        @id = $1
      end
    end
  end
  def id
    if @id
      @id
    else
      Digest::MD5.digest(@str)
    end
  end
  def to_s
    @str.dup
  end
end
ids = {}
msg = nil
while line = gets
  if line =~ /^From /
    if msg
      id = msg.id
      unless ids.include?(id)
        ids[id] = true
        print msg
      end
    end
    msg = Msg.new
  end
  msg << line if msg
end
print msg if msg and (not ids.include?(msg.id))
これをmbuniqという名前でパスの通ったところに置いて、実行属性を与えてから
% mbuniq <original mbox file(s)> > <new mbox file>
と実行すると、<original mbox file(s)>から重複メールを取り除いた<new mbox file>ができる。これを適当なMUAでインポートすればOK。

メールの同一性はMessage-IDでが同じかどうかで確認している。Message-IDが見つからない場合は、代わりにハッシュ(MD5)値を用いる。当然ながら、大事なメールはバックアップを取ってから使うべし。

Bloggerってファイルを添付できないのかいな?

0 件のコメント:

コメントを投稿