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.5k
MIMEヘッダエンコーディングは複雑すぎてつらい / MIME header encoding is hard
とみたまさひろ
June 23, 2021
Tweet
Share
More Decks by とみたまさひろ
See All by とみたまさひろ
日本MySQLユーザ会ができるまで / making MyNA
tmtms
1
570
Ruby on Browser - RubyWorld Conference 2024
tmtms
1
1.1k
Ruby on Browser
tmtms
1
1.9k
私のRSpecの書き方 / How I write RSpec
tmtms
5
2k
ショートカットと端末 / shortcut & terminal
tmtms
2
850
文字ときどきRuby / Character and Ruby (NSEG)
tmtms
2
2.2k
文字ときどきRuby / Character and Ruby
tmtms
0
940
Linux用キーリマッパーを作る技術 / How to make Key Remapper
tmtms
0
500
Net::SMTP
tmtms
1
340
Other Decks in Technology
See All in Technology
Delta airlines Customer®️ USA Contact Numbers: Complete 2025 Support Guide
deltahelp
0
930
60以上のプロダクトを持つ組織における開発者体験向上への取り組み - チームAPIとBackstageで構築する組織の可視化基盤 - / sre next 2025 Efforts to Improve Developer Experience in an Organization with Over 60 Products
vtryo
2
490
さくらのIaaS基盤のモニタリングとOpenTelemetry/OSC Hokkaido 2025
fujiwara3
3
460
開発生産性を測る前にやるべきこと - 組織改善の実践 / Before Measuring Dev Productivity
kaonavi
14
6.5k
赤煉瓦倉庫勉強会「Databricksを選んだ理由と、絶賛真っ只中のデータ基盤移行体験記」
ivry_presentationmaterials
2
380
FOSS4G 2025 KANSAI QGISで点群データをいろいろしてみた
kou_kita
0
410
ビギナーであり続ける/beginning
ikuodanaka
3
790
ABEMAの本番環境負荷試験への挑戦
mk2taiga
4
310
american airlines®️ USA Contact Numbers: Complete 2025 Support Guide
supportflight
1
110
Getting to Know Your Legacy (System) with AI-Driven Software Archeology (WeAreDevelopers World Congress 2025)
feststelltaste
1
160
事例で学ぶ!B2B SaaSにおけるSREの実践例/SRE for B2B SaaS: A Real-World Case Study
bitkey
1
160
SREの次のキャリアの道しるべ 〜SREがマネジメントレイヤーに挑戦して、 気づいたこととTips〜
coconala_engineer
1
150
Featured
See All Featured
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.5k
Building an army of robots
kneath
306
45k
How to Ace a Technical Interview
jacobian
278
23k
Fireside Chat
paigeccino
37
3.5k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
138
34k
Unsuck your backbone
ammeep
671
58k
Designing for Performance
lara
610
69k
BBQ
matthewcrist
89
9.7k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Mobile First: as difficult as doing things right
swwweet
223
9.7k
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