Add support for message/partial
This doesn't handle the case where total isn't present on all parts, but I don't actually expect to encounter that (and if I do, it will crash and I can fix it).
This commit is contained in:
parent
d5e557e8e4
commit
b5c979d5cb
29
mbox2web
29
mbox2web
|
@ -1,5 +1,6 @@
|
||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import email.parser
|
||||||
import html
|
import html
|
||||||
import html.parser
|
import html.parser
|
||||||
import mailbox
|
import mailbox
|
||||||
|
@ -45,6 +46,8 @@ def render_message(msg):
|
||||||
msghtml = msgtmpl.render(context)
|
msghtml = msgtmpl.render(context)
|
||||||
return jinja2.Markup(msghtml)
|
return jinja2.Markup(msghtml)
|
||||||
|
|
||||||
|
partial_message_cache = {}
|
||||||
|
|
||||||
def render_body(msg):
|
def render_body(msg):
|
||||||
content_type = msg.get_content_type()
|
content_type = msg.get_content_type()
|
||||||
|
|
||||||
|
@ -88,6 +91,32 @@ def render_body(msg):
|
||||||
elif content_type == "text/enriched":
|
elif content_type == "text/enriched":
|
||||||
tepart = TextEnrichedPart(msg.get_payload())
|
tepart = TextEnrichedPart(msg.get_payload())
|
||||||
bodyhtml = tepart.as_string()
|
bodyhtml = tepart.as_string()
|
||||||
|
elif content_type == "message/partial":
|
||||||
|
# Default header for get_param is Content-Type
|
||||||
|
whole_msg_id = msg.get_param("id")
|
||||||
|
if not whole_msg_id in partial_message_cache:
|
||||||
|
# For now we assume that total is present on all parts. This
|
||||||
|
# isn't guarantueed, however, and we may need to handle the
|
||||||
|
# case where total is only present on the last part.
|
||||||
|
partial_message_cache[whole_msg_id] = [None] * int(msg.get_param("total"))
|
||||||
|
payload = msg.get_payload()
|
||||||
|
s = payload[0].as_string() # Only one part
|
||||||
|
partial_message_cache[whole_msg_id][int(msg.get_param("number"))-1] = s
|
||||||
|
if not None in partial_message_cache[whole_msg_id]:
|
||||||
|
p = email.parser.Parser()
|
||||||
|
whole_msg = p.parsestr("".join(partial_message_cache[whole_msg_id]))
|
||||||
|
whole_msg_embedded_id = whole_msg["Message-Id"]
|
||||||
|
if not whole_msg_embedded_id:
|
||||||
|
whole_msg.add_header("Message-Id", "<" + whole_msg_id + ">")
|
||||||
|
whole_msg_embedded_id = whole_msg_id
|
||||||
|
archive(whole_msg)
|
||||||
|
del partial_message_cache[whole_msg_id]
|
||||||
|
bodyhtml = "<p>This is part %d of %d of <a href='../%s/'>%s</a></p>" % (
|
||||||
|
int(msg.get_param("number")),
|
||||||
|
int(msg.get_param("total")),
|
||||||
|
encode_message_id(whole_msg_id),
|
||||||
|
html.escape(whole_msg_id))
|
||||||
|
|
||||||
else:
|
else:
|
||||||
raise RuntimeError("Content-type " + content_type + " not implemented yet")
|
raise RuntimeError("Content-type " + content_type + " not implemented yet")
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue