def test_mondo_message(self): eq = self.assertEqual neq = self.ndiffAssertEqual msg = self._msgobj('crispin-torture.txt') payload = msg.get_payload() eq(type(payload), ListType) eq(len(payload), 12) eq(msg.preamble, None) eq(msg.epilogue, '\n') fp = StringIO() _structure(msg, fp=fp) neq(fp.getvalue(), 'multipart/mixed\n text/plain\n message/rfc822\n multipart/alternative\n text/plain\n multipart/mixed\n text/richtext\n application/andrew-inset\n message/rfc822\n audio/basic\n audio/basic\n image/pbm\n message/rfc822\n multipart/mixed\n multipart/mixed\n text/plain\n audio/x-sun\n multipart/mixed\n image/gif\n image/gif\n application/x-be2\n application/atomicmail\n audio/x-sun\n message/rfc822\n multipart/mixed\n text/plain\n image/pgm\n text/plain\n message/rfc822\n multipart/mixed\n text/plain\n image/pbm\n message/rfc822\n application/postscript\n image/gif\n message/rfc822\n multipart/mixed\n audio/basic\n audio/basic\n message/rfc822\n multipart/mixed\n application/postscript\n text/plain\n message/rfc822\n multipart/mixed\n text/plain\n multipart/parallel\n image/gif\n audio/basic\n application/atomicmail\n message/rfc822\n audio/x-sun\n') return
def test_mondo_message(self): eq = self.assertEqual neq = self.ndiffAssertEqual msg = self._msgobj('crispin-torture.txt') payload = msg.get_payload() eq(type(payload), ListType) eq(len(payload), 12) eq(msg.preamble, None) eq(msg.epilogue, '\n') # Probably the best way to verify the message is parsed correctly is to # dump its structure and compare it against the known structure. fp = StringIO() _structure(msg, fp=fp) neq( fp.getvalue(), """\ multipart/mixed text/plain message/rfc822 multipart/alternative text/plain multipart/mixed text/richtext application/andrew-inset message/rfc822 audio/basic audio/basic image/pbm message/rfc822 multipart/mixed multipart/mixed text/plain audio/x-sun multipart/mixed image/gif image/gif application/x-be2 application/atomicmail audio/x-sun message/rfc822 multipart/mixed text/plain image/pgm text/plain message/rfc822 multipart/mixed text/plain image/pbm message/rfc822 application/postscript image/gif message/rfc822 multipart/mixed audio/basic audio/basic message/rfc822 multipart/mixed application/postscript text/plain message/rfc822 multipart/mixed text/plain multipart/parallel image/gif audio/basic application/atomicmail message/rfc822 audio/x-sun """)
def test_mondo_message(self): eq = self.assertEqual neq = self.ndiffAssertEqual msg = self._msgobj('crispin-torture.txt') payload = msg.get_payload() eq(type(payload), ListType) eq(len(payload), 12) eq(msg.preamble, None) eq(msg.epilogue, '\n') # Probably the best way to verify the message is parsed correctly is to # dump its structure and compare it against the known structure. fp = StringIO() _structure(msg, fp=fp) neq(fp.getvalue(), """\ multipart/mixed text/plain message/rfc822 multipart/alternative text/plain multipart/mixed text/richtext application/andrew-inset message/rfc822 audio/basic audio/basic image/pbm message/rfc822 multipart/mixed multipart/mixed text/plain audio/x-sun multipart/mixed image/gif image/gif application/x-be2 application/atomicmail audio/x-sun message/rfc822 multipart/mixed text/plain image/pgm text/plain message/rfc822 multipart/mixed text/plain image/pbm message/rfc822 application/postscript image/gif message/rfc822 multipart/mixed audio/basic audio/basic message/rfc822 multipart/mixed application/postscript text/plain message/rfc822 multipart/mixed text/plain multipart/parallel image/gif audio/basic application/atomicmail message/rfc822 audio/x-sun """)
def mail_body_parser(body): if not hasattr(body, 'as_string'): fpr.err('Message can not be processed or not loaded !') return b = email.message_from_string(body.as_string()) btype = b.get_content_type() dbginfo('debug', 'btype is %s' % btype) print # parse the body and save split parts in dictionary dparts = dict() body_parser(dparts, b) fpr.cyan('=' * (tc - 4)) # pprint(dparts) if DEBUG: dbginfo('debug', str(dparts.keys())) fpr.cyan('=' * (tc - 4)) ## build a dictionary print if not dparts.keys(): fpr('No MIME parts found') return mimemulti = ['multipart/mixed', 'multipart/alternative'] print mimemulti while True: bancls() fpr('Message MIME structure') print fpr('_' * (tc - 4)) print bstrio = StringIO() _structure(b, bstrio) fpr.warn('%s' % bstrio.getvalue()) #fpr.warn(_structure(bpart)) fpr('_' * (tc - 4)) print fpr('MIME parts ready to review:') print for k in dparts.keys(): #print k #print type(k) if dparts[k]['type'] in mimemulti: fpr.info(' [%s] %s ' % (k, dparts[k]['type'][:69])) else: fpr(' [%s] %s ' % (k, dparts[k]['type'][:69])) print op = raw_input(' []> ') # dparts keys are int not strings if op.isdigit(): k = int(op) if op == '': break while k in dparts.keys(): bancls() fpr('MIME Headers: %s' % k) fpr('_' * (tc - 4)) print for (h, hv) in dparts[k]['mheaders']: fpr('%s: %s' % (h, hv)) fpr('_' * (tc - 4)) print # pprint(dparts) # waitin() if dparts[k].get('type') in mimemulti: fpr.warn('This part is not directly viewable') waitin() break elif dparts[k].get('payload'): fpr('Choose option:') print fpr(' 1) view payload') fpr(' 2) save payload') fpr.off(' 3) attach payload to composer [?future feature?]') print op = raw_input(' []> ') if op == '': waitin() break # --- view payload --- if op in ['1']: bancls() fpr('MIME Payload ') print fpr.warn('%s' % dparts[k].get('type')) print xe = 0 for (h, hv) in dparts[k].get('mheaders'): #fpr('%s: %s' % (h,hv)) if h.lower() == 'content-transfer-encoding': #part['encext'] = '.'+hv.lower() if hv in ['base64']: info( 'info', 'This payload is base64 encoded. You can view it as it is or try to decode it first.' ) print if get_yesno_input( ' Would like to decode the payload first [y/N]:> ' ): dp = decode_attch(dparts[k]['payload']) #pprint(dp) #print len(dp.get('raw')) #print len(str(dp)) if len(dp.get('raw')) > tr: #if True: if get_yesno_input( ' Would like to use system pager to view it [y/N]:> ' ): fpr('_' * (tc - 4)) print pager = Less(num_lines=tr) print dp.get('raw') | pager fpr('_' * (tc - 4)) else: fpr('_' * (tc - 4)) print fpr(dp.get('raw')) print fpr('_' * (tc - 4)) waitin() xe = 1 break # if viewed decoded part do not display encoded one if xe: break print if len(dparts[k].get('payload')) > tr: if get_yesno_input( ' Would like to use system pager to view it [y/N]:> ' ): fpr('_' * (tc - 4)) print pager = Less(num_lines=tr) print dparts[k]['payload'] | pager fpr('_' * (tc - 4)) else: fpr('_' * (tc - 4)) print fpr(dparts[k]['payload']) print fpr('_' * (tc - 4)) else: fpr('_' * (tc - 4)) print if type(dparts[k].get('payload')) is not 'str': fpr.err('An error occured') else: fpr(dparts[k].get('payload')) print fpr('_' * (tc - 4)) waitin() if op in ['2']: bancls() fpr('MIME Payload export') fpr('Choose option:') print fpr(' 1) save payload, as it is (no decoding)') fpr(' 2) save payload - base64 decoded') print op = raw_input(' []> ') print if op == '': waitin() break if op in ['1']: bancls() mpart_saver(dparts[k], 1) waitin() if op in ['2']: bancls() mpart_saver(dparts[k], 2) waitin() break else: fpr.warn( 'Wrr: Empty payloyd. Message malformed or parsing has failed.' ) waitin() break
def viewTheMsg(s=0): # from core.ui.cless import Less # from core.msg.builder import msg_builder # try: # from cStringIO import StringIO # except: # from StringIO import StringIO # fs = StringIO() # # from email.MIMEBase import MIMEBase # from email.iterators import _structure # from email.message import Message msgdata = msg_builder() if DEBUG > 1: from pprint import pprint print '----' pprint(msgdata) print 'type:', type(msgdata) print 'repr:', repr(msgdata) print 'dir :', dir(msgdata) print '__len__():', msgdata.__len__() # no. of headers print '__str__():', msgdata.__str__() print 'len():', len(msgdata) print msgdata.get_payload() print '----' if hasattr(msgdata, 'as_string'): fpr.blue('_' * (tc - 4)) print #if msgdata != MIMEBase: if True: # view the message mime structure if s: #email.iterators._structure(msgdata, fs) if hasattr(msgdata, 'get_content_typ'): _structure(msgdata, fs) #fpr.blue('%s' % email.iterators._structure(msgdata) ) fpr.warn('%s' % fs.getvalue()) else: fpr.warn( 'For custom message currently MIME structure is not checked !' ) # view message data else: #print fpr.GRAY #dl = len(str(msgdata).splitlines()) dl = len(msgdata.as_string(unixfrom=False).splitlines()) if dl > tr: fpr('Message data is bigger than your screen (%s lines)' % dl) if raw_input( ' Would like to use system pager to view it [y/N]:> ' ) in ['y', 'Y']: fpr.blue('_' * (tc - 4)) print pager = Less(num_lines=tr) print msgdata.as_string(unixfrom=False) | pager else: fpr.blue('_' * (tc - 4)) print print msgdata.as_string(unixfrom=False) else: print msgdata.as_string(unixfrom=False) #print len(str(msgdata).splitlines()),tr #print msgdata #print fpr.RCL #else: # fpr.info('No content data was defined !') # if msgdata == Message: # print msgdata # elif smtp['use_mime'] == 0: # if s: # dbginfo('warn','MIME structure view is not supprted for customized content!') # # dl = len(msgdata.as_string(unixfrom=False).splitlines()) # print msgdata.as_string(unixfrom=False) # print 'len ', dl fpr.blue('_' * (tc - 4)) else: fpr.warn('No content data was defined !') fs.close()
def test_mondo_message(self): eq = self.assertEqual neq = self.ndiffAssertEqual msg = self._msgobj('crispin-torture.txt') payload = msg.get_payload() eq(type(payload), list) eq(len(payload), 12) eq(msg.preamble, None) eq(msg.epilogue, '\n') fp = StringIO() _structure(msg, fp=fp) neq( fp.getvalue(), """multipart/mixed text/plain message/rfc822 multipart/alternative text/plain multipart/mixed text/richtext application/andrew-inset message/rfc822 audio/basic audio/basic image/pbm message/rfc822 multipart/mixed multipart/mixed text/plain audio/x-sun multipart/mixed image/gif image/gif application/x-be2 application/atomicmail audio/x-sun message/rfc822 multipart/mixed text/plain image/pgm text/plain message/rfc822 multipart/mixed text/plain image/pbm message/rfc822 application/postscript image/gif message/rfc822 multipart/mixed audio/basic audio/basic message/rfc822 multipart/mixed application/postscript text/plain message/rfc822 multipart/mixed text/plain multipart/parallel image/gif audio/basic application/atomicmail message/rfc822 audio/x-sun """)
def get_stucture(self): 'print to stdout.' _structure(self.msg)