=====BEGIN: mime_pls.doc 1997/12/30 《mime_pls Ver.2.02について》 ◎mime_plsとは mime_plsは、MIME encode/decodeのためのperl libraryです。メッセージ ヘッダフィールド中の日本語文字列のMIME encode/decode(RFC2047参照)と、 メッセージボディのBase64形式およびQuoted-Printable形式のencode/decode (RFC2045参照)の機能をPerlの関数として提供します。 メッセージヘッダフィールド中の日本語文字列のMIME化はISO-2022-JPの B-encodingのみをサポートします。EUCまたはShiftJISの日本語文字列は ISO-2022-JPに自動変換され、B-encodingによりMIME encoded-wordに変換 されます。また、MIME encoded-wordをデコードする際に出力漢字コードを 指定すると、ISO-2022-JPコードをEUCコードやShiftJISコードに変換して 出力することができます。 DOSマシン等の小メモリマシンで使用できるように、mimer.plとmimew.plの 2つのライブラリファイルに分割しました。総称名としてはmime_pls(まいむ・ ぷるす)と名付けます。 このドキュメント以外に各ファイルの先頭にもドキュメントを付けたので 参照してください。 ◎WWW上のmime_plsのページについて mime_plsのページ を公開 しました。このページでは、mime_plsについての情報提供とmime_plsの配布 を行ないます。 ◎バージョン番号の調べ方 Ver.2.02からは、mime_plsライブラリを使用するスクリプトがmimer.plと mimew.plのバージョンをそれぞれ調べることができるように$mimer_version と$mimew_versionの2つの変数を定義しています。 これらの変数は、値として浮動小数点数を持ちバージョンが上がるにした がって単純増加することが、今後のバージョンにおいても保証されます。 ◎再配布について このライブラリを利用したアプリケーションを書かれた場合には、このライ ブラリそのものを添付していただいて構いません。ただし、必ず本ドキュメン トを含む配布ファイルを全て添付してください。 改変して再配布する場合はライブラリファイル中の「配布条件」に従ってく ださい。 ◎無保証 このプログラムを使用することにより生じた損害については、作者はいかな る理由においても責任を負いません。使用される方の責任においてお使いくだ さい。 ◎配布ファイルについて ■ドキュメントファイル ◆mime_pls.doc このファイルです。 ◆history これまでの変更履歴を記述したドキュメントです。 ◆HTML形式ドキュメントファイル WWW上のページで公開しているHTML文書です。 ■mimer.pl require することにより、&mimedecode, &bodydecode, &bdeflush の3つ の関数が使用できます。Ver.2.02から、$mimer_versionを参照することに よりバージョン番号を調べることができるようになりました。 ◆&mimedecode($string,$kout) $string中のencoded-wordのうち、charset=ISO-2022-JP,encoding=Bの ものを選択的にデコードし、$koutの指定にしたがって漢字コード変換を 行なった結果を返します。 $koutは"SJIS"または"EUC"が有効です。$koutを省略した場合、または 有効な指定がされなかった場合はISO-2022-JP(いわゆる7bit JIS)を返し ます。 RFC2047に基づき、encoded-wordにはさまれたLWS(空白、タブ文字、 改行+タブまたは空白)は削除します。デコードのあと、ISO-2022-JP (RFC1468)で定義されたエスケープシーケンスのうち不要なものがあれば 削除します。 ◆&bodydecode($encoded,$coding) $codingが"b64"に等しいか指定しない場合は、$encodedに入れられた 文字列をMIME Base64形式のデータとみなしてデコードし、その結果を 返します。Base64 alphabet(A-Za-z0-9+/=)以外の文字が存在しても単に 無視して処理します。 Base64のデコードは4バイト単位に行われるので、半端な部分(最後の 1〜3バイト)はバッファに保存され、次にこの関数が呼び出された時に いっしょにデコードされます。バッファをクリアするには&bdeflush関数 を使用します。 $codingが"qp"に等しい場合は、$encodedに入れられた文字列をMIME Quoted-Printable形式のデータとみなしてデコードし、その結果を返し ます。 ◆&bdeflush($coding) $codingに"b64"または"qp"を指定することにより、エンコード形式と してBase64またはQuoted-Printableを選択することができます。$coding を指定しなかった場合はBase64を選択したとみなされます。 &bodydecode関数によりバッファに保存されたデータを(Base64の場合は 最後に適当なpad文字'='を仮定して)デコードしその結果を返します。 この関数が呼ばれると&bodydecodeのバッファがクリアされます。 ■mimew.pl requireすることにより、&mimeencode,&bodyencode,&benflushの3つの 関数が使用できます。Ver.2.02から、$mimew_versionを参照することにより バージョン番号を調べることができるようになりました。 ◆&mimeencode($string) $string中の日本語コードの部分をISO-2022-JP(いわゆる7bit JIS)に 変換したあとMIME ecoded-word(RFC2047参照)に変換し、その結果を返し ます。 ShiftJISコードとEUCコードが同じ行にある場合を除き、文字コードは 自動的に判別します。エンコードされるISO-2022-JPのエスケープシーケ ンスはライブラリファイル(mimew.pl)の最初の方で設定できます。 $string中のShiftJISまたはEUCの文字列を正常にISO-2022-JPに変換し エンコードするためには、英語版のPerlを使用する必要があります。 encoded-wordがASCII文字や特殊文字と直接接することを避けるために、 必要に応じて空白を挿入します。encoded-wordがコメントの内側にある場 合は例外扱いとして括弧との間に空白を挿入しません。 長い日本語文字列は必要に応じて分割してエンコードし、また必要に応 じてencoded-wordの前後で折り返し(行分割)処理をします。 ◆&bodyencode($data,$coding) $codingが"b64"に等しいか指定しない場合は、$data中のデータをBase64 エンコードしその結果を返します。$codingが"qp"に等しい場合は、$data 中のデータを Quoted-Printableエンコードしその結果を返します。 Base64エンコードの場合は出力1行(デフォルトでは72バイト)に相当する 単位(デフォルトでは54バイト)毎、Quoted-Printableエンコードの場合は 元データの論理行(改行コードによる行)毎に処理します。$dataのうち半端 な部分はバッファ中に保存され、次の呼び出し時にいっしょにエンコード されます。バッファをクリアするには&benflush関数を使用します。 ◆&benflush($coding) $codingに"b64"または"qp"を指定することにより、エンコード形式として Base64またはQuoted-Printableを選択することができます。$codingを指定 しない場合はBase64を選択したとみなされます。 &bodyencode関数がバッファに保存したデータを選択した形式でエンコード しその結果を返します。Base64の場合は、エンコード結果が4の倍数長になら なければ必要に応じてpad文字'='を追加します。 この関数が呼ばれると&bodyencodeのバッファがクリアされます。 ■ライブラリを使用したスクリプト ◆rmime mimer.plを使用してMIME headerをデコードするフィルターです。 使い方:[[j]perl] rmime [ -s | -e | -j ] [ファイル ...] ◆wmime mimew.plを使用してヘッダフィールド中の日本語文字列をエンコード するフィルターです。 使い方:[[j]perl [-Llatin]] wmime [ファイル ...] ◆rbody mimer.plを使用してMIME Base64/Quoted-Printable形式のデータを デコードするフィルターです。DOSマシンのように使用できるメモリ が少ない環境でも動作するようにメモリ使用を抑えて作ってあります。 使い方:[[j]perl] rbody {-q|-b} [ファイル ...] ◆wbody mimew.plを使用してデータをMIME Base64/Quoted-Printable形式で エンコードするフィルターです。DOSマシンのように使用できるメモリ が少ない環境でも動作するようにメモリ使用を抑えて作ってあります。 使い方:[[j]perl] wbody {-q|-b} [ファイル ...] ■Makefile mimer.pl,mimew.pl,rmime,wmime,rbody,wbodyをインストールする際に 使用します。他には、ratやtar+gzip(or compress)+uuencodeで配布用の アーカイブを作成する機能があります。 作者の環境(SunOS4.1.3)で使うためのMakefileなので、他の環境(特に UNIX系以外の環境)ではうまく動かないかもしれません。 --- 生田 昇 =====END =====BEGIN: history <> 1997.12.30 Ver.2.01 → Ver.2.02 : (1) mimer.plとmimew.plにバージョンを表わす変数 $main'mimer_version と$main'mimew_versionをそれぞれ追加した。 (2) ドキュメント(mime_pls.doc)を大幅に見直した。 (3) HTML形式のドキュメントをパッケージに添付した。 Ver.2.00alpha → Ver.2.01 : (1) MIME Quoted-Printableのbody encode/decode機能を追加した。 具体的には、mimer.plに&qpdecode関数を追加して&bodydecode関数 から呼ばれるようにした。また、mimew.plに&qpencode関数と&qphex 関数を追加し、&bodyencode関数および&benflush関数から呼ばれる ようにした。 これに伴い、&bodydecode関数、&bdeflush関数、&bodyencode関数、 &benflush関数がBase64とQuoted-Printableの両方に対応したので、 それぞれエンコード形式を表わす引数を追加した。 (2) rbody,wbodyプログラム(Ver.0.02)をQuoted-Printable対応にした。 Ver.1.11a → Ver.2.00alpha : (1) MIME Base64のbody encode/decode機能を追加した。具体的には、 mimer.plに&bodydecode関数と&bdeflush 関数を、mimew.plに &bodyencode関数と&benflush関数を追加した。 (2) ライブラリの使用例として、rbody,wbodyプログラム(Ver.0.01)を 添付した。 Ver.1.11 → Ver.1.11a : (1) wmimeで、Mime-Version:ヘッダとContent-Type:ヘッダを付加する 機能をオプションとした。(デフォルトでは付加しない。) (2) インストールとアーカイブ作成用のMakefileを添付した。 Ver.1.10 → Ver.1.11 : (1) 行の先頭に長い日本語文字列があるときに分割エンコードされないバグ を修正した。(mimew.pl) (2) ISO-2022-JPのエスケープシーケンスの扱いを変更した。 ・デコードしたあと、不必要なエスケープシーケンスを削除するように  した。(mimer.pl) ・エンコードする前に、不必要なエスケープシーケンスを除去するよう  にした。Ver.1.10では(不要な)エスケープシーケンスのところで分割 エンコードしていたが、Ver.1.11では行の長さだけを考慮して分割する ようになった。(mimew.pl) (3) rmime,wmimeで、メッセージ本文が大きいと大量のメモリが必要になる (と思った)ので小メモリマシンでも実行できるように修正した。 Ver.1.00 → Ver.1.10 : (1) ISO-2022-JPのエスケープシーケンスの扱いを変更した。 ・無駄なエスケープシーケンスが入っていても正常に扱えるようにした。  (2バイトモード中でのESC-$-Bなど) ・エスケープシーケンスが連続している場合は最後のものだけを残して  残りを削除するようにした。 (2) RFC1522の仕様に完全対応した。(…と思う) ・エンコード時に、長い日本語文字列は分割してエンコードするように  した。また、長い行はencoded-wordの前後で折り返し(行分割)処理を するようにした。 ・デコード時には、encoded-wordにはさまれたLWS(ここでは、スペース、  タブ、折り返し[改行+(スペースまたはタブ)]を指す)を除去するよう にした。 (3) ライブラリの使用例として、rmimeとwmimeの新版を添付した。 (4) JISコードからSJISコードに変換する部分のバグを修正した。 =====END =====BEGIN: Makefile ## Makefile for mime_pls (install & archive) INSTALL_DIR = /usr/local LIB_DIR = $(INSTALL_DIR)/lib/perl BIN_DIR = $(INSTALL_DIR)/bin APPLICATION = rmime wmime rbody wbody LIBRARY = mimer.pl mimew.pl DOCUMENT = mime_pls.doc history Makefile \ index.html document.html history.html ARCHIVE = mime_pls202 CSUF = gz SUF = tgz TAR = tar COMPRESS = gzip INSTALL = install -c RENAME = mv all: rats archive install: $(APPLICATION) $(LIBRARY) $(INSTALL) -m 755 -o root $(APPLICATION) $(BIN_DIR) $(INSTALL) -m 644 -o root $(LIBRARY) $(LIB_DIR) uninstall: cd $(BIN_DIR);\ rm -f $(APPLICATION) cd $(LIB_DIR);\ rm -f $(LIBRARY) rats: $(ARCHIVE).rat $(ARCHIVE).rat: $(APPLICATION) $(LIBRARY) $(DOCUMENT) rat $(DOCUMENT) $(LIBRARY) $(APPLICATION) > $(ARCHIVE).rat archive: $(ARCHIVE).$(SUF).uue $(ARCHIVE).$(SUF).uue: $(APPLICATION) $(LIBRARY) $(DOCUMENT) $(TAR) cvf $(ARCHIVE).tar $(DOCUMENT) $(LIBRARY) $(APPLICATION) $(COMPRESS) $(ARCHIVE).tar $(RENAME) $(ARCHIVE).tar.$(CSUF) $(ARCHIVE).$(SUF) uuencode $(ARCHIVE).$(SUF) $(ARCHIVE).$(SUF) > $(ARCHIVE).$(SUF).uue clean: rm -f $(ARCHIVE).tar* $(ARCHIVE).$(SUF)* $(ARCHIVE).rat =====END =====BEGIN: index.html mime_pls

