1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/imiptools/utils.py Sun Oct 01 15:06:09 2017 +0200
1.3 @@ -0,0 +1,59 @@
1.4 +#!/usr/bin/env python
1.5 +
1.6 +"""
1.7 +Mail-related utilities.
1.8 +
1.9 +Copyright (C) 2015, 2016, 2017 Paul Boddie <paul@boddie.org.uk>
1.10 +
1.11 +This program is free software; you can redistribute it and/or modify it under
1.12 +the terms of the GNU General Public License as published by the Free Software
1.13 +Foundation; either version 3 of the License, or (at your option) any later
1.14 +version.
1.15 +
1.16 +This program is distributed in the hope that it will be useful, but WITHOUT
1.17 +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
1.18 +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
1.19 +details.
1.20 +
1.21 +You should have received a copy of the GNU General Public License along with
1.22 +this program. If not, see <http://www.gnu.org/licenses/>.
1.23 +"""
1.24 +
1.25 +from email.generator import Generator
1.26 +
1.27 +try:
1.28 + from cStringIO import StringIO
1.29 +except ImportError:
1.30 + from StringIO import StringIO
1.31 +
1.32 +def message_as_string(message):
1.33 +
1.34 + """
1.35 + Return the string representation of 'message', attempting to preserve the
1.36 + precise original formatting.
1.37 + """
1.38 +
1.39 + out = StringIO()
1.40 + generator = Generator(out, False, 0) # disable reformatting measures
1.41 + generator.flatten(message)
1.42 + return out.getvalue()
1.43 +
1.44 +def decode_part(part):
1.45 +
1.46 + """
1.47 + Change the transfer encoding on 'part' and its subparts so that a plain text
1.48 + representation may be displayed.
1.49 + """
1.50 +
1.51 + payload = part.get_payload(decode=True)
1.52 + if payload:
1.53 + encoding = part.get("Content-Transfer-Encoding")
1.54 + if encoding:
1.55 + del part["Content-Transfer-Encoding"]
1.56 + part["Content-Transfer-Encoding"] = "8bit"
1.57 + part.set_payload(payload)
1.58 + else:
1.59 + for p in part.get_payload():
1.60 + decode_part(p)
1.61 +
1.62 +# vim: tabstop=4 expandtab shiftwidth=4
2.1 --- a/tools/showmail.py Sat Sep 30 01:27:19 2017 +0200
2.2 +++ b/tools/showmail.py Sun Oct 01 15:06:09 2017 +0200
2.3 @@ -3,7 +3,7 @@
2.4 """
2.5 Show a MIME-encoded e-mail message as plain text.
2.6
2.7 -Copyright (C) 2015, 2016 Paul Boddie <paul@boddie.org.uk>
2.8 +Copyright (C) 2015, 2016, 2017 Paul Boddie <paul@boddie.org.uk>
2.9
2.10 This program is free software; you can redistribute it and/or modify it under
2.11 the terms of the GNU General Public License as published by the Free Software
2.12 @@ -20,14 +20,19 @@
2.13 """
2.14
2.15 from email import message_from_string
2.16 -from email.generator import Generator
2.17 -from os.path import split
2.18 +from os.path import abspath, split
2.19 import sys
2.20
2.21 +# Find the modules.
2.22 +
2.23 try:
2.24 - from cStringIO import StringIO
2.25 + import imiptools
2.26 except ImportError:
2.27 - from StringIO import StringIO
2.28 + parent = abspath(split(split(__file__)[0])[0])
2.29 + if split(parent)[1] == "imip-agent":
2.30 + sys.path.append(parent)
2.31 +
2.32 +from imiptools.utils import decode_part, message_as_string
2.33
2.34 def until_from(f, skip=0):
2.35 number = 0
2.36 @@ -48,36 +53,6 @@
2.37 else:
2.38 return ""
2.39
2.40 -def as_string(message):
2.41 -
2.42 - """
2.43 - Return the string representation of 'message', attempting to preserve the
2.44 - precise original formatting.
2.45 - """
2.46 -
2.47 - out = StringIO()
2.48 - generator = Generator(out, False, 0) # disable reformatting measures
2.49 - generator.flatten(message)
2.50 - return out.getvalue()
2.51 -
2.52 -def decode(part):
2.53 -
2.54 - """
2.55 - Change the transfer encoding on 'part' and its subparts so that a plain text
2.56 - representation may be displayed.
2.57 - """
2.58 -
2.59 - payload = part.get_payload(decode=True)
2.60 - if payload:
2.61 - encoding = part.get("Content-Transfer-Encoding")
2.62 - if encoding:
2.63 - del part["Content-Transfer-Encoding"]
2.64 - part["Content-Transfer-Encoding"] = "8bit"
2.65 - part.set_payload(payload)
2.66 - else:
2.67 - for p in part.get_payload():
2.68 - decode(p)
2.69 -
2.70 # Main program.
2.71
2.72 if __name__ == "__main__":
2.73 @@ -95,7 +70,7 @@
2.74
2.75 skip = int((sys.argv[1:] or [0])[0])
2.76 message = message_from_string(until_from(sys.stdin, skip))
2.77 - decode(message)
2.78 - print as_string(message)
2.79 + decode_part(message)
2.80 + print message_as_string(message)
2.81
2.82 # vim: tabstop=4 expandtab shiftwidth=4