続・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部がエンコードされてたりされてなかったりするのは、実際に存在するわけで、間違ったわけではありません。