docomoのSPモードメールがRFC2047の書式に則っていない件
twitterでひととおりつぶやいたのでこちらにも転載します。
docomoスマートフォンのSPモードメールの仕様が見逃せない感じだったので、書いてみる。
— 橋口一法@元モヤシステムエンジニア (@hassy_se) 2014, 3月 5
発端は個人で開発しているシステムの不具合報告だった。ざっくり言うとメールの件名が「hoge=?iso-2022-jp?B?foobar=」ってなってますけどという内容。Javaのプログラム内の件名取得処理をミスったかな、くらいの気持ちで調査した。
— 橋口一法@元モヤシステムエンジニア (@hassy_se) 2014, 3月 5
補足。例えばメールの件名に「hogeあいう」として送信したところ、受信側の件名がこんなふうになっちゃった、ということです。
QT @hassy_se メールの件名が「hoge=?iso-2022-jp?B?foobar=」ってなってますけど
— 橋口一法@元モヤシステムエンジニア (@hassy_se) 2014, 3月 5
ところが中を覗いてみると、件名はgetSubject( )で取得しているだけ。プログラム側の問題ではないっぽい。ということで他のメールと書式を比べてみることにした。
— 橋口一法@元モヤシステムエンジニア (@hassy_se) 2014, 3月 5
するとどうだろう。
件名の冒頭に「hoge」がついているメールで、Subjectが「=?iso-2022-jp?...」となっているものと、「hoge=?iso-2022-jp?...」となっているものの2種類がある。不具合の原因は後者。
— 橋口一法@元モヤシステムエンジニア (@hassy_se) 2014, 3月 5
そして後者はすべてSPモードメールから送信されたものであることが明らかになったのである。。。
— 橋口一法@元モヤシステムエンジニア (@hassy_se) 2014, 3月 5
電子メールの書式は「RFC 2047」で定められている。これによると、Subjectには"encoded-word"を使うことができ、書式はこうなる。
"=?" charset "?" encoding "?" encoded-text "?="
— 橋口一法@元モヤシステムエンジニア (@hassy_se) 2014, 3月 5
さらに、
「ヘッダーフィールドに出る『encoded-word』はどのような隣接の『encoded-word』でもからまたは『text』『linear-white-space』によって分離しなければなりません。」
http://t.co/BDAcSeN2cH
— 橋口一法@元モヤシステムエンジニア (@hassy_se) 2014, 3月 5
ということで、encoded-wordをスペースで区切ることなくhogeという文字列にくっつけて送信しているSPモードメールはRFC2047の書式に則っていないことになる。なんだってー。
— 橋口一法@元モヤシステムエンジニア (@hassy_se) 2014, 3月 5
ということで、Java MailさんがきちんとgetSubject( ) できないのはSPモードメールの不具合によるものでした。
— 橋口一法@元モヤシステムエンジニア (@hassy_se) 2014, 3月 5
あまり開発者を叩くことはしたくないけれど、仮にも日本の情報業界を代表する企業が作っているメーラが、標準書式も守れていない(しかも細かいところじゃなくて「件名」ですよ)って、どうなの?と思わざるをえない。
— 橋口一法@元モヤシステムエンジニア (@hassy_se) 2014, 3月 5
もし掲載内容に誤り等ありましたらご指摘いただけると幸いです。