X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=mimedecode.py;h=164cebf7184a7bb1e38b07839d7b0705af4ece43;hb=de1ef9c0262b670f345870a50a794c2dcd864e69;hp=b1b18e3beab25ac36a34edf139097b1898400cfb;hpb=554b3f06f7f69d0f570ebac18b1d9161ac7ddf5f;p=mimedecode.git diff --git a/mimedecode.py b/mimedecode.py index b1b18e3..164cebf 100755 --- a/mimedecode.py +++ b/mimedecode.py @@ -30,9 +30,6 @@ Usage: %s [-h|--help] [-V|--version] [-cCDP] [-H|--host=hostname] [-f charset] [ sys.exit(code) -def output(s): - gopts.outfile.write(s) - def output_headers(msg): unix_from = msg.get_unixfrom() if unix_from: @@ -45,7 +42,6 @@ def output_headers(msg): def recode(s, charset): return unicode(s, charset, "replace").encode(gopts.default_encoding, "replace") - def recode_if_needed(s, charset): if charset and charset.lower() <> gopts.default_encoding: s = recode(s, charset) @@ -77,7 +73,6 @@ def _decode_header(s): # together into the final string. return ''.join(rtn) - def decode_header(msg, header): "Decode mail header (if exists) and put it back, if it was encoded" @@ -91,7 +86,6 @@ def decode_header(msg, header): def _decode_header_param(s): return recode_if_needed(s[2], s[0]) - def decode_header_param(msg, header, param): "Decode mail header's parameter (if exists) and put it back, if it was encoded" @@ -133,7 +127,6 @@ def set_content_type(msg, newtype, charset=None): msg.set_param("charset", charset, "Content-Type") - caps = None # Globally stored mailcap database; initialized only if needed def decode_body(msg, s): @@ -193,7 +186,7 @@ def totext(msg, instring): "Convert instring content to text" if msg.is_multipart(): # Recursively decode all parts of the multipart message - newfile = StringIO(str(msg)) + newfile = StringIO(msg.as_string()) newfile.seek(0) decode_file(newfile) return @@ -253,7 +246,6 @@ def decode_file(infile): "Decode the entire message" msg = email.message_from_file(infile) - boundary = msg.get_boundary() if msg.is_multipart(): decode_headers(msg) @@ -262,6 +254,8 @@ def decode_file(infile): if msg.preamble: # Preserve the first part, it is probably not a RFC822-message output(msg.preamble) # Usually it is just a few lines of text (MIME warning) + boundary = msg.get_boundary() + for subpart in msg.get_payload(): output("\n--%s\n" % boundary) decode_part(subpart) @@ -276,7 +270,7 @@ def decode_file(infile): decode_part(msg) else: # Not a message, just text - copy it literally - output(str(msg)) + output(msg.as_string()) class GlobalOptions: @@ -354,9 +348,12 @@ if __name__ == "__main__": la = len(arguments) if la == 0: gopts.input_filename = '-' - gopts.output_filename = '-' infile = sys.stdin - outfile = sys.stdout + if gopts.output_filename: + outfile = open(gopts.output_filename, 'w') + else: + gopts.output_filename = '-' + outfile = sys.stdout elif la in (1, 2): if (arguments[0] == '-'): gopts.input_filename = '-' @@ -382,16 +379,20 @@ if __name__ == "__main__": else: usage(1, 'Too many arguments') - if (infile is sys.stdin) and (outfile is sys.stdout) and \ - sys.stdin.isatty() and sys.stdout.isatty(): - usage(1, 'Filtering from console to console is forbidden') + if (infile is sys.stdin) and sys.stdin.isatty(): + if (outfile is sys.stdout) and sys.stdout.isatty(): + usage() + usage(1, 'Filtering from console is forbidden') if not gopts.host_name: import socket gopts.host_name = socket.gethostname() gopts.outfile = outfile - decode_file(infile) + output = outfile.write - infile.close() - outfile.close() + try: + decode_file(infile) + finally: + infile.close() + outfile.close()