Ruby - UNIX MBOX メールヘッダ・Content-Type属性の検証!

Updated:


今日は Ruby で UNIX MBOX メールデータ中のメールヘッダ「Content-Type」属性を検証してみました。 以下の過去記事も参照。

RFC 2045 によると書式は以下のようになっていないといけないようです。

type/subytype(; attribute=value)

そして、”type” は “text”, “image”, “audio”, “video”, “application”, “message”, “multipart” であること。 使用できる文字は以下以外のUS-ASCII文字でないといけないようです。

"(", ")", "<", ">", "@", ",", ";", ":",
 "\", <">, "/", "[", "]", "?", "="

と言うことで、「Content-Type」属性に設定されている “type”, “subtype”, “parameter” を調べてみました。 ※メールヘッダ部分のみです。「Content-Type」に “multipart” が設定されていて本文が分割されている場合の各パート内の「Content-Type」については、今回は調査対象外です。

参考までに、当方の UNIX MBOX メールデータ(61,665件)を検証した結果を掲載します。 だから何?と言われそうですが、自分の近い将来のための記録として掲載していますので、ご承知おきください。

Ruby スクリプトは今までの検証で使用してきたものを流用しています。

使用した正規表現

パラメータ部分は別途正規表現を利用する方法と採りました。

/^(text|image|audio|video|application|message|multipart)\/
([a-zA-Z\-]+)(?:;(.+))?$/i
/^([\s\w\.\+\-\*\"_;]+)=
(([\s\w\.\+\-\*_;]+)|(\"[\s\w\.\+\-\*_;]+\"))$/

※実際はそれぞれ改行なしの1行です。

Content-Type属性

1メール(ヘッダー部分)に複数設定されることはない属性です。 また、必須で設定されないといけないものでもありません。 パラメータは設定されていないもの、複数設定されているものがあります。

全件数          =  61,665
非設定          =   2,430
text            =  48,930
  plain         =  42,938
  html          =   5,992
    charset     =  48,831
    format      =      71
    reply-type  =      32
    delsp       =       3
image           =       1
  jpeg          =       1
audio           =       0
video           =       0
application     =       3
  octet-stream  =       3
message         =       0
multipart       =   9,895
  alternative   =   6,914
  mixed         =   2,780
  report        =     121
  signed        =      55
  related       =      25
    boundary    =   9,437
    charset     =      81
    report-type =     121
    micalg      =      55
Non-Match       =     969

不正な “type”, “subtype” はありませんでした。 パラメータ部分にマッチしなかったものが4種類ありました。

  • パラメータがないのにサブタイプの後ろに”;”が付加されているものが406件
  • パラメータの属性と値の間の”=”の左右に半角スペースが入っているのものが47件
  • パラメータの値に非US-ASCII文字(日本語)が使用されているものが1件
  • パラメータの属性か値のどちらかに準拠外の文字( “?”, “/”, “:”, “(“, “)” )が含まれているものが515件

日本語が設定されている箇所が気になりますが、これ以外は RFC 2045 に準拠していないだけで、致命的ではないと判断。


次回は、「Content-Transfer-Encoding」属性を検証してみるつもりです。

以上。





 

Sponsored Link

 

Comments