中塚ホーム > 公開資料類 > mtext動作

      mtext.pl

メール添付ファイル除去・本文行数制限フィルター 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]