MIMEエンコードとASCII文字混じりの状態だとemail.header.decode headerの動作が分かりづらい問題
Subject: =?ISO-2022-JP?B?GyRCPSchfCEhPz87UhsoQg?= some string =?ISO-2022-JP?B?GyRCPSchfCEhPz87UhsoQg?=
このような #MIMEエンコード を含む #email のヘッダーをデコードしたい。
Subject: の値のうち =? と ?= で挟まれた部分は以下のような構造になっている。
=?<エンコーディング1>?<エンコーディング2>?<エンコードされた文字列>?=
email.header.decode_header がやっているのは、 <エンコードされた文字列> を <エンコーディング2> でデコードする処理。
上記例では B なので、エンコーディングは #base64 (もし Q なら #quoted-printable )。
decode_header() のあと、 <エンコーディング1> でもう一度decodeする必要がある
decode_header() はその2回目のdecodeをしやすいように (bytes, encoding) を返す
もし #MIMEエンコード されていない文字列(上記例では some string 部分)が渡された場合、もうdecodeする必要はないので (str, None) が返される。
状況によって、 bytes だったり str だったりする
ドキュメントにはそのように書いてない
19.1.11. email.header: 国際化されたヘッダ — Python 3.6.6 ドキュメント
この関数はヘッダのそれぞれのデコードされた部分ごとに、(decoded_string, charset) という形式の 2要素タプルからなるリストを返します。charset はヘッダのエンコードされていない部分に対しては None を、それ以外の場合はエンコードされた文字列が指定している文字集合の名前を小文字からなる文字列で返します。
#Python3