メール添付ファイル除去・本文行数制限フィルター mtext.pl の動作
【プログラムのフロー】 [Multipart の入れ子は2重までとする.]
#サブルーチン
demime { MIME Base64/Quoted-Printable Decode }
euc2jis7 { EUC to JIS7 Code-conversion }
sj2jis7 { Shift_JIS to JIS7 Code-conversion }
textout(テキスト出力) {
Fenc==1 なら { base64 を デコード.}
Fenc==2 なら { quoted-printable を デコード.}
Fenc==3 なら { uuencode をデコード.}
Fcs==1 なら { EUC から JIS7へのコード変換.}
Fcs==2 なら { Shift_JIS から JIS7へのコード変換.}
行数を見積もり,行数制限を越えていなければ出力.
}
#メインプログラム
verbose (-v) 指定の有無により,Verb=ON または Verb=OFF に設定.
制限行数の設定を maxl に保持(指定がなければ 0:無制限).
<email>指定がなければ標準出力をオープン,
指定があれば,"|sendmail -i <email>" をオープン.
Fmult1=OFF, Fmult2=OFF, Ftext=ON, Fenc=0, Fcs=0 に設定.
入力1行先読み
do until 空行 {
継続行があればつなぎ合わせ,次行入力.
入力の終端となった場合は,ループを抜ける.
Content-Type 行 なら {
Content-Type を sort に保持.
multipart... boundary=[pattern1] の場合
{ Fmult1=ON, Ftext=Verb に設定し,その行は削除.}
text/plain または message の場合 {
charset=Shift_JIS の指定があれば,
{ charset=ISO-2022-JP に修正し,Fcs=2 に設定.}
charset=EUC-JP の指定があれば,
{ charset=ISO-2022-JP に修正し,Fcs=1 に設定.}
ヘッダ行を出力.
}
その他の場合 { Ftext=OFF に設定し,その行は削除.}
}
Content-Transfer-Encoding 行 なら {
uuencode の指定があれば
{ Fenc=3 に設定し,その行の前に "X-" を付加.}
quoted-printable の指定があれば
{ Fenc=2 に設定し,その行の前に "X-" を付加.}
base64 の指定があれば
{ Fenc=1 に設定し,その行の前に "X-" を付加.}
ヘッダ行を出力.
}
その他の場合 { ヘッダ行を出力.}
}
追加ヘッダ1行と空行を出力.
Fmult1==ON または Ftext==OFF の場合 {
Verb==ON なら { 本文先頭に Content-Type を出力.}
}
入力1行先読み
do while Fmult1==ON {
do until [pattern1] 行 {
Ftext==ON なら,{ テキスト出力,次行入力.}
}
入力の終端となった場合は,ループを抜ける.
if [pattern1-end]行 {
Fmult1=OFF, Ftext=Verb, Fenc=0, Fcs=0 に設定,
次行入力し,ループを抜ける.
}
Fmult2=OFF, Ftext=ON, Fenc=0, Fcs=0 に設定.
do until 空行 {
継続行があればつなぎ合わせ,次行入力.
Content-Type 行 なら {
Content-Type: multipart... boundary=[pattern2] の行なら,
{ Fmult2=ON, Ftext=Verb に設定.}
Content-Type が text/plain または message の場合 {
charset=Shift_JIS の指定があれば { Fcs=2 に設定.}
charset=EUC-JP の指定があれば { Fcs=1 に設定.}
テキスト分離用に改行出力.
}
Content-Type が それ以外の場合 {
その Content-Type と name=の設定があればその名前 を出力.
Ftext=OFF に設定.
}
}
Content-Transfer-Encoding 行 なら {
uuencode の指定があれば { Fenc=3 に設定.}
quoted-printable の指定があれば { Fenc=2 に設定.}
base64 の指定があれば { Fenc=1 に設定.}
}
}
入力1行先読み
do while Fmult2==ON {
do until [pattern2] 行 {
Ftext==ON なら,{ テキスト出力,次行入力.}
}
入力の終端となった場合は,ループを抜ける.
if [pattern2-end]行 {
Fmult2=OFF, Ftext=Verb, Fenc=0, Fcs=0
に設定,次行入力し,ループを抜ける.
}
Ftext=ON, Fenc=0, Fcs=0 にする.
do until 空行 {
継続行があればつなぎ合わせ,次行入力.
Content-Type 行 なら {
Content-Type が text/plain または message の場合 {
charset=Shift_JIS の指定があれば { Fcs=2 に設定.}
charset=EUC-JP の指定があれば { Fcs=1 に設定.}
テキスト分離用に改行出力.
}
Content-Type が それ以外の場合 {
その Content-Type と name=の設定があればその名前 を出力.
Ftext=OFF に設定.
}
Content-Transfer-Encoding 行 なら {
uuencode の指定があれば { Fenc=3 に設定.}
quoted-printable の指定があれば { Fenc=2 に設定.}
base64 の指定があれば { Fenc=1 に設定.}
}
}
入力の終端となった場合は,Fmult1=OFF, Fmult2=OFF としてループを抜ける.
次行入力.
}
}
入力終端まで行入力.{
Ftext==ON なら,{ テキスト出力.} }
入力ファイル容量(kB単位) を出力.
出力をクローズ.
【<参考> multipartメールの形式(例)】
Received: ..... (Header) ┐
.......... │
Received: ..... │
.......... [Header-cont.] │
From: fromadr@host.domain │
To: toadr@mailhost.domainname │
Subject: ...... │
Return-Path: <fromadr@host.domain> │
MIME-Version: 1.0 │
Content-Type: multipart/mixed; boundary="バウンダリパターン1" │
Message-Id: ..... │
XXXXXXXXXXXX: ..... ┘
(空行)
zzzzzzzzzzzzzzzzzzz (Level-1 preamble)┐
zzzzzzzzzzzzzzzzzzzzzz ┘
--バウンダリパターン1
Content-Type: text/plain; charset=iso-2022-jp (Mime Header) ┐
XXXXXXXXXXXX: ..... ┘
(空行)
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx (JIS text) ┐
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx │
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx │
xxxxxxxxxxxxxxxxxxxxxxxx │
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ┘
--バウンダリパターン1
XXXXXXXXXXXX: ..... (Mime Header) ┐
Content-Type: multipart/mixed; boundary="バウンダリパターン2" ┘
(空行)
zzzzzzzzzzzzzzzzzzz (Level-2 preamble)┐
zzzzzzzzzzzzzzzzzzzzzz ┘
--バウンダリパターン2
Content-Type: text/plain; charset="EUC-JP" (Mime Header) ┐
XXXXXXXXXXXX: ..... ┘
(空行)
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx (EUC Text) ┐
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx │
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx │
xxxxxxxxxxxxxxxxxxxxxxxx │
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ┘
--バウンダリパターン2
Content-Type: application/msword; name="名前" (Mime Header) ┐
Content-Disposition: attachment; filename="ファイル名" │
Content-Transfer-Encoding: base64 ┘
(空行)
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy (Base64-encoded file)┐
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy │
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy │
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy │
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy ┘
--バウンダリパターン2--
zzzzzzzzzzzzzzzzzzz (Level-2 epilogue)┐
zzzzzzzzzzzzzzzzzzzzzz ┘
--バウンダリパターン1
Content-Type: application/octet-stream; (Mime Header) ┐
name="=?ISO-2022-JP?B?xxxxxxxxxxxxxxxx?=" [Mime-encoded name]│
Content-Transfer-Encoding: uuencode │
Content-Disposition: attachment; filename="AttachedFile.name" ┘
(空行)
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy (Uuencoded file)┐
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy │
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy │
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy ┘
--バウンダリパターン1--
zzzzzzzzzzzzzzzzzzz (Level-1 epilogue)┐
zzzzzzzzzzzzzzzzzzzzzz ┘
[EOF]