]> git.phdru.name Git - mimedecode.git/blobdiff - mimedecode.py
Use raise Exception() for Python 3 compatibility
[mimedecode.git] / mimedecode.py
index 0714c874863da054c9f9b01f9b0a0e4d7958d551..8c18c6ae0cbc1ff752092c07f24ae6759ce57949 100755 (executable)
@@ -34,7 +34,7 @@ def output_headers(msg):
 
 
 def recode_if_needed(s, charset):
-    if charset and charset.lower() <> g.default_encoding:
+    if charset and charset.lower() != g.default_encoding:
         s = unicode(s, charset, "replace").encode(g.default_encoding, "replace")
     return s
 
@@ -69,7 +69,7 @@ def decode_header(msg, header):
     if msg.has_key(header):
         value = msg[header]
         new_value = _decode_header(value)
-        if new_value <> value: # do not bother to touch msg if not changed
+        if new_value != value: # do not bother to touch msg if not changed
             set_header(msg, header, new_value)
 
 
@@ -83,7 +83,7 @@ def decode_header_param(msg, header, param):
                 new_value = recode_if_needed(value[2], value[0])
             else:
                 new_value = _decode_header(value)
-            if new_value <> value: # do not bother to touch msg if not changed
+            if new_value != value: # do not bother to touch msg if not changed
                 msg.set_param(param, new_value, header)
 
 
@@ -241,7 +241,7 @@ def recode_charset(msg, s):
     "Recode charset of the message to the default charset"
 
     save_charset = charset = msg.get_content_charset()
-    if charset and charset.lower() <> g.default_encoding:
+    if charset and charset.lower() != g.default_encoding:
         s = recode_if_needed(s, charset)
         content_type = msg.get_content_type()
         set_content_type(msg, content_type, g.default_encoding)
@@ -333,6 +333,8 @@ def decode_part(msg):
         elif content_type in g.binary_mask:
             left_binary = True
             break
+        elif content_type in g.fully_ignore_mask:
+            return
 
     encoding = msg["Content-Transfer-Encoding"]
     if left_binary or encoding in (None, '', '7bit', '8bit', 'binary'):
@@ -364,19 +366,69 @@ def decode_part(msg):
     for content_type in masks:
         if content_type in g.save_headers_mask:
             _save_message(msg, outstring, save_headers=True, save_body=False)
-        elif content_type in g.save_body_mask:
+        if content_type in g.save_body_mask:
             _save_message(msg, outstring, save_headers=False, save_body=True)
-        elif content_type in g.save_message_mask:
+        if content_type in g.save_message_mask:
             _save_message(msg, outstring, save_headers=True, save_body=True)
 
     for content_type in masks:
         if content_type in g.error_mask:
-            raise ValueError, "content type %s prohibited" % ctype
+            raise ValueError("content type %s prohibited" % ctype)
 
 def decode_multipart(msg):
     "Decode multipart"
 
     decode_headers(msg)
+    boundary = msg.get_boundary()
+
+    masks = []
+    ctype = msg.get_content_type()
+    if ctype:
+        masks.append(ctype)
+        mtype = ctype.split('/')[0]
+        masks.append(mtype + '/*')
+    masks.append('*/*')
+
+    for content_type in masks:
+        if content_type in g.fully_ignore_mask:
+            return
+        elif content_type in g.ignore_mask:
+            output_headers(msg)
+            output("%sMessage body of type %s skipped.%s" % (os.linesep, ctype, os.linesep))
+            if boundary:
+                output("%s--%s--%s" % (os.linesep, boundary, os.linesep))
+            return
+
+    for content_type in masks:
+        if content_type in g.save_body_mask or \
+                content_type in g.save_message_mask:
+            _out_l = []
+            first_subpart = True
+            for subpart in msg.get_payload():
+                if first_subpart:
+                    first_subpart = False
+                else:
+                    _out_l.append(os.linesep)
+                _out_l.append("--%s%s" % (boundary, os.linesep))
+                _out_l.append(subpart.as_string())
+            _out_l.append("%s--%s--%s" % (os.linesep, boundary, os.linesep))
+            outstring = ''.join(_out_l)
+            break
+    else:
+        outstring = None
+
+    for content_type in masks:
+        if content_type in g.save_headers_mask:
+            _save_message(msg, outstring, save_headers=True, save_body=False)
+        if content_type in g.save_body_mask:
+            _save_message(msg, outstring, save_headers=False, save_body=True)
+        if content_type in g.save_message_mask:
+            _save_message(msg, outstring, save_headers=True, save_body=True)
+
+    for content_type in masks:
+        if content_type in g.error_mask:
+            raise ValueError("content type %s prohibited" % ctype)
+
     output_headers(msg)
 
     if msg.preamble: # Preserve the first part, it is probably not a RFC822-message
@@ -385,8 +437,6 @@ def decode_multipart(msg):
         output(os.linesep)
 
     first_subpart = True
-    boundary = msg.get_boundary()
-
     for subpart in msg.get_payload():
         if boundary:
             if first_subpart:
@@ -458,7 +508,8 @@ class GlobalOptions:
     totext_mask = [] # A list of content-types to decode
     binary_mask = [] # A list of content-types to pass through
     decoded_binary_mask = [] # A list of content-types to pass through (content-transfer-decoded)
-    ignore_mask = [] # Ignore (skip, do not decode and do not include into output)
+    ignore_mask = [] # Ignore (do not decode and do not include into output) but output a warning instead of the body
+    fully_ignore_mask = [] # Completely ignore - no headers, no body, no warning
     error_mask = []  # Raise error if encounter one of these
 
     save_counter = 0
@@ -478,7 +529,7 @@ def get_opts():
 
     try:
         options, arguments = getopt(sys.argv[1:],
-            'hVcCDPH:f:d:p:r:R:b:B:e:i:t:O:o:',
+            'hVcCDPH:f:d:p:r:R:b:B:e:I:i:t:O:o:',
             ['help', 'version', 'host=',
              'save-headers=', 'save-body=', 'save-message=',
              'set-header=', 'set-param='])
@@ -527,6 +578,8 @@ def get_opts():
             g.binary_mask.append(value)
         elif option == '-b':
             g.decoded_binary_mask.append(value)
+        elif option == '-I':
+            g.fully_ignore_mask.append(value)
         elif option == '-i':
             g.ignore_mask.append(value)
         elif option == '-e':