How to transfer from VMS Mail to UNIX

田島 靖久(山形大学理学部物理学科)

98/10/05 改定

vms2mh.plってなんですか。
使い方

- はじめに
動作環境
設定
実行
- 解説
- VMS Mail
VMS Mail Extract
SMTP on VMS
MH
実装

Update 情報
その他

vms2mh.plってなんですか。

このプログラムは VMS Mail にたまったメールを UNIX の動いているマシン上に
持って来て、よく使われているであろう MH で読める形式に変換する perl の
script です。MH で読める形式といっても、特別なことをしているわけではなく
一つずつメールを切り分けて順番にファイル名に番号をふるというだけです。
(header については凝ったことをしていますが詳しくは解説で。)

利点

- TAJIMAY@KEKVAXのようなFQDNでない中途半端な形にせず、headerを
可能な限りSMTPで返信できるように書き換えるので、domainが異なる
環境に持っていって返信をしてもエラーにならない。
本文についてくるSMTPでのheaderを元のheaderに戻すので本文に
無駄なheader部分がなくなる。
- 欠点
- 一度メールをファイルに展開するのでVAX/VMS上のquotaに余裕が無いと
できない。
手続きが複数に渡るため作業が面倒である。

## 使い方

### はじめに

このソフトウェアによっていかなる損害が発生しようとも田島靖久
(tajima@kgphys.kj.yamagata-u.ac.jp)は責任をとりません。御自分の責任で
使用して下さい。

### 動作環境

- このプログラムは perl を使って書かれています。ですから perl の入っていない
マシンには perl をインストールする必要があります。使用する perl の version は
手元に perl-4 のマニュアルしかないので、 perl-4 の文法以上のことは書けません
でしたので、 perl-5 でも perl-4 のどちらでも動くようです。vms2mh.plの
スクリプトはここから持って行って下さい。
- またこの作業はメールごとにファイルを作成するので VMS から移行する先の UNIX
の環境で実行したほうがよいでしょう。

### 設定

メールを取り出す VMS の環境に応じてカスタマイズが必要です。
プログラム中変数をあなたの環境にあわせて書き直してください。
変更部分は全てプログラムの初めの変数で設定することができます。
設定には難しいところやあなたのホストに特有の設定もありますので
良く分からない場合にはその VAX の管理者やネットワークの管理者に
確認して下さい。

$LOCAL_HOST
あなたの DECnet ホスト名を入力して下さい。
$MSGID_HOST
Message-Id:に使用するホスト名を入力します。本当は送った方の
FQDNを入れるのが正しいのですが、ここではMessage-Idをでっちあげる
ために使用するので、自分のホスト名を入れておけばほぼ安心でしょう。
@SMTP_ENV
Internet Mail を VMS 上で受信出来るようになっている場合、導入したソフト
ウェアの default の設定ですと届いたメールの相手のアドレスが、

- From: MX%"user@host.domain"
- のようになるはずです。ここでは使用される envelope を指定しています。
私の身近に出て来るものについては初めからいれてありますが、それ以外に
ある場合については追加して下さい。ULTRIX 等で SMTP - DECnet Mail gateway を
している場合は ULTRIX::"user@host.domain" のようなアドレスで届きますが、
これは自動的に外すようになっていますので追加する必要はありません。同様に
forward 先に届いた場合 VAXVMS::MX%"user@host.domain" のようになりますが
これも MX% のみ登録してあれば問題ありません。
%DIRECT_ADRS
直接 SMTP で送ることが出来る DECnet ホストをここに登録しておきます。
連想配列になっていますので、1項目に DECnet ホスト名、2項目に
そのホストの IP アドレスをいれて下さい。
$FWD_ADRS
直接 SMTP で送れない DECnet ホストに送るための gateway を指定します。
gateway を意識して設定をしているホストを経由する場合は
- USER%VAX.decnet@host.domain や USER%VAX.dnet@host.domain
- のような形式 (user%host.***@host.domain) で送れば VAX::USER に送られる
設定になっている場合が多いようです。ここではここの .decnet@host.domain 等を
登録しておきます。このような gateway を意識して設定していない場合は
- 'VAX::USER'@host.domain

の形式で送ることのできる可能性があります。この場合には $FWD_ADRS に
'@host.domain' を指定して、$FWD_MODE = 1; に変更しておきます。
どのようにしたら送れるかはホストの管理者に確認をして下さい。
$HEAD_SEP
RFC 822 のヘッダーが後ろに付くような場合、本文とヘッダーの間の区切りの
文字列をここにいれて下さい。複数種類の区切りには現在は対応しておりません。

