« 砂時計にハマっています | トップページ | ℃-ute関連の話題は・・・ »

MOPTERMからOutlook Expressへのメール移行 《送信メール編》

前回に引き続きMOPTERMからOutlook Expressへのメール移行についてですが、今回は送信メールの移行について考えてみます。

送信メールの移行に関しては難航しましたが、概ねメドがついたのでまとめてみます。
例によってMOPTERMを知らない人にとっては全く意味不明だと思いますし、今回はかなりの長文になりますので、別ページにします。

さて、送信メールの移行ですがあらかじめお断りしておきますと、この作業にはDOS窓での操作とエディタ(メモ帳で構いません)の操作が必要になりますので、最低限それらが使えるスキルがあることが前提となります。
今回はGUIのツール類などが使えないため、基本的にはコマンドでの操作となる点をご了承下さい。

MOPTERM(NYAN/E2)での送信メールログは受信メールと同様にMAILフォルダに保存されていますが、受信メールと大きく異なるのは一つのログファイルではなくメール単位でファイルが分かれている点です。
つまり、過去に100通メールを送ったとすると、100個の送信メールログファイルが保存されています。(ただし後述する例外があるので100個より少ない可能性もあります)

Outlook Expressに移行する際の最終形は、前回の受信メールのときと同様にemlファイルにしてOutlook Expressにドラッグして取り込むことを前提としても、いくつかの問題点があります。

1.送信メールログファイルのフォーマットが「ニフティ宛」「インターネット宛」で異なる

これは、先頭2行のヘッダ部分に記載されている「SUB:」や「TO:」が「ニフティ宛」のメールの場合は1行目に「SUB:」2行目に「TO:」なのですが、「インターネット宛」の場合1行目に「TO:」で2行目に「SUB:」がくる形になっています。

2.原則は1通の送信メールから1つの送信メールログが作成されますが、送信メールログのファイル命名規則の都合上、複数年をまたがる同一日の送信メールログは1つのファイルにまとまってしまう

言葉で説明するとややこしいですが、以下のようなパターンです。
2000年5月21日に送信されたメールの送信メールログファイルは、「相手のメールアドレス+拡張子521」のような名前で保存されます。
相手のメールアドレスがnakky@nifty.ne.jp  の場合は「nakky.521」というファイル名です。
この命名規則ですと、月日は拡張子で区別できるので年間では重複しませんが、翌年の2001年5月21日に同じアドレスにメールを送った場合はファイル名が重複するため、同じ「nakky.521」に「追記」される形になります。
このような例外があるため、100通メールを送ったとしても複数年に渡るログでたまたま2年連続同じ日に同じ相手にメールを送った場合、その分だけ送信ログファイル数は少なくなります。
また、年をまたがなくても、同じ日に同じ相手に2通メールを送った場合も同様に1つのファイルとして保存されます。

前置きが長くなりましたが、簡単にまとめますと以下のような手順が必要になります。

手順1:送信メールログファイルを全件調査して、1ファイルに複数の送信メールが含まれている場合はそのメールごとにファイルを切り出す。
※これで、1ファイル/1メールという形式に統一されます。

手順2:手順1で作成された送信メールログファイルをeml形式に変換する。

手順は2つですが、これを手作業でやるのはかなり大変です。(笑)
となると、受信メールを移行したときのように何かツールを利用できればいいのですが、ネット上を探してもなかなか目的を実現できるツールに巡り会えませんでした。
(テキストファイルの分割ツールや置換ツールを駆使する手もありそうでしたが、置換条件が結構複雑なので、なかなか難しいと思います)

そんなわけで、送信メールの移行についてはスクリプトを自作することにしました。
需要はほとんどないと思いますが(笑)公開しておきます。
なお、スクリプトはWSH(Windows Script Host)を使っていますので、XPなどのDOSプロンプトが使用できる環境であれば簡単に実行できます。
また、スクリプト自体は個人的に移行のために書いたものですので、記述がエレガントではない、とか、細かなエラーチェックなども行っていないため、その点ご了承ください。

移行作業のフォルダ構成は以下を推奨します。

work --- org  ※送信メールログファイルをこのフォルダにコピーしておきます
         |
          +-out  

ちなみにworkの上位フォルダ、ドライブレターなどは任意で構いません。
work以下のフォルダ名も任意でOKですが、ここで説明する際に使用しますので、適時読みかえて下さい。

