Becky2 -> Thunderbird の移行

 長らくBecky2を使っていたのですが、Thunderbirdに移行することにしました。

Becky!2 から Mozilla Thunderbird への移行を参考に、CircleBecky plug-inを使って、mbox形式で、メールフォルダを一括エクスポートします。



Thunderbirdのメールフォルダの構造は、次のようになっています。

○○○
○○○.msf
○○○.sbd
 +-- △△△
 +-- △△△.msf
 |    +-- □□□
 |    +-- □□□.msf
 |    +-- □□□.sbd
 |         +-- △△△
 |         +-- △△△.msf
 +-- □□□
 +-- □□□.msf

ひとつのメールフォルダに対して、3つのファイルが割り当てられています。各ファイルの役割は次のとおりです。

  • メールボックス本体
    • 拡張子のない、mbox形式のファイルです。ファイル名がメールフォルダの名前になります。
  • 管理情報
    • 拡張子が".msf"のファイルです。自動で作成されます。
  • サブフォルダ
    • 拡張子が".sbd"のフォルダです。サブのメールフォルダがある場合にのみ、存在します。

この形式は、エクスポートしたデータとは合っていません。そこで、これに合わせるためのPythonスクリプトを用意しました。src-dirとして、エクスポートしたデータ全体を含むフォルダを指定し、dst-dirに何か適当な名前を指定して、このスクリプトを実行します。dst-dirを作成して、その中にThunderbirdの形式に合わせたデータを作成します。

# -*- coding: utf-8 -*-
#
# Becky2からThunderbirdへのデータ移行スクリプト
#
# Usage: b2t.py src-dir dst-dir
#

import sys, os
from os.path import *
from shutil import copyfile, move

flag_force = True
encoding = sys.getfilesystemencoding()

def _(s): return unicode(s, encoding)
def mknod(path): open(path, 'w').close()

src_root = _(abspath(sys.argv[1]))
dst_root = _(abspath(sys.argv[2]))

if not isdir(src_root):
    print u"<%s>ディレクトリが存在しません。" % src_root
    exit()

if dst_root.startswith(src_root):
    print u"<%s>は<%s>の下にあります。" % (_(sys.argv[2]), _(sys.argv[1]))
    exit()

if lexists(dst_root):
    if not flag_force:
        print u"<%s>ディレクトリがすでに存在しています。" % dst_root
        exit()
else:
    os.mkdir(dst_root)

base = basename(src_root)
for root, dirs, files in os.walk(src_root):
    dst_dir = dst_root + "\\" + base + root[len(src_root):]
    if len(dirs) > 0:
        os.mkdir(dst_dir)
    for file in files:
        if file.endswith(".mbox"):
            src_path = root + "\\" + file
            #dst_path = dst_dir + "\\" + file
            if len(dirs) == 0:
                dst_path = dst_dir
            else:
                dst_path = dst_dir + "\\" + file[:len(file)-len(".mbox")]
            copyfile(src_path, dst_path)

dirs = []
for root, dir, files in os.walk(dst_root):
    if root <> dst_root:
      dirs.append(root)
dirs.reverse()
for d in dirs:
    move(d, d+".sbd")

for root, dirs, files in os.walk(dst_root):
    if root <> dst_root:
        mknod(root[:len(root)-len(".sbd")])

Thunderbirdのメールフォルダのありかは、Vistaの場合、次のようになっています。この下に、dst-dirの下のデータをコピーして、Thunderbirdを再起動すると、エクスポートしたメールフォルダが見えるようになっているハズです。

C:\Users\<ユーザ名>\AppData\Roaming\Thunderbird\Profiles\<ランダムな文字列>.default\Mail\Local Folders