⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mimetool.py

📁 minimal python variant for small footprint apps like embedded apps
💻 PY
字号:
# Various tools used by MIME-reading or MIME-writing programs.import osimport rfc822import stringimport tempfile# A derived class of rfc822.Message that knows about MIME headers and# contains some hooks for decoding encoded and multipart messages.class Message(rfc822.Message):	def __init__(self, fp, seekable = 1):		rfc822.Message.__init__(self, fp, seekable)		self.encodingheader = \			self.getheader('content-transfer-encoding')		self.typeheader = \			self.getheader('content-type')		self.parsetype()		self.parseplist()	def parsetype(self):		str = self.typeheader		if str == None:			str = 'text/plain'		if ';' in str:			i = string.index(str, ';')			self.plisttext = str[i:]			str = str[:i]		else:			self.plisttext = ''		fields = string.splitfields(str, '/')		for i in range(len(fields)):			fields[i] = string.lower(string.strip(fields[i]))		self.type = string.joinfields(fields, '/')		self.maintype = fields[0]		self.subtype = string.joinfields(fields[1:], '/')	def parseplist(self):		str = self.plisttext		self.plist = []		while str[:1] == ';':			str = str[1:]			if ';' in str:				# XXX Should parse quotes!				end = string.index(str, ';')			else:				end = len(str)			f = str[:end]			if '=' in f:				i = string.index(f, '=')				f = string.lower(string.strip(f[:i])) + \					'=' + string.strip(f[i+1:])			self.plist.append(string.strip(f))			str = str[end:]	def getplist(self):		return self.plist	def getparam(self, name):		name = string.lower(name) + '='		n = len(name)		for p in self.plist:			if p[:n] == name:				return rfc822.unquote(p[n:])		return None	def getparamnames(self):		result = []		for p in self.plist:			i = string.find(p, '=')			if i >= 0:				result.append(string.lower(p[:i]))		return result	def getencoding(self):		if self.encodingheader == None:			return '7bit'		return string.lower(self.encodingheader)	def gettype(self):		return self.type	def getmaintype(self):		return self.maintype	def getsubtype(self):		return self.subtype# Utility functions# -----------------# Return a random string usable as a multipart boundary.# The method used is so that it is *very* unlikely that the same# string of characters will every occur again in the Universe,# so the caller needn't check the data it is packing for the# occurrence of the boundary.## The boundary contains dots so you have to quote it in the header._prefix = Nonedef choose_boundary():	global _prefix	import time	import random	if _prefix == None:		import socket		import os		hostid = socket.gethostbyname(socket.gethostname())		try:		    uid = `os.getuid()`		except:		    uid = '1'		try:		    pid = `os.getpid()`		except:		    pid = '1'		_prefix = hostid + '.' + uid + '.' + pid	timestamp = '%.3f' % time.time()	seed = `random.randint(0, 32767)`	return _prefix + '.' + timestamp + '.' + seed# Subroutines for decoding some common content-transfer-typesdef decode(input, output, encoding):	if encoding == 'base64':		import base64		return base64.decode(input, output)	if encoding == 'quoted-printable':		import quopri		return quopri.decode(input, output)	if encoding in ('uuencode', 'x-uuencode', 'uue', 'x-uue'):		import uu		return uu.decode(input, output)	if decodetab.has_key(encoding):		pipethrough(input, decodetab[encoding], output)	else:		raise ValueError, \		      'unknown Content-Transfer-Encoding: %s' % encodingdef encode(input, output, encoding):	if encoding == 'base64':		import base64		return base64.encode(input, output)	if encoding == 'quoted-printable':		import quopri		return quopri.encode(input, output, 0)	if encoding in ('uuencode', 'x-uuencode', 'uue', 'x-uue'):		import uu		return uu.encode(input, output)	if encodetab.has_key(encoding):		pipethrough(input, encodetab[encoding], output)	else:		raise ValueError, \		      'unknown Content-Transfer-Encoding: %s' % encoding# The following is no longer used for standard encodings# XXX This requires that uudecode and mmencode are in $PATHuudecode_pipe = '''(TEMP=/tmp/@uu.$$sed "s%^begin [0-7][0-7]* .*%begin 600 $TEMP%" | uudecodecat $TEMPrm $TEMP)'''decodetab = {	'uuencode':		uudecode_pipe,	'x-uuencode':		uudecode_pipe,	'uue':			uudecode_pipe,	'x-uue':		uudecode_pipe,	'quoted-printable':	'mmencode -u -q',	'base64':		'mmencode -u -b',}encodetab = {	'x-uuencode':		'uuencode tempfile',	'uuencode':		'uuencode tempfile',	'x-uue':		'uuencode tempfile',	'uue':			'uuencode tempfile',	'quoted-printable':	'mmencode -q',	'base64':		'mmencode -b',}def pipeto(input, command):	pipe = os.popen(command, 'w')	copyliteral(input, pipe)	pipe.close()def pipethrough(input, command, output):	tempname = tempfile.mktemp()	try:		temp = open(tempname, 'w')	except IOError:		print '*** Cannot create temp file', `tempname`		return	copyliteral(input, temp)	temp.close()	pipe = os.popen(command + ' <' + tempname, 'r')	copybinary(pipe, output)	pipe.close()	os.unlink(tempname)def copyliteral(input, output):	while 1:		line = input.readline()		if not line: break		output.write(line)def copybinary(input, output):	BUFSIZE = 8192	while 1:		line = input.read(BUFSIZE)		if not line: break		output.write(line)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -