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
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)
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)
"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)
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'):
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
output(os.linesep)
first_subpart = True
- boundary = msg.get_boundary()
-
for subpart in msg.get_payload():
if boundary:
if first_subpart:
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
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='])
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':