mime_plsのページ

1997年12月30日


Top [Document] [History]


Copyright (C) 1997 生田 昇 <noboru@ikuta.ichihara.chiba.jp>
=====END =====BEGIN: document.html mime_pls ver.2.02 document

mime_pls Ver.2.02について

1997年12月30日


[Top] Document [History]


mime_plsとは

mime_plsは、MIME encode/decodeのためのperl libraryです。メッセージ ヘッダフィールド中の日本語文字列のMIME encode/decode(RFC2047参照) と、メッセージボディのBase64形式およびQuoted-Printable形式の encode/decode(RFC2045参照)の機能をPerlの関数として提供します。

メッセージヘッダフィールド中の日本語文字列のMIME化はISO-2022-JPの B-encodingのみをサポートします。EUCまたはShiftJISの日本語文字列は ISO-2022-JPに自動変換され、B-encodingによりMIME encoded-wordに変換 されます。また、MIME encoded-wordをデコードする際に出力漢字コード を指定すると、ISO-2022-JPコードをEUCコードやShiftJISコードに変換 して出力することができます。

DOSマシン等の小メモリマシンで使用できるように、mimer.plとmimew.pl の2つのライブラリファイルに分割しました。総称名としてはmime_pls (まいむ・ぷるす)と名付けます。

