2010-03-31

ローカルファイルを IMAP サーバに格納する

以下の手順によって,ローカルファイルを IMAP サーバに格納することができた.

Maildir 形式ディレクトリの作成

$ mkdir mdir
$ mkdir mdir/new
$ mkdir mdir/cur

格納したいファイルを添付として持つ e-mail メッセージを作成する

次に file2mime.pl を示す.引数にファイルパスを取り,標準出力にメッセージを吐く.ファイル名を Subject に,最終更新日時を Date ヘッダに格納する.メッセージ本文には,stat() 結果を格納する.Perl モジュール MIME::Lite を使用する.MIME::Litemake test を通すためには Email::Date::Format および MIME::Types が必要だった.

#!/usr/bin/perl -w

use strict;
use MIME::Lite;
use Email::Date::Format qw(email_date);
use utf8;
use Encode;
use File::Spec;

my $path = $ARGV[0];
$path or die( "Usage: $0 file" );

my @fileinfo = stat( $path )
    or die( "Could not stat $path" );

my ( $volume, $directories, $file )
    = File::Spec->splitpath( $path );

my $msg = MIME::Lite->new(
    From => 'nobody@nowhere',
    Subject => encode( 'MIME-Header-ISO_2022_JP' => $file ),
    Date => email_date( $fileinfo[9] ),
    Type => 'multipart/mixed'
    );

$msg->attach(
    Type => 'text/plain; charset=utf-8',
    Data => "stat($path):\n".join( "\n", @fileinfo )
    );

$msg->attach(
    Type => MIME::Types->new()->mimeTypeOf( $file ),
    Encoding => 'base64',
    Disposition => 'attachment',
    Filename => encode( 'MIME-Header-ISO_2022_JP' => $file ),
    Path => $path
    );

$msg->print( \*STDOUT );

次に file2mdir.sh を示す.作成した e-mail メッセージファイルの最終更新日時を元のファイルのそれと同じくする.Maidir 形式においては,ファイルのmtimeがメッセージの到着日時maildir(5)となる.

#!/bin/sh

file=1
while [ -e "${1}"/"${file}" ];
do
    file=`expr ${file} + 1`
done

perl -I`dirname "${0}"`/pm/lib/perl5/site_perl `dirname "${0}"`/file2mime.pl \
    "${2}" > "${1}"/"${file}"
touch -r "${2}" "${1}"/"${file}"

次のように実行した.

$ cd file_directory
$ find . -type f -exec file2mdir.sh mdir/new "{}" ";"

Maildir から Mbox への変換

Maildir を mbox に - technolazy.snapshot で示されている Python コードを用いて Maildir 形式のディレクトリを Mbox 形式のファイルに変換する.

$ md2mb mdir mbox

IMAP サーバへの登録

Thunderbird に mbox をインポートし (Manually importing and exporting, Importing and exporting your mail - MozillaZine Knowledge Base),IMAP サーバに送る.

2010-04-03 修正

file2mdir.sh を追加した.

以前に引用した次の Python コードでは,複数の e-mail メッセージを Mbox に正しく変換できなかった.

Maildir to Mbox – yergler.net で示されている Python コードを用いて Maildir 形式のディレクトリを Mbox 形式のファイルに変換する.リンク先ページにある Python コード中のシングルクォート文字が正しくコピーできなかった.

以前に用いた次の Python コードでは,メッセージの到着日時を正しく登録できなかった.このコードの問題なのか Gmail の問題なのかは不明.

IMAP Upload を用いて Mbox ファイルを IMAP サーバにアップロードする.

$ python imap_upload.py --gmail --box Inbox mbox

あるいは,

$ python imap_upload.py mbox imaps://user:pass@imap.gmail.com:993/Inbox