続・MailArchivePluginでHTMLメールをなんとかしたい。

MailArchivePluginでHTMLメールをなんとかしたい。 - すべてがdead beefになる -the unspecified insider- by ivampの続き、というかまとめです。
コードの改良とかはしてません。
あんまりこの辺のこと分かってないので、間違い等あればご指摘していただけるとありがたいです。

まずは、メールの形式について。

1.text/plain
2.text/html
3.multipart/alternative (text/plain + text/html)
4.multipart/mixed (1.〜3.+ 添付ファイル)
5.multipart/mixed (本文が2つ以上)


例えばこんな感じ。
1.text/plain

...
Content-Type: text/plain; charset="iso-2022-jp"
Content=transfer-Encoding: 7bit
...

テキスト形式本文

2.text/html
これは私の環境でサンプルがなかったのですが、たぶんこんな感じ。

...
Content-Type: text/html; charset="iso-2022-jp"
Content=transfer-Encoding: 7bit
...

HTML形式本文

3.multipart/alternative (text/plain + text/html)

...
Content-Type: multipart/alternative; boundary="BOUNDARY"
...

This is a multi-part message in MIME format.

--BOUNDARY
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit

テキスト形式本文
--BOUNDARY
Content-Type: text/html; charset="iso-2022-jp"
Content-Transfer-Encoding: quoted-printable

HTML形式本文(quoted-printableでエンコードされている)
--BOUNDARY

4.multipart/mixed (3.+ 添付ファイル)

Content-Type: multipart/mixed; boundary="BOUNDARY_MIXED"
...

This is a multi-part message in MIME format.

--BOUNDARY_MIXED
Content-Type: multipart/alternative; boundary="BOUNDARY_ALTERNATIVE"


--BOUNDARY_ALTERNATIVE
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit

テキスト形式の本文

--BOUNDARY_ALTERNATIVE
Content-Type: text/html; charset="iso-2022-jp"
Content-Transfer-Encoding: quoted-printable

(Quoted-printableでエンコードされた)HTML形式の本文
--BOUNDARY_ALTERNATIVE

--BOUNDARY_MIXED
Content-Type: image/jpeg; name="PicName.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="PicName.jpg"

Base64でエンコードされたJPEGファイル

--BOUNDARY_MIXED

5.multipart/mixed (本文が2つ以上)
本文が2つ以上なのか、添付ファイルにファイル名がないだけなのか、、、
規格として正しいか分かりませんが、実際に受信したものなので、一応受け取れるようにしておきたい。
ちなみにThunderbirdでは本文にも表示されて、添付ファイルとしてもファイル名Part1.2、Part1.3として表示されました。

...
Content-Type: multipart/mixed; boundary="BOUNDARY_MIXED"
...

This is a multi-part message in MIME format.
--BOUNDARY_MIXED
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

テキスト本文1

--BOUNDARY_MIXED
Content-Type: text/html; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

HTML形式本文2(エンコードなし)

--BOUNDARY_MIXED
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

テキスト形式本文3

--BOUNDARY_MIXED
Content-Type: application/pdf; name="?ISO-2022-JP?B?xxx==?="
Content-Transfer-Encoding: Base64
Content-Disposition: attachment; filename="=?ISO-2022-JP?B?yyy?="

Base64でエンコードされたpdfファイル

--BOUNDARY_MIXED

状況

今のMailArchivePluginだと、、、
1.text/plain => OK
2.text/html => 'html'と表示
3.multipart/alternative => 最後のパートを表示(HTMLならソースが表示される)
4.multipart/mixed => 本文がテキストならOK(添付ファイルは切り出して保存)
5.multipart/mixed => 最後のパートを表示

Hirohiroさんので2.が、僕ので3.5. がなんとかなるのでは、と思っています。
あ、もちろんHTMLがパースできれば3.とかもそっち使っちゃって問題ないと思います。

ソース

MailArchivePluginのRevision92からの比較で変更したところのみ。
ファイルはmailarchiveadmin.pyのみ。
数字は元ファイルの行数。'-'は削除'+'は追加した行です。

231    if content_type == 'multipart/mixed":
232        pass
233    elif content_type == 'text/html' and self.is_file(part) == False:
234 -      body = part.get_payload(decode=1)
    +      pass
235    elif content_type == 'text/plain' and self.is_file(part) == False:
236 -      body = part.get_payload(decode=1)
    +      body += "\n------------------------------\n\n"
    +      current_body = part.get_payload(decode=1)
237        charset = part.get_content_charset()
238        self.print_debug('charset:'+str(charset))
239        # Todo:need try
240        if charset != None:
241 -          body = self.to_unicode(body,charset)
    +          body += self.to_unicode(current_body,charset)
    +      else:
    +          body += current_body
242        elif part.get_payload(decode=1) == None:
243            pass

これだけです。(-_-;

まとめ

まぁいろいろ問題もあるでしょうから、使うときは自己責任でお願いします。
あ、それと今気づいたんですが、multipart/mixed(添付ファイルあり)で、multipart/alternaiveでないtext/htmlが含まれる場合、上のソースだとダメです。ここもHTML->text変換が必要になりますね。

ちなみにHTML部がエンコードされてたりされてなかったりするのは、実際に存在するわけで、間違ったわけではありません。