このドキュメント以外に各ファイルの先頭にもドキュメントを付けたので 参照してください。


WWW上のmime_plsのページについて

mime_plsのページ <http://www.cc.rim.or.jp/~ikuta/mime_pls/> を公開しました。 このページでは、mime_plsについての情報提供とmime_plsの配布を 行ないます。


バージョン番号の調べ方

Ver.2.02からは、mime_plsライブラリを使用するスクリプトがmimer.plと mimew.plのバージョンをそれぞれ調べることができるように$mimer_version と$mimew_versionの2つの変数を定義しています。

これらの変数は、値として浮動小数点数を持ちバージョンが上がるにした がって単純増加することが、今後のバージョンにおいても保証されます。


再配布について

このライブラリを利用したアプリケーションを書かれた場合には、この ライブラリそのものを添付していただいて構いません。ただし、必ず本 ドキュメントを含む配布ファイルを全て添付してください。

改変して再配布する場合はライブラリファイル中の「配布条件」に従って ください。


無保証

このプログラムを使用することにより生じた損害については、作者は いかなる理由においても責任を負いません。使用される方の責任に おいてお使いください。


配布ファイルについて


ドキュメントファイル

mime_pls.doc
このファイル(のプレインテキスト版)です。

history (HTML版を見る)
これまでの変更履歴を記述したドキュメントです。

HTML形式ドキュメントファイル
WWW上のページで公開しているHTML 文書です。

mimer.pl (ライブラリファイルを見る)

requireすることにより、&mimedecode,&bodydecode, &bdeflushの3つの関数が使用できます。Ver.2.02から、 $mimer_versionを参照することによりバージョン番号を調べること ができるようになりました。

&mimedecode($string,$kout)
$string中のencoded-wordのうち、charset=ISO-2022-JP,encoding=B のものを選択的にデコードし、$koutの指定にしたがって漢字コード 変換を行なった結果を返します。

$koutは"SJIS"または"EUC"が有効です。 $koutを省略した場合、または有効な指定がされなかった場合は ISO-2022-JP(いわゆる7bit JIS)を返します。

RFC2047に基づき、encoded-wordにはさまれたLWS(空白、タブ文字、 改行+タブまたは空白)は削除します。デコードのあと、ISO-2022-JP (RFC1468)で定義されたエスケープシーケンスのうち不要なものが あれば削除します。

&bodydecode($encoded,$coding)
$coding が"b64"に等しいか指定しない場合は、$encoded に入れられた文字列をMIME Base64形式のデータとみなしてデコード し、その結果を返します。 Base64 alphabet(A-Za-z0-9+/=)以外の文字が存在しても単に無視 して処理します。

Base64のデコードは4バイト単位に行われるので、半端な部分(最後 の1〜3バイト)はバッファに保存され、次にこの関数が呼び出された 時にいっしょにデコードされます。 バッファをクリアするには &bdeflush関数を使用します。

$codingが"qp"に等しい場合は、$encodedに入れられた 文字列をMIME quoted-printable形式のデータとみなしてデコード し、その結果を返します。

&bdeflush($coding)
$codingに"b64"または"qp"を指定すること により、エンコード形式としてBase64またはQuoted-Printableを 選択することができます。 $codingを指定しなかった場合はBase64を選択したとみなされます。

&bodydecode関数によりバッファに保存されたデータを(Base64 の場合は最後に適当なpad文字'='を仮定して)デコードしその結果 を返します。

この関数が呼ばれると&bodydecodeのバッファがクリアされます。

mimew.pl (ライブラリファイルを見る)

requireすることにより、&mimeencode,&bodyencode, &benflushの3つの関数が使用できます。 Ver.2.02から、$mimew_versionを参照することによりバージョン 番号を調べることができるようになりました。

&mimeencode($string)
$string中の日本語コードの部分をISO-2022-JP(いわゆる7bit JIS) に変換したあとMIME encoded-word(RFC2047参照)に変換し、 その結果を返します。

ShiftJISコードとEUCコードが同じ行にある場合を除き、文字 コードは自動的に判別します。エンコードされるISO-2022-JP のエスケープシーケンスはライブラリファイル(mimew.pl)の 最初の方で設定できます。

$string中のShiftJISまたはEUCの文字列を正常にISO-2022-JP に変換しエンコードするためには、英語版のPerlを使用する 必要があります。

encoded-wordがASCII文字や特殊文字と直接接することを避け るために、必要に応じて空白を挿入します。encoded-word が コメントの内側にある場合は例外扱いとして括弧との間に空白 を挿入しません。

長い日本語文字列は必要に応じて分割してエンコードし、また 必要に応じてencoded-wordの前後で折り返し(行分割)処理を します。

&bodyencode($data,$coding)
$codingが"b64"に等しいか指定しない場合は、$data 中のデータをBase64エンコードしその結果を返します。

Base64エンコードの場合は出力1行(デフォルトでは72バイト)に 相当する単位(デフォルトでは54バイト)毎、Quoted-Printable エンコードの場合は元データの論理行(改行コードによる行)毎に 処理します。 $dataのうち半端な部分はバッファ中に保存され、次の呼び出し 時にいっしょにエンコードされます。バッファをクリアするには &benflush関数を使用します。

&benflush($coding)
$codingに"b64"または"qp"を指定すること により、エンコード形式としてBase64またはQuoted-Printable を選択することができます。$codingを指定しない場合はBase64 を選択したとみなされます。

&bodyencode関数によりバッファに保存したデータを選択した 形式でエンコードしその結果を返します。Base64の場合は、エン コード結果が4の倍数長にならなければ必要に応じてpad文字'='を 追加します。

この関数が呼ばれると&bodyencodeのバッファがクリアされます。

ライブラリを使用したスクリプト

rmime (スクリプトを見る)
mimer.plを使用してMIME headerを デコードするフィルターです。

使い方:[[j]perl] rmime [-s|-e|-j] [ファイル ...]

wmime (スクリプトを見る)
mimew.plを使用してヘッダフィールド 中の日本語文字列をエンコードするフィルターです。

使い方:[[j]perl [-Llatin]] wmime [ファイル ...]

rbody (スクリプトを見る)
mimer.plを使用してMIME Base64/Quoted-Printable形式のデータをデコードするフィルター です。DOSマシンのような小メモリの環境でも動作するように メモリ使用を抑えて作ってあります。

使い方:[[j]perl] {-q|-b} rbody [ファイル ...]

wbody (スクリプトを見る)
mimew.plを使用してデータをMIME Base64/Quoted-Printable形式でエンコードするフィルターです。 DOSマシンのように使用できるメモリが少ない環境でも動作する ようにメモリ使用を抑えて作ってあります。

使い方:[[j]perl] {-q|-b} wbody [ファイル ...]

Makefile

mimer.pl,mimew.pl,rmime,wmime,rbody,wbodyをインストールする 際に使用します。他には、ratやtar+gzip(or compress)+uuencode で配布用のアーカイブを作成する機能があります。

作者の環境(SunOS4.1.3)で使うためのMakefileなので、他の環境 (特にUNIX系以外の環境)ではうまく動かないかもしれません。

[Top] Document [History]


Copyright (C) 1997 生田 昇 <noboru@ikuta.ichihara.chiba.jp>
=====END =====BEGIN: history.html mime_pls history

変更履歴

1997年12月30日


[Top] [Document] History

Ver.2.01 → Ver.2.02 :

  1. mimer.plmimew.plにバージョン を表わす変数$main'mimer_versionと$main'mimew_versionを それぞれ追加した。

  2. ドキュメント( mime_pls.doc)を大幅に見直した。

  3. HTML形式のドキュメント をパッケージに添付した。

Ver.2.00alpha → Ver.2.01 :

  1. MIME Quoted-Printableのbody encode/decode機能を追加した。 具体的には、mimer.plに &qpdecode関数を追加して &bodydecode関数 から呼ばれるようにした。また、 mimew.plに&qpencode 関数と&qphex関数を追加し、 &bodyencode関数 および &benflush関数から 呼ばれるようにした。

    これに伴い、 &bodydecode関数&bdeflush関数&bodyencode関数&benflush関数が Base64とQuoted-Printableの両方に対応したので、 それぞれエンコード形式を表わす引数を追加した。

  2. rbody, wbodyプログラム (Ver.0.02)をQuoted-Printable対応にした。

Ver.1.11a → Ver.2.00alpha :

  1. MIME Base64のbody encode/decode機能を追加した。具体的には、 mimer.pl&bodydecode関数&bdeflush関数を、 mimew.pl&bodyencode関数&benflush関数を追加した。

  2. ライブラリの使用例として、 rbody, wbodyプログラム(Ver.0.01)を 添付した。

Ver.1.11 → Ver.1.11a :

  1. wmimeで、Mime-Version: ヘッダとContent-Type:ヘッダを付加する機能をオプションとした。 (デフォルトでは付加しない。)

  2. インストールとアーカイブ作成用のMakefileを添付した。

Ver.1.10 → Ver.1.11 :

  1. 行の先頭に長い日本語文字列があるときに分割エンコードされない バグを修正した。(mimew.pl)

  2. ISO-2022-JPのエスケープシーケンスの扱いを変更した。
    • デコードしたあと、不必要なエスケープシーケンスを削除する ようにした。(mimer.pl)
    • エンコードする前に、不必要なエスケープシーケンスを除去する ようにした。Ver.1.10 では(不要な)エスケープシーケンスの ところで分割エンコードしていたが、Ver.1.11 では行の長さだけ を考慮して分割するようになった。 (mimew.pl)

  3. rmime, wmimeで、メッセージ本文が 大きいと大量のメモリが必要になる(と思った)ので小メモリマシン でも実行できるように修正した。

Ver.1.00 → Ver.1.10 :

  1. ISO-2022-JP のエスケープシーケンスの扱いを変更した。
    • 無駄なエスケープシーケンスが入っていても正常に扱える ようにした。(2バイトモード中でのESC-$-Bなど)
    • エスケープシーケンスが連続している場合は最後のものだけ を残して残りを削除するようにした。

  2. RFC1522の仕様に完全対応した。(…と思う)
    • エンコード時に、長い日本語文字列は分割してエンコード するようにした。また、長い行はencoded-wordの前後で折り 返し(行分割)処理をするようにした。
    • デコード時には、encoded-wordにはさまれたLWS(ここでは、 スペース、タブ、折り返し[改行+(スペースまたはタブ)]を 指す)を除去するようにした。

  3. ライブラリの使用例として、 rmimewmimeの新版を添付した。

  4. JISコードからSJISコードに変換する部分のバグを修正した。

[Top] [Document] History