### 実行

あるVMS Mailのフォルダーにある全メールをとりだします。

- VAXVMS$ mail
MAIL> select <移したいメールのあるフォルダー>
MAIL> extract /all mail.txt
- これでこのフォルダーにある全メールが mail.txt というファイルに
書きだされました。このファイルをどうにかして(ftp でも mail でも
なんでもよい。ただし ftp のときは ascii 設定を忘れないこと。) UNIX 上に
持ってきます。
- UNIX$ ls -F
mail.txt vms2mh.pl* # mail file と プログラム
UNIX$ mkdir vax_mail # メールを展開するディレクトリを作ります。
UNIX$ cd vax_mail
UNIX$ nkf -j mail.txt | ../vms2mh.pl
- このあとこのディレクトリにはメールの番号の付いたファイルがメールの
数の分だけできたはずです。
- UNIX$ ls
1 11 12 13 .... 9
- この展開したディレクトリをメールのディレクトリ(~/Mail/等)に持って
いけば読めるはずです。(動作確認はmew1.70+mh-6.8.3-jp, mew-1.92.4 on
Debian-LINUX 1.3.1で行ないました。)
- UNIX$ cd ..
UNIX$ mv vax_mail ~/Mail/
- この後の操作に付いては MH 等のマニュアルに沿って行なってください。
漢字コードは nkf などを使って環境にあわせて変えた方がよいでしょう。
VMS で作られるファイルは DEC 漢字コード(≒ EUC)です。どの漢字コードで
保存すべきかは管理者に相談をしてください。

## 解説

基本的には真面目に技術資料やマニュアルを読まずに実際のファイルやメールを
みて作りましたので、間違った理解や設定があるかもしれません。もし気づいた
点がありましたら私まで連絡を下さい。(最近真面目に RFC822 を読もうかと思い
ファイルはとってきましたがまだ読んではいません。)

### VMS Mail

extract される VMS Mail のフォーマットは

- From:\t[<HOST>::]<USER> ["<USERNAME>"] dd-mmm-yyyy hh:mm:ss.ss
To:\t[<HOST>::]<USER>[,<HOST>::<USER>...]
CC:\t[<HOST>::]<USER>[,<HOST>::<USER>...]
Subj: <SUBJECT>
<Body>
- のような形になっています。(正確には宛先には DIS file で @foo なども使える。)
また一部には <USER>@<HOST> なんていう記述のできるところもあるようです。

### VMS Mail Extract

- MAIL> extract /all <FILENAME>
- で VMS 上で作成されるファイルは
- ^L
<1番目のメール>
^L
<2番目のメール>
^L
:
^L
<n番目のメール>
- の様に改ページで分割されて出力されるようです。

### SMTP on VMS

MX のようなソフトウェアで SMTP のメールを VMS で受け取る場合、RFC 822 の
ヘッダーは

- そのままメール本文の前に付く
最後に付く
- かつては A. の形式しかなかったので、VMS Mail のヘッダーを取り除けば
そのまま RFC 822 形式のメールになるので至極簡単だったのですが、ヘッダーが
長くて本文がすぐに出て来ないとクレームがあったのでしょう、ヘッダーを最後に
持ってくるという形式のものが最近出て来ました。これによって一層
プログラムが複雑になりました。今は面倒でしたので $HEAD_SEP 以降の行が
ヘッダーであるということにしてしまいました。ですから、 $HEAD_SEP が
本文の途中に出て来ると正確に扱えません。
またアドレス表記はMXの場合 VMS Mail のヘッダーでは

- MX%"user@host.domain"
- の様に表示されます。この他に SMTP%, WINS% などがあるようです。

### MH

UNIX 上のメーラーで MH は標準設定では ~/Mail 以下に適当なディレクトリを
つくり、これをフォルダーとしてその中にはプレインテキストのメールを
番号をファイル名として入れてあるようです。
mail の mbox の形式等は良く知りませんのでそれに対応して欲しいと
いわれても知りませんので誰か教えてくれるまではできません。

### 実装

このプログラムでやっていることは

