Skip to content

Python 2 email モジュールの MIME ヘッダーエンコーディング行折り畳み処理のバグ回避の対応

https://mail.osstech.co.jp/pipermail/ost-support/2018-October/040660.html より:

From: SATOH Fumiyasu <...>
To: masa...@....jp, support@..., itmp...@....jp, tech...@....jp, KDC@....jp
Subject: [OSTS18-05648] Re:  mailmanでメール件名の文字化け
Date: Tue, 16 Oct 2018 11:11:12 +0900
Message-ID: <87ftx6aben.wl-fumiyas@...>

原因は Mailman ではなく Python の email パッケージのバグで
あることがわかりました。以下の例のように、ヘッダーを折り畳む処理に
おいて MIME エンコーディングされたテキストデータの途中に改行を
差し込んでしまう問題があります。

```
$ echo 'Subject: =?ISO-2022-JP?Q?=1B$B<uIU%;%s%=3F!<$h$j=1B(B=20=1B$B=3F=3D9~=3Dq=1B(B?=' \
|python -c 'import sys,email;print email.message_from_file(sys.stdin).as_string()' \
;
Subject: =?ISO-2022-JP?Q?=1B$B<uIU%;
 %s%=3F!<$h$j=1B(B=20=1B$B=3F=3D9~=3Dq=1B(B?=
```

もっと短い再現手順:

```
$ python -c 'from email.header import Header;print Header("X:=?ISO-2022-JP?Q?=1B$B%;%s=1B(B?=",maxlinelen=20)'
X:=?ISO-2022-JP?Q?=1B$B%;
 %s=1B(B?=
```

RHEL 7 の Python はバージョン 2.7 系列 (2.7.5) ですが、
私の手元の Python 3 (3.6.6) では問題ありません。

```
$ python3 -c 'from email.header import Header;print(Header("X:=?ISO-2022-JP?Q?=1B$B%;%s=1B(B?=",maxlinelen=20))'
X:=?ISO-2022-JP?Q?=1B$B%;%s=1B(B?=
```

この問題は OS (RHEL) 標準の mailman パッケージでも再現します。
お手数ですが、RHEL サポートにこの不具合についてお問合せ
いただけないでしょうか。



力技ですが、Mailman でもこの問題を回避する手段を考えました。

以下のコード片を /opt/osstech/etc/mailman/mm_cfg.py の
最後に記述することで Python email.generator.Generator クラスに
よるヘッダーの折り畳み処理を無効化することができます。
これにより投稿メールのヘッダーの折り畳み状態が維持されたまま
会員に配送されるようになります。

```
def email_generator_init_wrapper(self, *args, **kws):
    email.generator.Generator.__init__orig(self, *args, **kws)
    self._maxheaderlen = 0
import email.generator
email.generator.Generator.__init__orig = email.generator.Generator.__init__
email.generator.Generator.__init__ = email_generator_init_wrapper
```
Edited by SATOH Fumiyasu