1.1 --- a/tools/showmail.py Fri Apr 22 20:30:51 2016 +0200
1.2 +++ b/tools/showmail.py Fri Apr 22 20:33:51 2016 +0200
1.3 @@ -1,32 +1,69 @@
1.4 #!/usr/bin/env python
1.5
1.6 from email import message_from_string
1.7 +from email.generator import Generator
1.8 import sys
1.9
1.10 -def until_from(f):
1.11 - l = []
1.12 - s = f.readline()
1.13 - while s:
1.14 - l.append(s)
1.15 +try:
1.16 + from cStringIO import StringIO
1.17 +except ImportError:
1.18 + from StringIO import StringIO
1.19 +
1.20 +def until_from(f, skip=0):
1.21 + number = 0
1.22 + while number <= skip:
1.23 + l = []
1.24 s = f.readline()
1.25 - if s.startswith("From "):
1.26 + while s:
1.27 + l.append(s)
1.28 + s = f.readline()
1.29 + if s.startswith("From "):
1.30 + number += 1
1.31 + break
1.32 + else:
1.33 + number += 1
1.34 break
1.35 - return "".join(l)
1.36 + if number > skip:
1.37 + return "".join(l)
1.38 + else:
1.39 + return ""
1.40 +
1.41 +def as_string(message):
1.42 +
1.43 + """
1.44 + Return the string representation of 'message', attempting to preserve the
1.45 + precise original formatting.
1.46 + """
1.47 +
1.48 + out = StringIO()
1.49 + generator = Generator(out, False, 0) # disable reformatting measures
1.50 + generator.flatten(message)
1.51 + return out.getvalue()
1.52
1.53 def decode(part):
1.54 - for key, value in part.items():
1.55 - if key != "Content-Transfer-Encoding":
1.56 - print "%s: %s" % (key, value)
1.57 - print
1.58 - decoded = part.get_payload(decode=True)
1.59 - if decoded:
1.60 - print decoded
1.61 - print
1.62 +
1.63 + """
1.64 + Change the transfer encoding on 'part' and its subparts so that a plain text
1.65 + representation may be displayed.
1.66 + """
1.67 +
1.68 + payload = part.get_payload(decode=True)
1.69 + if payload:
1.70 + encoding = part.get("Content-Transfer-Encoding")
1.71 + if encoding:
1.72 + del part["Content-Transfer-Encoding"]
1.73 + part["Content-Transfer-Encoding"] = "8bit"
1.74 + part.set_payload(payload)
1.75 else:
1.76 - for part in part.get_payload():
1.77 - decode(part)
1.78 + for p in part.get_payload():
1.79 + decode(p)
1.80 +
1.81 +# Main program.
1.82
1.83 -message = message_from_string(until_from(sys.stdin))
1.84 -decode(message)
1.85 +if __name__ == "__main__":
1.86 + skip = int((sys.argv[1:] or [0])[0])
1.87 + message = message_from_string(until_from(sys.stdin, skip))
1.88 + decode(message)
1.89 + print as_string(message)
1.90
1.91 # vim: tabstop=4 expandtab shiftwidth=4