- 純粋なDECnetのみのメールの場合、ヘッダーを RFC 822 の形式に
書き直す。
Internet 経由のメールの場合、もともとのメールの形式に戻す。
- ということです。
A. の作業は具体的には
- From: 行の最後に付いている時間情報を取り去り、Date: 行を作る。
VAX Mail は曜日の情報がないので日付より計算しています。
( Date: Sat, 10 Jan 1998 01:23:45 +0900 の形式 )
まじめに作っていないので 1986 年から 2000 年までしか日付は
わかりません。それ前後が必要な場合は %year_week に年号と元旦の
曜日(Sun=0, Sat=6)の組を追加して下さい。
From: 行の最後に personal name が設定してある場合 "" を () に変更する。
RFC 822 では GECOS field は

- From: Personal Name <user@host.domain>
From: user@host.domain (Personal Name)
- の形式が許されているみたいです(最終的にちゃんと確認をしていません。)。
ここでは順番の変わらない後者の表記に変換します。
宛先を Internet で使えるアドレスにする。
宛先の書き換えは複雑になるので以下の様にしています。

もともとInternet経由で来ている場合はその部分を切り出す。

- Ex. MX%"user@host.domain" -> user@host.domain
- (普通は RFC 822 のヘッダーが付いているから変換せずに捨てているが
DECnet 経由のみで着いているが CC: に入っているときには有効である。)
DECnet 内で forward している場合
- HOST1::HOST2::HOST3::USER -> HOST3::USER

となります。
local のメールの場合ホスト名は付かない場合があるが、これは
強制的に付ける。
DECnet 経由のメールでは local のメールの場合 From: にはホスト名が
つきますが、 To: や CC: にはつきません。ここでは From: から DECnet
local host 名を取り出し、ない場合には $LOCAL_HOST をつけます。
最終的には HOST::USER の形式が残るのでこれを USER@HOST.domain に
する。

Subj: を Subject: 変更する。

です。B. については VMS Mail のヘッダーの後から次の改行のみの行が
RFC 822 ヘッダーかどうかを From:, To:, Message-ID:, Subject: で始まる行
が3行以上あるかで判断しています。いい加減ですが大抵はこれで問題ないと
思います。後ろに付く場合はヘッダーの開始行が出て来たらそれ以降
ヘッダーという解釈にしています。ですので前にも書きましたが、この開始行
が本文の途中にあると誤って解釈されます。

## 開発経緯などをつれづれなるままに

- 私は 1989年に原子核実験の研究室に所属しました。当時の素粒子原子核
業界の多くの研究室がそうであった(?)ように、使える計算機といったら
大計の大型計算機か PC9801 (当時は RA がでたころかな。)か VAX/VMS しか
ありませんでした。VAX/VMS だって当時はとっても(今は相対的にもっと)
高いので簡単に手にはいるようなものではなかったですが、運が良かったか
悪かったか研究室に入ったばっかりの μVAX3100 がありました。当時は UNIX
なんてのはこの業界では使えないものという感じがまだありましたので、
ネットワークにつながる計算機としては研究室で唯一で VMS が使えないと
実験もできないというわけでした。ですから好きだろうが嫌いだろうが VMS を
使わざるを得ないわけでそのときからメールは VMS Mail だったわけです。
VMS Mail は All in One で何でもできますので初心者にも簡単に使えますし、
凝ったことをしようとしなければフォルダーの分類も出来ますので、それ
なりに便利なメーラーでした(と個人的には思っています)。
- 時もすぎて現在、10万円もせずにかつての大型計算機をしのぐ性能の CPU
が出まわり、AT 互換機が大幅に値崩れし、フリーの PC-UNIX 全盛の時代に
なりました。 VAX/VMS は Alpha/VMS に変わりましたが、 VMS 自身が衰退の一途を
たどるようになってしまい、 DECnet のルーティングも危うくなってきています。
(もっと大変なのは DEC 自身がなくなってしまうかもしれません。)
さらに気が付くと私自身が研究室を出ていかなければならない歳にもなって
しまっており、 Mail 環境も新しいところに移さないといけないなぁ、という
ことになりました。さて過去のメールはどうしようと思ったときに VMS Mail は
ちょっとやっかいです。簡単なテキストで保存されているのではなく、専用の
フォーマットですからそう簡単には移れないようでした。実験も忙しく、面倒
だから後でいいやということにしてしまって、きっとだれか何とかうまい方法
を見付けてくれるだろうと人まかせにしておりました。
VAX/VMSにpop serverが走っている場合には全部のメールを新着にして、
pop clientで取り出せば、header等はどうなるかはよくわかりませんが、
簡単に移行できます。また、Unixではpopで取り出して、mh形式に保存する
自動スクリプトもあるようです。
また、KEK の坪山 透氏が解決法を紹介しているのが、
「KEKVAX にたまった大量のメイルを簡単にワークステーションに移す方法」
でした。詳しい内容はそちらを読んでいただくとして、簡単にいうとフォルダー
内のメールを全部をまとめてテキストファイルにして、それを UNIX に持って
いって分割すれば MH で読めるようになるということでした。ともかくこれを
使えば何とかなると思い、分割の FORTRAN のプログラムを使ってみようと
しましたが、なんか format 関係でエラーになってしまいうまくいきませんでした。
また、これらはやはりVAX/VMS上にpop serverのある特殊な環境や、あくまでもある
domain内での移動ということになっているようでした。
- また、今では多くの VMS では Commercial, Free-ware のソフトウェアのおかげで
Internet 経由のいわゆる SMTP を使ったメールも扱えるようになっています。
そこには大抵もともと(RFC 822 に沿った)のヘッダーがついていますので、
この情報を生かせば UNIX に持ってきた場合でもソート、検索がしやすくなります
ので、可能な限り SMTP できたメールは原型を取り戻したいと考えました。
私は様々なところで実験をしていて、メールアカウントも各地にありそれを
DECnet経由でforwardしていました。おかげでメールはいろんな形式で届いており、
さらにメールを置いていた東工大から出ていくことになっていたので、明かに
一筋縄ではできないようでした。そのメールをなんとかして後で不自由のない
形にして持って行きたいと思い、どんどんheaderの書き換えに凝っていって
作ったのがvms2mh.plです。この手の作業はパターンマッチングが
多いので坪山氏も書いていらっしゃるように perl で書くのが一番ということで
構想2年、方針決定1日、製作1日で初期versionは完成しました。
- 余談ですが、perl の使えるような若い人は VMS Mail なんて使わないという話
もありますが、半分はその通りだと思います。でも、とりあえず使うなら
VMS Mail が一番簡単なのではないかとも思います。rmail より簡単でしょ、
jmail + send/edit で日本語のメールもすぐ書けますし、help も充実しています
から教える手間が最小限で済みます。でも今 VMS Mail を使っている人っていうのは
どれだけいるのでしょうか。
またVMS Mail互換のUNIX上のメーラーってあるのでしょうか。
ご存知のかたがいらっしゃいましたら教えて下さい。

## Update 情報

Ver 2.4 (98/10/05)
DECnetのみで送ったメールにつかないMessage-Idをでっちあげるようにした。
Message-IdでSubjectを管理しているメーラー(Wanderlust)に対応。
繰り返して実行した場合に作成したファイルをover-writeするように改良。
Ver 2.3 (98/02/10)
(暫定公開version)
最後のメールでヘッダーが終りにつく場合にヘッダーが分離されない
bug を fix。
Ver 2.2 (98/02/02)
Header と body の分離が空行でなく空白1個のときがあったので対応。
Ver 2.1 (98/01/30)
KEKVAX の USER@VAXHST への対応。
Ver 2.0 (98/01/30)
使用者に依存する部分を変数、配列、連想記憶として分離するため
大きく書き換え。
To:, CC: の Host名の補間を自動化して VMS User の連想記憶をなくす。
VMS Subject の tab をスペースに変換していない bug を fix。
開始番号を引数にいれたときの bug を fix。
Ver 1.3 (98/01/29)
VMS User を連想記憶使って分離。
Ver 1.2 (98/01/28)
DECnet Address の補間部分の評価を正確にする。
user name の開始は `:' or `,' で終了は行末か `,' であるという判断をいれる。
Ver 1.1 (98/01/19)
DECnet Address の補間部分の変更。
Address が他の Address の一部になっている場合の対応を追加。
開始番号を任意に付けられるようにした。
Ver 1.0 (98/01/10)
初期バージョン完成。

## その他

御意見、御感想、御質問は tajima@kgphys.kj.yamagata-u.ac.jp までお願いします。
基本的には自分のメールがちゃんと移せればいいやというつもりですので
あまり大きな変更はしないかもしれませんが本人のやる気がでれば変わる
かもしれません。またこう変更したらよくなったというのはどんどん歓迎
します。このプログラムは特に著作権は主張しません。だいたいどの程度
需要があるかもよくわかりませんから。ですが、使った場合には連絡を
頂けると本人はとてもうれしくなるのでよろしくお願いします。

tajima@cyric.tohoku.ac.jp