まずは以下のソースファイルをコピペで、メモ帳などのテキストエディタに貼り付けてcut.vbsという名前でworkフォルダに保存して下さい。
同様に次のソースファイルもコピペでメモ帳などに貼り付けてconv.vbsという名前で
workフォルダに保存して下さい。
77行目のメール送信元の情報は必要に応じて自分の名前、メールアドレスに変更して下さい。
※ただし、後述しますがOutlook Expressのデフォルト表示ビューの関係で、移行した送信メールの送信者を宛先と同じにしたい場合は、79行目の先頭のシングルコーテーションを外して有効にし、77行目の先頭にシングルコーテーションを付けてコメントアウトして下さい。

'----- 以下のソースをエディタにコピペして、cut.vbsの名前で保存 ----- 

tergetFolder=WScript.Arguments.Item(0)
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Dim cnt
'指定フォルダ内ファイルを取得
set objFolder = objFSO.GetFolder(tergetFolder)

For Each Path in objFolder.Files

WScript.StdOut.WriteLine Path & "処理開始"

Set objInput = objFSO.OpenTextFile(Path, 1)

'先頭行を取得
tempLine=objInput.ReadLine

'先頭行がSUB:かどうかでニフ宛かインターネット宛か判断
If Left(tempLine,4)="SUB:" Then
  sepWord="SUB"
Else
  sepWord="TO:"
End If

cnt=1
Do Until objInput.AtEndOfStream
  Set objOutput = objFSO.OpenTextFile(Path & ".out" & cnt, 2, True)

'If cnt=1 Then
'  objOutput.WriteLine tempLine1
'End If

'メール本文出力
  Do
     objOutput.WriteLine tempLine
     tempLine = objInput.ReadLine
  Loop Until (Left(tempLine,3)=sepWord Or objInput.AtEndOfStream)
  objOutput.Close
cnt=cnt+1
Loop

objInput.Close

WScript.StdOut.WriteLine Path & "処理終了"

next

'----- ここまでcut.vbs -----


'----- 以下のソースをエディタにコピペして、conv.vbsの名前で保存 ----- 
tergetFolder=WScript.Arguments.Item(0)
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
'指定フォルダ内ファイルを取得
set objFolder = objFSO.GetFolder(tergetFolder)

'メールヘッダの月を変換するための配列
Dim str(12)
str(1) = "Jan"
str(2) = "Feb"
str(3) = "Mar"
str(4) = "Apr"
str(5) = "May"
str(6) = "Jun"
str(7) = "Jul"
str(8) = "Aug"
str(9) = "Sep"
str(10) = "Oct"
str(11) = "Nov"
str(12) = "Dec"

For Each Path in objFolder.Files

WScript.StdOut.WriteLine Path & "処理開始"

Set objInput = objFSO.OpenTextFile(Path, 1)
Set objFile=objFSO.GetFile(Path)
Set regEx=New RegExp
regEx.pattern="SUB:"
repStr="Subject: "

'最終行を取得
Do Until objInput.AtEndOfStream
    strNextLine = objInput.ReadLine
    If Len(strNextLine) > 0 Then
        lastLine = strNextLine
    End If
Loop
objInput.Close

'バイナリメール以外を判断
If lastLine <> "(バイナリメール)" Then

Set objOutput = objFSO.OpenTextFile(Path & ".eml", 2, True)

'最終行から日付データのみ取得
lastLineDate=Mid(lastLine,2,23)

Set objInput = objFSO.OpenTextFile(Path, 1)
'先頭行、2行目を取得
tempLine1=objInput.ReadLine
tempLine2=objInput.ReadLine

'先頭行がSUB:かどうかでニフ宛かインターネット宛か判断
If Left(tempLine1,4)="SUB:" Then
  mailType="nifty"
Else
  mailType="INET"
End If

If mailType="nifty" Then
  repLine=regEx.Replace(tempLine1, repStr)
  toLine=tempLine2
Else
  repLine=regEx.Replace(tempLine2, repStr)
  toLine=tempLine1
End If

'メールヘッダ出力
objOutput.WriteLine "X-NIFTY-Status: NORMAL"
objOutput.WriteLine repLine
objOutput.WriteLine "Message-ID: "
objOutput.WriteLine "Date: " & Mid(lastLineDate,9,2) & " " & str(CInt(Mid(lastLineDate,6,2))) & " " & Left(lastLineDate,4) & " " & Right(lastLineDate,8)
objOutput.WriteLine toLine

