以下の手順によって,ローカルファイルを IMAP サーバに格納することができた.
Maildir 形式ディレクトリの作成
$mkdir mdir
$mkdir mdir/new
$mkdir mdir/cur
格納したいファイルを添付として持つ e-mail メッセージを作成する
次に file2mime.pl
を示す.引数にファイルパスを取り,標準出力にメッセージを吐く.ファイル名を Subject
に,最終更新日時を Date
ヘッダに格納する.メッセージ本文には,stat()
結果を格納する.Perl モジュール MIME::Lite
を使用する.MIME::Lite
の make 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