Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
MIMEヘッダエンコーディングは複雑すぎてつらい / MIME header encoding...
Search
とみたまさひろ
June 23, 2021
Technology
3
1.6k
MIMEヘッダエンコーディングは複雑すぎてつらい / MIME header encoding is hard
とみたまさひろ
June 23, 2021
Tweet
Share
More Decks by とみたまさひろ
See All by とみたまさひろ
MySQLとPostgreSQLのコレーション / Collation of MySQL and PostgreSQL
tmtms
1
1.6k
文字列の並び順 / Unicode Collation
tmtms
4
910
夢の印税生活 / Life on Royalties
tmtms
0
520
文字列の並び順 / String Collation
tmtms
1
170
日本MySQLユーザ会ができるまで / making MyNA
tmtms
1
900
Ruby on Browser - RubyWorld Conference 2024
tmtms
1
1.3k
Ruby on Browser
tmtms
1
2.1k
私のRSpecの書き方 / How I write RSpec
tmtms
5
2.2k
ショートカットと端末 / shortcut & terminal
tmtms
2
970
Other Decks in Technology
See All in Technology
マーケットプレイス版Oracle WebCenter Content For OCI
oracle4engineer
PRO
5
1.6k
Context Engineeringの取り組み
nutslove
0
370
Amazon S3 Vectorsを使って資格勉強用AIエージェントを構築してみた
usanchuu
4
450
GitHub Issue Templates + Coding Agentで簡単みんなでIaC/Easy IaC for Everyone with GitHub Issue Templates + Coding Agent
aeonpeople
1
260
30万人の同時アクセスに耐えたい!新サービスの盤石なリリースを支える負荷試験 / SRE Kaigi 2026
genda
4
1.3k
Context Engineeringが企業で不可欠になる理由
hirosatogamo
PRO
3
650
Agile Leadership Summit Keynote 2026
m_seki
1
660
外部キー制約の知っておいて欲しいこと - RDBMSを正しく使うために必要なこと / FOREIGN KEY Night
soudai
PRO
12
5.6k
今こそ学びたいKubernetesネットワーク ~CNIが繋ぐNWとプラットフォームの「フラッと」な対話
logica0419
3
240
Bill One急成長の舞台裏 開発組織が直面した失敗と教訓
sansantech
PRO
2
390
Cosmos World Foundation Model Platform for Physical AI
takmin
0
960
インフラエンジニア必見!Kubernetesを用いたクラウドネイティブ設計ポイント大全
daitak
1
380
Featured
See All Featured
Navigating Weather and Climate Data
rabernat
0
110
Technical Leadership for Architectural Decision Making
baasie
2
250
Mobile First: as difficult as doing things right
swwweet
225
10k
YesSQL, Process and Tooling at Scale
rocio
174
15k
WENDY [Excerpt]
tessaabrams
9
36k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
290
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
9.6k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.3k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
420
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
From π to Pie charts
rasagy
0
130
Making Projects Easy
brettharned
120
6.6k
Transcript
MIMEヘッダエンコーディングは MIMEヘッダエンコーディングは 複雑すぎてつらい 複雑すぎてつらい 2021-06-22 とみたまさひろ 1
別にしらなくてもいい 役に立つか立たないかわからない 技術について語るコーナー 2
MIMEヘッダエンコーディング MIMEヘッダエンコーディング メールのヘッダでよく見る =?ISO-2022-JP?B?GyRCRnxLXDhsGyhC?= みたいなやつ 3
RFC 2047 RFC 2047 Message Header Extensions for Non-ASCII Text
メールのヘッダは ASCII のみ ASCII以外の文字列をヘッダに書けるようにするために 作られた規格 https://tools.ietf.org/html/rfc2047 4
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
エンコードのつらみ エンコードのつらみ 6
Bエンコーディングは基本的には文字列をBase64化して 前後に文字列をつけるだけ 日本語 → 5pel5pys6Kqe → =?UTF-8?B?5pel5pys6Kqe?= つらくない 7
↓ 長い… Subject: MIMEヘッダエンコーディングは複雑すぎてつらい Subject: =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+ikh+mbkeOBmeOBjuOBpuOBpOOCieOBhA==?= 8
メールのヘッダだから折り返しちゃえ! ダメ 折り返せるのは空白文字の箇所だけ Subject: =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+ik h+mbkeOBmeOBjuOBpuOBpOOCieOBhA==?= 9
複数のエンコーディング文字列に分割する エンコーディング文字列間の空白は取り除かれる仕様 だからよさそう でも実はこれでもダメ Subject: =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+ik?= =?UTF-8?B?h+mbkeOBmeOBjuOBpuOBpOOCieOBhA==?= 10
文字を分割しちゃダメ 「複」(E8 A4 87) が分割されてしまっている =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+ik?= → MIMEヘッダエンコーディングは<E8><A4> =?UTF-8?B?h+mbkeOBmeOBjuOBpuOBpOOCieOBhA==?= →
<87>雑すぎてつらい 11
文字単位で処理しないといけない =?UTF-8?B?TUlNReODmOODg+ODgOOCqOODs+OCs+ODvOODh+OCo+ODs+OCsOOBr+==?= → MIMEヘッダエンコーディングは =?UTF-8?B?6KSH6ZuR44GZ44GO44Gm44Gk44KJ44GE?= → 複雑すぎてつらい 12
さらに ISO-2022-JP のような状態を持つ文字コードの場合は ASCII で終了しないといけない <ESC>$B : JIS X 0208
<ESC>(B : US-ASCII 日本語ABCあいう → <ESC>$BF|K\8l<ESC>(BABC<ESC>$B$"$$$&<ESC>(B 13
これは OK <ESC>$BF|K\8l<ESC>(BABC⏎ 日本語ABC <ESC>$B$"$$$&<ESC>(B あいう 14
これはNG <ESC>$BF|K\8l<ESC>(BABC<ESC>$B$"⏎ 日本語ABCあ $$$&<ESC>(B いう 15
やるならエンコーディング文字列の最後にASCIIに戻す <ESC>$BF|K\8l<ESC>(BABC<ESC>$B$"<ESC>(B⏎ 日本語ABCあ <ESC>$B$$$&<ESC>(B いう 16
デコードのつらみ デコードのつらみ 17
文字が分割されている =?UTF-8?B?44GC44GE44GG44GI44E=?=⏎ あいうえ<E3><81> =?UTF-8?B?iuOBi+OBjeOBj+OBkeOBkw==?= <8A>かきくけこ ↓ あいうえ???かきくけこ 18
エンコーディング文字列がつながってる 本当はデコードしちゃダメ =?UTF-8?B?44GC44GE44GG44GI44GK?==?UTF-8?B?44GL44GN44GP44GR44GT?= 19
「"」で括られている 添付ファイル名とかでよく見る 本当はデコードしちゃダメ "=?UTF-8?B?44GC44GE44GG44GI44GK?=" 20
ISO-2022-JP と書かれてるのに ISO-2022-JP に無い文字が含まれている 「ア」「①」「Ⅲ」「㍻」「髙」など 本当はダメなんだけど普通に使われてる ISO-2022-JP じゃなくて CP50221 として扱う
21
つらい 😇 つらい 😇 22