Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MIMEヘッダエンコーディングは複雑すぎてつらい / MIME header encoding is hard

MIMEヘッダエンコーディングは複雑すぎてつらい / MIME header encoding is hard

とみたまさひろ

June 23, 2021
Tweet

More Decks by とみたまさひろ

Other Decks in Technology

Transcript

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

    View full-size slide

  2. 別にしらなくてもいい

    役に立つか立たないかわからない

    技術について語るコーナー
    2

    View full-size slide

  3. MIMEヘッダエンコーディング
    MIMEヘッダエンコーディング
    メールのヘッダでよく見る

    =?ISO-2022-JP?B?GyRCRnxLXDhsGyhC?=

    みたいなやつ
    3

    View full-size slide

  4. RFC 2047
    RFC 2047
    Message Header Extensions for Non-ASCII Text

    メールのヘッダは ASCII のみ

    ASCII以外の文字列をヘッダに書けるようにするために
    作られた規格
    https://tools.ietf.org/html/rfc2047
    4

    View full-size slide

  5. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide


  8. 長い…
    Subject: MIMEヘッダエンコーディングは複雑すぎてつらい

    Subject: =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+ikh+mbkeOBmeOBjuOBpuOBpOOCieOBhA==?=

    8

    View full-size slide

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

    h+mbkeOBmeOBjuOBpuOBpOOCieOBhA==?=

    9

    View full-size slide

  10. 複数のエンコーディング文字列に分割する
    エンコーディング文字列間の空白は取り除かれる仕様

    だからよさそう
    でも実はこれでもダメ
    Subject: =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+ik?=

    =?UTF-8?B?h+mbkeOBmeOBjuOBpuOBpOOCieOBhA==?=

    10

    View full-size slide

  11. 文字を分割しちゃダメ
    「複」(E8 A4 87) が分割されてしまっている
    =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+ik?=

    → MIMEヘッダエンコーディングは


    =?UTF-8?B?h+mbkeOBmeOBjuOBpuOBpOOCieOBhA==?=

    → <87>雑すぎてつらい

    11

    View full-size slide

  12. 文字単位で処理しないといけない
    =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+==?=

    → MIMEヘッダエンコーディングは



    =?UTF-8?B?6KSH6ZuR44GZ44GO44Gm44Gk44KJ44GE?=
    → 複雑すぎてつらい

    12

    View full-size slide

  13. さらに

    ISO-2022-JP のような状態を持つ文字コードの場合は
    ASCII で終了しないといけない
    $B : JIS X 0208
    (B : US-ASCII 
    日本語ABCあいう



    → $BF|K\8l(BABC$B$"$$$&(B

    13

    View full-size slide

  14. これは OK
    $BF|K\8l(BABC⏎ 日本語ABC

    $B$"$$$&(B あいう

    14

    View full-size slide

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

    $$$&(B いう
    15

    View full-size slide

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

    $B$$$&(B いう

    16

    View full-size slide

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

    View full-size slide

  18. 文字が分割されている
    =?UTF-8?B?44GC44GE44GG44GI44E=?=⏎ あいうえ<81>

    =?UTF-8?B?iuOBi+OBjeOBj+OBkeOBkw==?= <8A>かきくけこ



    あいうえ???かきくけこ

    18

    View full-size slide

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

    19

    View full-size slide

  20. 「"」で括られている
    添付ファイル名とかでよく見る

    本当はデコードしちゃダメ
    "=?UTF-8?B?44GC44GE44GG44GI44GK?="

    20

    View full-size slide

  21. ISO-2022-JP と書かれてるのに

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

    View full-size slide

  22. つらい
    😇
    つらい
    😇
    22

    View full-size slide