Copyright (C) 1997 生田 昇 <noboru@ikuta.ichihara.chiba.jp>
=====END =====BEGIN: mimer.pl package MIME; # Copyright (C) 1993-94,1997 Noboru Ikuta # # mimer.pl: MIME decoder library Ver.2.02 (1997/12/30) $main'mimer_version = 2.02; # インストール : @INC のディレクトリ(通常は /usr/local/lib/perl)にコピー # して下さい。 # # 使用例1 : require 'mimer.pl'; # $from = "From: Noboru Ikuta / =?ISO-2022-JP?B?GyRCQDhFRBsoQg==?="; # $from .= "\n\t=?ISO-2022-JP?B?GyRCPjobKEI=?="; # $from .= " "; # print &mimedecode($from, "EUC"); # # 使用例2 : # UNIXでBase64デコードする場合 # require 'mimer.pl'; # undef $/; # $body = <>; # print &bodydecode($body); # print &bdeflush; # # &bodydecode($data,$coding): # Base64形式またはQuoted-Printable形式のデータをデコードする。 # 第2パラメータに"qp"または"b64"を指定することによりコーディング形式 # を指示することができる。第2パラメータを省略するとBase64形式として # 処理される。 # Base64形式のデコードの場合は、4バイト単位で変換するので、渡された # データのうち半端な部分はバッファに保存され次に呼ばれたときに処理 # される。最後にバッファに残ったデータは&bdeflushを呼ぶことにより処理 # されバッファからクリアされる。 # Quoted-Printable形式のデコードの場合は、上記のバッファは使用しない # ので&bdeflushを呼ぶ必要はないが呼んでも構わない(何もしない)。 # # &bdeflush($coding): # 第1パラメータに"b64"または"qp"を指定することにより、それぞれBase64 # 形式またはQuoted-Printable形式のデコードを指定することができる。 # 第1パラメータに何も指定しなければBase64形式として処理される。 # &bodydecodeが処理し残したデータがバッファに残っていれば、それを処理 # しバッファをクリアする。 # Base64のデコードの場合、正常にエンコードされたデータであれば4バイト # の倍数の長さのはずなので最後にデータがバッファ上に残ることは考えられ # ないが、一つのデータを(1回または何回かに分けて)&bodydecodeした後に # 念のため1回呼ぶことを推奨する。 # # &mimedecode($text,$kanjicode): # 第1パラメータのデータ中にencoded-word("=?ISO2022-JP?B?"と"?="に囲ま # れた文字列、RFC2047参照)があればその部分を選び出してデコードする。 # 第2パラメータとして"EUC"または"SJIS"を指定するとデコードした部分の # 日本語文字列部分を指定した文字コードに変換する。 # 第2パラメータを省略(または無効な値を指定)するとJISコードを返す。 # RFC2047に基づき、encoded-wordではさまれたLWS(空白)は削除する。 # # 配布条件 : 著作権は放棄しませんが、配布・改変は自由とします。改変して # 配布する場合は、オリジナルと異なることを明記し、オリジナル # のバージョンナンバーに改変版バージョンナンバーを付加した形 # 例えば Ver.2.02-XXXXX のようなバージョンナンバーを付けて下 # さい。なお、Copyright表示は変更しないでください。 # # 注意 : &mimedecodeをjperl1.X(の2バイト文字対応モード)で使用するときは、 # tr/// の書き方が異なりますので、必要に応じて 'sub j2e'のコメント(#) # を付け替えてください。jperl1.4を-Llatinオプション付きで使用する # 場合および EUC変換機能を使わない場合はその必要はありません。 # なお、Perl5対応のjperlは試したことがないのでどのような動作になる # かわかりません。 # # 参照 : RFC1468, RFC2045, RFC2047 ## MIME base64 アルファベットテーブル(RFC2045より) %code = ( "A", "000000", "B", "000001", "C", "000010", "D", "000011", "E", "000100", "F", "000101", "G", "000110", "H", "000111", "I", "001000", "J", "001001", "K", "001010", "L", "001011", "M", "001100", "N", "001101", "O", "001110", "P", "001111", "Q", "010000", "R", "010001", "S", "010010", "T", "010011", "U", "010100", "V", "010101", "W", "010110", "X", "010111", "Y", "011000", "Z", "011001", "a", "011010", "b", "011011", "c", "011100", "d", "011101", "e", "011110", "f", "011111", "g", "100000", "h", "100001", "i", "100010", "j", "100011", "k", "100100", "l", "100101", "m", "100110", "n", "100111", "o", "101000", "p", "101001", "q", "101010", "r", "101011", "s", "101100", "t", "101101", "u", "101110", "v", "101111", "w", "110000", "x", "110001", "y", "110010", "z", "110011", "0", "110100", "1", "110101", "2", "110110", "3", "110111", "4", "111000", "5", "111001", "6", "111010", "7", "111011", "8", "111100", "9", "111101", "+", "111110", "/", "111111", ); ## ASCII, 7bit JISの各々にマッチするパターン $match_ascii = '\x1b\([BHJ]([\t\x20-\x7e]*)'; $match_jis = '\x1b\$[@B](([\x21-\x7e]{2})*)'; ## charset=`ISO-2022-JP',encoding=`B' の encoded-word にマッチするパターン $match_mime = '=\?[Ii][Ss][Oo]-2022-[Jj][Pp]\?[Bb]\?([A-Za-z0-9\+\/]+)=*\?='; ## &bodydecode が使う処理残しデータ用バッファ $bdebuf = ""; ## mimedecode interface ## sub main'mimedecode { local($_, $kout) = @_; 1 while s/($match_mime)[ \t]*\n?[ \t]+($match_mime)/$1$3/o; s/$match_mime/&kconv(&base64decode($1))/geo; s/(\x1b[\$\(][BHJ@])+/$1/g; 1 while s/(\x1b\$[B@][\x21-\x7e]+)\x1b\$[B@]/$1/; 1 while s/(\x1b\([BHJ][\t\x20-\x7e]+)\x1b\([BHJ]/$1/; s/^([\t\x20-\x7e]*)\x1b\([BHJ]/$1/; $_; } ## bodydecode interface ## sub main'bodydecode { local($_, $coding) = @_; if (!defined($coding) || $coding eq "" || $coding eq "b64"){ s/[^A-Za-z0-9\+\/\=]//g; $_ = $bdebuf . $_; local($cut) = int((length)/4)*4; $bdebuf = substr($_, $cut+$[); $_ = substr($_, $[, $cut); &base64decode($_); }elsif ($coding eq "qp"){ &qpdecode($_); } } ## &bdeflush interface ## sub main'bdeflush { local($coding) = @_; local($ret) = ""; if ((!defined($coding) || $coding eq "" || $coding eq "b64") && $bdebuf ne ""){ $ret = &base64decode($bdebuf); $bdebuf = ""; } $ret; } ## BASE64 デコーディング sub base64decode { local($bin) = @_; $bin = join('', @code{split(//, $bin)}); $bin = pack("B".(length($bin)>>3<<3), $bin); } ## Quoted-Printable デコーディング sub qpdecode { local($qptxt) = @_; # ソフト改行を削除 $qptxt =~ s/=\r\n//g; $qptxt =~ s/=\n//g; $qptxt =~ s/=\r//g; # 不適切な場所に`='がある場合は標準エラー出力にメッセージを出力する if ($qptxt =~ /=[^0-9A-Za-z]/){ print STDERR "[MIME::qpdecode] Illegal '=' character exists.\n"; } # 16進表現の復元 $qptxt =~ s/=([0-9A-Fa-f]{2})/pack("C",hex($1))/ge; $qptxt; } ## 漢字コード変換(JIS to EUC/SJIS) sub kconv { local($_) = @_; if ($kout eq "EUC"){ s/$match_jis/&j2e($1)/geo; s/$match_ascii/$1/go; } elsif ($kout eq "SJIS"){ s/$match_jis/&j2s($1)/geo; s/$match_ascii/$1/go; } $_; } ## 7bit JIS を EUC に変換 sub j2e { local($_) = @_; tr/\x21-\x7e/\xa1-\xfe/; # for original perl (or jperl -Llatin) # tr/\x21-\x7e/\xa1-\xfe/B; # for jperl $_; } ## 7bit JIS を Shift-JIS に変換 sub j2s { local($string); local(@ch) = split(//, $_[0]); while(($j1,$j2) = unpack("CC", shift(@ch).shift(@ch))){ if ($j1 % 2) { $j1 = ($j1>>1) + ($j1 >= 0x5f ? 0xb1 : 0x71); $j2 += ($j2 > 0x5f ? 0x20 : 0x1f); }else { $j1 = ($j1>>1) + ($j1 > 0x5f ? 0xb0 : 0x70); $j2 += 0x7e; } $string .= pack("CC", $j1, $j2); } $string; } 1; =====END =====BEGIN: mimew.pl package MIME; # Copyright (C) 1993-94,1997 Noboru Ikuta # # mimew.pl: MIME encoder library Ver.2.02 (1997/12/30) $main'mimew_version = "2.02"; # インストール : @INC のディレクトリ(通常は /usr/local/lib/perl)にコピー # して下さい。 # # 使用例1 : require 'mimew.pl'; # $from = "From: 生田 昇 "; # print &mimeencode($from); # # 使用例2 : # UNIXでBase64エンコードする場合 # require 'mimew.pl'; # undef $/; # $body = <>; # print &bodyencode($body); # print &benflush; # # &bodyencode($data,$coding): # データをBase64形式またはQuoted-Printable形式でエンコードする。 # 第2パラメータに"qp"または"b64"を指定することによりコーディング形式 # を指示することができる。第2パラメータを省略するとBase64形式でエン # コードする。 # Base64形式のエンコードの場合は、$foldcol*3/4 バイト単位で変換する # ので、渡されたデータのうち半端な部分はバッファに保存され次に呼ばれ # たときに処理される。最後にバッファに残ったデータは&benflushを呼ぶ # ことにより処理されバッファからクリアされる。 # Quoted-Printable形式のエンコードの場合は、行単位で変換するため、 # データの最後に改行文字が無い場合、最後の改行文字の後ろのデータは # バッファに保存され、次に呼ばれたときに処理される。最後にバッファ # に残ったデータは&benflush("qp")を呼ぶことにより処理されバッファ # からクリアされる。 # # &benflush($coding): # 第1パラメータに"b64"または"qp"を指定することにより、それぞれBase64 # 形式またはQuoted-Printable形式のエンコードを指定することができる。 # 第1パラメータに何も指定しなければBase64形式でエンコードされる。 # Base64のエンコードの場合、&bodyencodeが処理し残したデータを処理し # pad文字を出力する。Quoted-Printableの場合、行単位でなくブロック単 # 位で&bodyencodeを呼ぶ場合、&bodyencodeが処理し残したデータがもし # バッファに残っていればそれを処理する。 # 一つのデータを(1回または何回かに分けて)&bodyencodeした後に必ず1回 # 呼ぶ必要がある。 # # &mimeencode($text): # 第1パラメータが日本語文字列を含んでいれば、その部分をISO-2022-JPに # 変換したあと、MIME encoded-word(RFC2047参照)に変換する。必要に応じ # てencoded-wordの分割とencoded-wordの前後での行分割を行う。 # # 文字コードの自動判定は、同一行にShiftJISとEUCが混在している場合を # 除いて漢字コードの混在にも対応している。ShiftJISかEUCかどうしても # 判断できないときは$often_use_kanjiに設定されているコードと判定する。 # ISO-2022-JPのエスケープシーケンスは$jis_inと$jis_outに設定すること # により変更可能である。 $often_use_kanji = 'EUC'; # or 'SJIS' $jis_in = "\x1b\$B"; # ESC-$-B ( or ESC-$-@ ) $jis_out = "\x1b\(B"; # ESC-(-B ( or ESC-(-J ) # 配布条件 : 著作権は放棄しませんが、配布・改変は自由とします。改変して # 配布する場合は、オリジナルと異なることを明記し、オリジナル # のバージョンナンバーに改変版バージョンナンバーを付加した形 # 例えば Ver.2.02-XXXXX のようなバージョンナンバーを付けて下 # さい。なお、Copyright表示は変更しないでください。 # # 注意 : &mimeencodeをjperl1.X(の2バイト文字対応モード)で使用すると、SJIS # とEUCをうまく7bit JIS(ISO-2022-JP)に変換できません。 # 入力に含まれる文字が7bit JIS(ISO-2022-JP)とASCIIのみであること # が保証されている場合を除き、必ずoriginalの英語版のperl(または # jperl1.4以上を -Llatin オプション付き)で動かしてください。 # なお、Perl5対応のjperlは試したことがないのでどのような動作になる # かわかりません。 # # 参照 : RFC1468, RFC2045, RFC2047 ## MIME base64 アルファベットテーブル(RFC2045より) %mime = ( "000000", "A", "000001", "B", "000010", "C", "000011", "D", "000100", "E", "000101", "F", "000110", "G", "000111", "H", "001000", "I", "001001", "J", "001010", "K", "001011", "L", "001100", "M", "001101", "N", "001110", "O", "001111", "P", "010000", "Q", "010001", "R", "010010", "S", "010011", "T", "010100", "U", "010101", "V", "010110", "W", "010111", "X", "011000", "Y", "011001", "Z", "011010", "a", "011011", "b", "011100", "c", "011101", "d", "011110", "e", "011111", "f", "100000", "g", "100001", "h", "100010", "i", "100011", "j", "100100", "k", "100101", "l", "100110", "m", "100111", "n", "101000", "o", "101001", "p", "101010", "q", "101011", "r", "101100", "s", "101101", "t", "101110", "u", "101111", "v", "110000", "w", "110001", "x", "110010", "y", "110011", "z", "110100", "0", "110101", "1", "110110", "2", "110111", "3", "111000", "4", "111001", "5", "111010", "6", "111011", "7", "111100", "8", "111101", "9", "111110", "+", "111111", "/", ); ## JISコード(byte数)→encoded-word の文字数対応 %mimelen = ( 8,30, 10,34, 12,34, 14,38, 16,42, 18,42, 20,46, 22,50, 24,50, 26,54, 28,58, 30,58, 32,62, 34,66, 36,66, 38,70, 40,74, 42,74, ); ## ヘッダエンコード時の行の長さの制限 $limit=74; ## *注意* $limitを75より大きい数字に設定してはいけない。 ## ボディbase64エンコード時の行の長さの制限 $foldcol=72; ## *注意* $foldcolは76以下の4の倍数に設定すること。 ## ボディQuoted-Printableエンコード時の行の長さの制限 $qfoldcol=75; ## *注意* $foldcolは76以下に設定すること。 ## null bitの挿入と pad文字の挿入のためのテーブル @zero = ( "", "00000", "0000", "000", "00", "0" ); @pad = ( "", "===", "==", "=" ); ## ASCII, 7bit JIS, Shift-JIS 及び EUC の各々にマッチするパターン $match_ascii = '\x1b\([BHJ]([\t\x20-\x7e]*)'; $match_jis = '\x1b\$[@B](([\x21-\x7e]{2})*)'; $match_sjis = '([\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])+'; $match_euc = '([\xa1-\xfe]{2})+'; ## MIME Part 2(charset=`ISO-2022-JP',encoding=`B') の head と tail $mime_head = '=?ISO-2022-JP?B?'; $mime_tail = '?='; ## &bodyencode が使う処理残しデータ用バッファ $benbuf = ""; ## &bodyencode の処理単位(バイト) $bensize = int($foldcol/4)*3; ## &mimeencode interface ## sub main'mimeencode { local($_) = @_; s/$match_jis/$jis_in$1/go; s/$match_ascii/$jis_out$1/go; $kanji = &checkkanji; s/$match_sjis/&s2j($&)/geo if ($kanji eq 'SJIS'); s/$match_euc/&e2j($&)/geo if ($kanji eq 'EUC'); s/(\x1b[\$\(][BHJ@])+/$1/g; 1 while s/(\x1b\$[B@][\x21-\x7e]+)\x1b\$[B@]/$1/; 1 while s/$match_jis/&mimeencode($&,$`,$')/eo; s/$match_ascii/$1/go; $_; } ## &bodyencode interface ## sub main'bodyencode { local($_,$coding) = @_; if (!defined($coding) || $coding eq "" || $coding eq "b64"){ $_ = $benbuf . $_; local($cut) = int((length)/$bensize)*$bensize; $benbuf = substr($_, $cut+$[); $_ = substr($_, $[, $cut); $_ = &base64encode($_); s/.{$foldcol}/$&\n/g; }elsif ($coding eq "qp"){ # $benbuf が空でなければデータの最初に追加する $_ = $benbuf . $_; # 改行文字を正規化する s/\r\n/\n/g; s/\r/\n/g; # データを行単位に分割する(最後の改行文字以降を $benbuf に保存する) @line = split(/\n/,$_,-1); $benbuf = pop(@line); local($result) = ""; foreach (@line){ $_ = &qpencode($_); $result .= $_ . "\n"; } $_ = $result; } $_; } ## &benflush interface ## sub main'benflush { local($coding) = @_; local($ret) = ""; if ((!defined($coding) || $coding eq "" || $coding eq "b64") && $benbuf ne ""){ $ret = &base64encode($benbuf) . "\n"; $benbuf = ""; }elsif ($coding eq "qp" && $benbuf ne ""){ $ret = &qpencode($benbuf) . "\n"; $benbuf = ""; } $ret; } ## MIME ヘッダエンコーディング sub mimeencode { local($_, $befor, $after) = @_; local($back, $forw, $blen, $len, $flen, $str); $befor = substr($befor, rindex($befor, "\n")+1); $after = substr($after, 0, index($after, "\n")-$[); $back = " " unless ($befor eq "" || $befor =~ /[ \t\(]$/); $forw = " " unless ($after =~ /^\x1b\([BHJ]$/ || $after =~ /^\x1b\([BHJ][ \t\)]/); $blen = length($befor); $flen = length($forw)+length($&)-3 if ($after =~ /^$match_ascii/o); $len = length($_); return "" if ($len <= 3); if ($len > 39 || $blen + $mimelen{$len+3} > $limit){ if ($limit-$blen < 30){ $len = 0; }else{ $len = int(($limit-$blen-26)/4)*2+3; } if ($len >= 5){ $str = substr($_, 0, $len).$jis_out; $str = &base64encode($str); $str = $mime_head.$str.$mime_tail; $back.$str."\n ".$jis_in.substr($_, $len); }else{ "\n ".$_; } }else{ $_ .= $jis_out; $_ = &base64encode($_); $_ = $back.$mime_head.$_.$mime_tail; if ($blen + (length) + $flen > $limit){ $_."\n "; }else{ $_.$forw; } } } ## MIME base64 エンコーディング sub base64encode { local($_) = @_; $_ = unpack("B".((length)<<3), $_); $_ .= $zero[(length)%6]; s/.{6}/$mime{$&}/go; $_.$pad[(length)%4]; } ## Quoted-Printable エンコーディング sub qpencode { local($_) = @_; # `=' 文字を16進表現に変換する s/=/=3D/g; # 行末のタブとスペースを16進表現に変換する s/\t$/=09/; s/ $/=20/; # 印字可能文字(`!'〜`~')以外の文字を16進表現に変換する s/([^!-~ \t])/&qphex($1)/ge; # 1行が$qfoldcol文字以下になるようにソフト改行をいれる local($folded, $line) = ""; while (length($_) > $qfoldcol){ $line = substr($_, 0, $qfoldcol-1); if ($line =~ /=$/){ $line = substr($_, 0, $qfoldcol-2); $_ = substr($_, $qfoldcol-2); }elsif ($line =~ /=[0-9A-Fa-f]$/){ $line = substr($_, 0, $qfoldcol-3); $_ = substr($_, $qfoldcol-3); }else{ $_ = substr($_, $qfoldcol-1); } $folded .= $line . "=\n"; } $folded . $_; } sub qphex { local($_) = @_; $_ = '=' . unpack("H2", $_); tr/a-f/A-F/; $_; } ## Shift-JIS と EUC のどちらの漢字コードが含まれるかをチェック sub checkkanji { local($sjis,$euc); $sjis += length($&) while(/$match_sjis/go); $euc += length($&) while(/$match_euc/go); return 'NONE' if ($sjis == 0 && $euc == 0); return 'SJIS' if ($sjis > $euc); return 'EUC' if ($sjis < $euc); $often_use_kanji; } ## EUC を 7bit JIS に変換 sub e2j { local($_) = @_; tr/\xa1-\xfe/\x21-\x7e/; $jis_in.$_.$jis_out; } ## Shift-JIS を 7bit JIS に変換 sub s2j { local($string); local(@ch) = split(//, $_[0]); while(($j1,$j2)=unpack("CC",shift(@ch).shift(@ch))){ if ($j2 > 0x9e){ $j1 = (($j1>0x9f ? $j1-0xb1 : $j1-0x71)<<1)+2; $j2 -= 0x7e; } else{ $j1 = (($j1>0x9f ? $j1-0xb1 : $j1-0x71)<<1)+1; $j2 -= ($j2>0x7e ? 0x20 : 0x1f); } $string .= pack("CC", $j1, $j2); } $jis_in.$string.$jis_out; } 1; =====END =====BEGIN: rmime #!/usr/bin/perl # Copyright (C) 1993-94 Noboru Ikuta # # rmime: MIME-header decoder Ver.1.11a # メッセージヘッダ中(先頭から最初の空行まで)に含まれる encoded-word # ("=?ISO2022-JP?B?" と "?=" に囲まれた文字列)をサーチしてデコード # する。encoded-word にはさまれた空白は全て除去する。オプションスイッ # チを指定することにより MIME 梱包を解いた部分の漢字コードを 7bit JIS # から Shift-JIS または EUC に変換することができる。 # # 入力漢字コードは固定(7bit JIS)ですが、出力漢字コードは指定できます。 # なお、出力漢字コードのデフォルトは 7bit JIS(透過)です。 # # 使い方 : [ [j]perl ] rmime [ -s|-e|-j ] [ ファイル名 ...] # # mimer.pl は、環境変数 HOME→rmimeと同じ→通常の@INC の順にサ # ーチされます。 # # 注意 : rmimeをjperl(の2バイト文字対応モード)で使用するときは、tr/// # の書き方が異なりますので、必要に応じて mimer.pl 中の 'sub j2e' # のコメント(#)を付け替えてください。jperl1.4以上を -Llatin オプ # ション付きで使用する場合およびEUC変換機能を使わない場合はその必 # 要はありません。 # # 配布条件 : 著作権は放棄しませんが、配布・改変は自由とします。 $home = $ENV{'HOME'}; $perl_dir = $0; $perl_dir =~ s/\\/\//g; substr($perl_dir, rindex($perl_dir, "/")) = ''; unshift(@INC, $home, $perl_dir); require 'mimer.pl'; ## オプションスイッチ判断のためのテーブル %kanjicode = ( "-e", "EUC", "-s", "SJIS", "-E", "EUC", "-S", "SJIS" ); ## 出力漢字コードの設定 (UNDEF は 7bit JIS) shift if ( $ARGV[0] =~ /^-[esj]$/i ); $kout = $kanjicode{$&}; ## メッセージヘッダの処理 $/ = "\n\n"; $* = 1; $_ = <>; print &mimedecode($_,$kout); ## メッセージボディの処理 $/ = "\n"; while (<>){ print; } =====END =====BEGIN: wmime #!/usr/bin/perl ##!/usr/bin/jperl -Llatin # Copyright (C) 1993-94 Noboru Ikuta # # wmime: MIME-header encoder Ver.1.11a # メッセージヘッダ中(先頭から最初の空行まで)に含まれる漢字の部分を # ISO-2022-JP(7bit JIS)に変換し MIME エンコードする。 # また、Mime-Version: とContent-Type: の2つのフィールドがヘッダ部に # 含まれなければメッセージヘッダの最後に以下の対応するフィールドを追 # 加する。($add_headers が 1 のとき) $mime_ver = "Mime-Version: 1.0\n"; $con_type = "Content-Type: text/plain; charset=iso-2022-jp\n"; $add_headers = 0; # 使い方 : [ perl ] wmime [ ファイル名 ...] # # mimew.pl は、環境変数 HOME→wmimeと同じ→通常の@INC の順にサ # ーチされます。 # # 注意 : wmimeをjperl(の2バイト文字対応モード)で使用すると、SJISとEUC # をうまく7bit JIS(ISO-2022-JP)に変換できません。 # 入力に含まれる文字が7bit JIS(ISO-2022-JP)とASCIIのみであること # が保証されている場合を除き、必ずoriginalの英語版のperl(または # jperl1.4以上を -Llatin オプション付き)で動かしてください。 # # 配布条件 : 著作権は放棄しませんが、配布・改変は自由とします。 $home = $ENV{'HOME'}; $perl_dir = $0; $perl_dir =~ s/\\/\//g; substr($perl_dir, rindex($perl_dir, "/")) = ''; unshift(@INC, $home, $perl_dir); require 'mimew.pl'; ## `MIME-Version:'と`Content-Type:' にマッチするパターン $match_mime_ver = '^mime-version:'; $match_con_type = '^content-type:'; ## メッセージヘッダの処理 $/ = "\n\n"; $* = 1; $_ = <>; $_ = &mimeencode($_); if (/\n\n$/){ chop; print; if ($add_headers){ if (!/$match_mime_ver/io){ print $mime_ver; } if (!/$match_con_type/io){ print $con_type; } } print "\n"; ## メッセージボディの処理 $/ = "\n"; while (<>){ print; } }else{ print if ($_); } =====END =====BEGIN: rbody #!/usr/bin/perl # Copyright (C) 1994,1997 Noboru Ikuta # # rbody: MIME decoder Ver.0.02 # MIME base64 encoding または Quoted-Printable encoding された # データをデコードする。 # # 使い方 : [ [j]perl ] rbody {-q|-b} [ ファイル名 ...] # # mimer.pl は、環境変数 HOME→rbodyと同じ→通常の@INC の順にサ # ーチされます。 # # 配布条件 : 著作権は放棄しませんが、配布・改変は自由とします。 $home = $ENV{'HOME'}; $perl_dir = $0; $perl_dir =~ s/\\/\//g; substr($perl_dir, rindex($perl_dir, "/")) = ''; unshift(@INC, $home, $perl_dir); require 'mimer.pl'; if ($#ARGV >= $[){ if ($ARGV[$[] =~ /^-q$/i){ shift; $coding = "qp"; print STDERR "Quoted-Printable decoding\n"; }elsif ($ARGV[$[] =~ /^-b$/i){ shift; $coding = "b64"; print STDERR "Base64 decoding\n"; }else{ $coding = "b64"; print STDERR "Base64 decoding\n"; } } binmode STDOUT; while(<>){ print &bodydecode($_,$coding); } print &bdeflush($coding); =====END =====BEGIN: wbody #!/usr/bin/perl # Copyright (C) 1994,1997 Noboru Ikuta # # wbody: MIME encoder Ver.0.02 # データを MIME base64 または Quoted-Printable でエンコードする。 # # 使い方 : [ [j]perl ] wbody {-q|-b} [ ファイル名 ...] # # mimew.pl は、環境変数 HOME→wbodyと同じ→通常の@INC の順にサ # ーチされます。 # # 配布条件 : 著作権は放棄しませんが、配布・改変は自由とします。 ## データ処理のブロック長(バイト) $len = 1026; ## 実行時のメモリが厳しい場合は 54 まで減らしてみてください。 ## (mimew.pl中の$foldcol)/4*3 (デフォルトで54)の倍数にすると ## 効率がよくなります。54の倍数でなくても問題なく動きます。 $home = $ENV{'HOME'}; $perl_dir = $0; $perl_dir =~ s/\\/\//g; substr($perl_dir, rindex($perl_dir, "/")) = ''; unshift(@INC, $home, $perl_dir); require 'mimew.pl'; if ($#ARGV >= $[){ if ($ARGV[$[] =~ /^-q$/i){ shift; $coding = "qp"; }elsif ($ARGV[$[] =~ /^-b$/i){ shift; $coding = "b64"; }else{ $coding = "b64"; } }else{ $coding = "b64"; } unshift(@ARGV, '-') if $#ARGV < $[; while ($ARGV = shift) { open(ARGV, $ARGV) || die "Can't open $ARGV.\n"; binmode ARGV; while(read(ARGV, $_, $len)){ print &bodyencode($_,$coding); } print &benflush($coding); } =====END