Slide 1

Slide 1 text

MIMEヘッダエンコーディングは MIMEヘッダエンコーディングは 複雑すぎてつらい 複雑すぎてつらい 2021-06-22 とみたまさひろ 1

Slide 2

Slide 2 text

別にしらなくてもいい 役に立つか立たないかわからない 技術について語るコーナー 2

Slide 3

Slide 3 text

MIMEヘッダエンコーディング MIMEヘッダエンコーディング メールのヘッダでよく見る =?ISO-2022-JP?B?GyRCRnxLXDhsGyhC?= みたいなやつ 3

Slide 4

Slide 4 text

RFC 2047 RFC 2047 Message Header Extensions for Non-ASCII Text メールのヘッダは ASCII のみ ASCII以外の文字列をヘッダに書けるようにするために 作られた規格 https://tools.ietf.org/html/rfc2047 4

Slide 5

Slide 5 text

Bエンコーディング: Qエンコーディング: 「日本語ABC」を変換すると: =?[文字コード]?B?[Base64化されたデータ]?= =?[文字コード]?Q?[そのまま書けない文字を=XXに変換したデータ]?= =?ISO-2022-JP?B?GyRCRnxLXDhsGyhCQUJD?= =?ISO-2022-JP?Q?=1B$BF|K\8l=1B(BABC?= =?UTF-8?B?5pel5pys6KqeQUJD?= =?UTF-8?Q?=E6=97=A5=E6=9C=AC=E8=AA=9EABC?= 5

Slide 6

Slide 6 text

エンコードのつらみ エンコードのつらみ 6

Slide 7

Slide 7 text

Bエンコーディングは基本的には文字列をBase64化して 前後に文字列をつけるだけ 日本語 → 5pel5pys6Kqe → =?UTF-8?B?5pel5pys6Kqe?= つらくない 7

Slide 8

Slide 8 text

↓ 長い… Subject: MIMEヘッダエンコーディングは複雑すぎてつらい Subject: =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+ikh+mbkeOBmeOBjuOBpuOBpOOCieOBhA==?= 8

Slide 9

Slide 9 text

メールのヘッダだから折り返しちゃえ! ダメ 折り返せるのは空白文字の箇所だけ Subject: =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+ik h+mbkeOBmeOBjuOBpuOBpOOCieOBhA==?= 9

Slide 10

Slide 10 text

複数のエンコーディング文字列に分割する エンコーディング文字列間の空白は取り除かれる仕様 だからよさそう でも実はこれでもダメ Subject: =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+ik?= =?UTF-8?B?h+mbkeOBmeOBjuOBpuOBpOOCieOBhA==?= 10

Slide 11

Slide 11 text

文字を分割しちゃダメ 「複」(E8 A4 87) が分割されてしまっている =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+ik?= → MIMEヘッダエンコーディングは =?UTF-8?B?h+mbkeOBmeOBjuOBpuOBpOOCieOBhA==?= → <87>雑すぎてつらい 11

Slide 12

Slide 12 text

文字単位で処理しないといけない =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+==?= → MIMEヘッダエンコーディングは =?UTF-8?B?6KSH6ZuR44GZ44GO44Gm44Gk44KJ44GE?= → 複雑すぎてつらい 12

Slide 13

Slide 13 text

さらに ISO-2022-JP のような状態を持つ文字コードの場合は ASCII で終了しないといけない $B : JIS X 0208 (B : US-ASCII  日本語ABCあいう → $BF|K\8l(BABC$B$"$$$&(B 13

Slide 14

Slide 14 text

これは OK $BF|K\8l(BABC⏎ 日本語ABC $B$"$$$&(B あいう 14

Slide 15

Slide 15 text

これはNG $BF|K\8l(BABC$B$"⏎ 日本語ABCあ $$$&(B いう 15

Slide 16

Slide 16 text

やるならエンコーディング文字列の最後にASCIIに戻す $BF|K\8l(BABC$B$"(B⏎ 日本語ABCあ $B$$$&(B いう 16

Slide 17

Slide 17 text

デコードのつらみ デコードのつらみ 17

Slide 18

Slide 18 text

文字が分割されている =?UTF-8?B?44GC44GE44GG44GI44E=?=⏎ あいうえ<81> =?UTF-8?B?iuOBi+OBjeOBj+OBkeOBkw==?= <8A>かきくけこ ↓ あいうえ???かきくけこ 18

Slide 19

Slide 19 text

エンコーディング文字列がつながってる 本当はデコードしちゃダメ =?UTF-8?B?44GC44GE44GG44GI44GK?==?UTF-8?B?44GL44GN44GP44GR44GT?= 19

Slide 20

Slide 20 text

「"」で括られている 添付ファイル名とかでよく見る 本当はデコードしちゃダメ "=?UTF-8?B?44GC44GE44GG44GI44GK?=" 20

Slide 21

Slide 21 text

ISO-2022-JP と書かれてるのに ISO-2022-JP に無い文字が含まれている 「ア」「①」「Ⅲ」「㍻」「髙」など 本当はダメなんだけど普通に使われてる ISO-2022-JP じゃなくて CP50221 として扱う 21

Slide 22

Slide 22 text

つらい 😇 つらい 😇 22