'メール送信元を自分の名前・アドレスにしたい場合は以下に自分の情報を記載して行を有効にする
objOutput.WriteLine "From: 中島 早貴 <nakky@nifty.ne.jp>"
'メール送信元を送信先と同じにしたい場合は以下の行を有効にする
'objOutput.WriteLine "From: " & Mid(toLine,4)

objOutput.WriteBlankLines 1
'メール本文出力
Do Until objInput.AtEndOfStream
    tempLine = objInput.ReadLine
    objOutput.WriteLine tempLine
Loop

objInput.Close
objOutput.Close
WScript.StdOut.WriteLine Path & "処理終了"

Else
WScript.StdOut.WriteLine Path & "バイナリのためスキップ"
End If

next

'----- ここまでconv.vbs -----

変換元となる送信メールログファイルをMOPTERM¥MAILフォルダから上記のorgフォルダにコピーしておいて下さい。
ちなみにこの際に「受信メールログファイル」やその他「送信メールログではないファイル」はコピーしないで下さい。
MOPTERM¥MAILフォルダには受信メールログと送信メールログが混在して保存されていますので、目視で判断して「送信メールログファイル」のみorgフォルダにコピーして下さい。
多くの場合、送信メールログファイルは「宛先アドレス+日付の拡張子」というファイルになっていると思います。
ただし、10月~12月の送信メールログファイルは拡張子がa01~c31のようになっていますが、これらのファイルも送信メールログファイルです。
拡張子がLOGのファイルはおそらく受信メールログファイルですので、コピーしないようにして下さい。

orgフォルダに送信メールログをコピーし、cut.vbsとconv.vbsのスクリプトファイルをworkフォルダに保存しましたら、DOSプロンプトを開きworkフォルダまで移動します。
カレントディレクトリの移動はCDコマンドですが、このあたりの説明は省略させて頂きます。(DOSのリファレンスなどを参照して下さい)

DOS窓でカレントディレクトリをworkにした後、以下のコマンドを実行します。

C:\work>cscript cut.vbs org

このコマンドを実行すると、orgフォルダの全てのファイルに対して手順1の処理を行います。
切り出したファイルもorgフォルダに出力しますので、実行後はorgフォルダのファイルが倍くらいに増えているはずです。
切り出した出力ファイルは元のファイル名(拡張子含む)にプラスされて「.out1」などの文字が付加されたファイル名となっています。
1ファイルに複数メールがあった場合はout1、out2のように連番が付加されて複数ファイルに分割されます。

次に、この出力された「.out1」などoutのついたファイル”のみ”をoutフォルダにコピーします。
この際、orgフォルダにある変換元ファイルはコピーせずに、出力されたoutファイルのみコピーして下さい。
この段階で、outフォルダには拡張子がout1やout2だけのファイルが入っている状態です。(ここに数字のみの拡張子ファイルが入っている場合は、変換元ファイルが混ざっている状態ですので、削除して下さい)

準備ができましたら以下のコマンドを実行します。

C:\work>cscript conv.vbs out

このコマンドを実行するとoutフォルダの全てのファイルに対して手順2の処理を行います。
手順1で作成されたoutファイルに対して、emlファイルへの変換処理を行い、新たに拡張子「.eml」が付加されたファイルがoutフォルダに作成されます。

ここまで正常に処理が完了すれば、あとはoutフォルダに作成された「emlファイル」のみを全て選択して、Outlook Expressの任意のフォルダにドラッグすれば移行完了です。

※「Outlook Expressの送信済みフォルダ」以外に上記emlファイルを移行する場合は、表示ビューが「宛先」ではなく「送信者」と表示されるのがデフォルトのようですのでOutlook Expressの表示ビューの設定を変更するか、convスクリプトを編集して送信者を宛先と同じにしてしまうことで対処できます。

まぁ、ここまで長文で書きましたが、おそらく友人の1名にしか役に立たない情報のような気がします。(笑)
そもそもこの時期にMOPTERMからOutlook Expressにメールデータ移行するという需要があるとは考えにくいので(^^;;;
ちなみに送信メール移行のときにも書きましたが、Windows版MOPTERMのデータでしか検証しておりませんので、TOWNS版では未確認です・・・。
ただ、スクリプト自体はそんなに難しくないので、環境に合わせて変更してみるのも手だと思います。

|

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/13884/41278714

この記事へのトラックバック一覧です: MOPTERMからOutlook Expressへのメール移行 《送信メール編》:

コメント

コメントを書く




コメントは記事投稿者が公開するまで表示されません。