Mime tag not flexible enough
I needed the ability to be able to conditionally include attachments to a mail message. Unfortunately the mime tag syntax made this impossible. I've updated it by splitting the tag into two tags. I've submitted it to the bug collector. Anyone have any constructive criticism? Here is an example of my syntax. <dtml-sendmail mailhost=MailHost> To: blah@lucent.com From: <dtml-var AUTHENTICATED_USER>@lucent.com Subject: Bug submission: <dtml-var description> <dtml-mime> <dtml-boundary type="'text/plain'" encode="'7bit'"> <dtml-var mailContent> </dtml-boundary> <dtml-with event_log><dtml-if filename><dtml-boundary name=filename description="'Event Log'"><dtml-var read></dtml-boundary></dtml-if></dtml-with> <dtml-with comm_mon><dtml-if filename><dtml-boundary name=filename description="'Communication Monitor'"><dtml-var read></dtml-boundary></dtml-if></dtml-with> <dtml-with archive><dtml-if filename><dtml-boundary name=filename description="'Archive'"><dtml-var read></dtml-boundary></dtml-if></dtml-with> </dtml-mime> </dtml-sendmail> Here is the code from my revise MIMETag.py file from DocumentTemplate.DT_Util import * from DocumentTemplate.DT_String import String from DocumentTemplate.DT_Let import Let, parse_let_params from MimeWriter import MimeWriter from cStringIO import StringIO import string, mimetools MIMEError = "MIME Tag Error" class MIMETag: ''' ''' name='mime' blockContinuations=() encode=None def __init__(self, blocks): tname, args, section = blocks[0] args = parse_params(args, name=None) has_key=args.has_key self.section = section.blocks def render(self, md): contents=[] mw = MimeWriter(StringIO()) outer = mw.startmultipartbody('mixed') d={}; md._push(d) try: d['mime-writer']= mw outer.write(render_blocks(self.section, md)) mw.lastpart() outer.seek(0) return outer.read() finally: md._pop(1) __call__=render class BOUNDARYTag: ''' ''' name='boundary' blockContinuations=() encode=None def __init__(self, blocks): tname, args, section = blocks[0] self.__name__ = args self.section = section.blocks self.args = args = parse_let_params(args) for i in range(len(args)): name,expr = args[i] if expr[:1]=='"' and expr[-1:]=='"' and len(expr) > 1: # expr shorthand expr=expr[1:-1] try: args[i] = name, (1,Eval(expr, expr_globals).eval) except SyntaxError, v: m,(huh,l,c,src) = v raise ParseError, ( '<strong>Expression (Python) Syntax error</strong>:' '\n<pre>\n%s\n</pre>\n' % v[0], 'boundary') def render(self, md): contents=[] try: mw = md['mime-writer'].nextpart() except: mw = MimeWrite() args = {} # evaluate any expressions for name,expr in self.args: try: isExpr, expr = expr except: isExpr = 0 if not isExpr: args[name]=md[expr] else: args[name]=expr(md) has_key=args.has_key if has_key('type'): type = args['type'] else: type = 'application/octet-stream' if has_key('disposition'): disposition = args['disposition'] else: disposition = '' if has_key('encode'): encode = args['encode'] else: encode = 'base64' if has_key('name'): name = args['name'] else: name = '' if encode not in \ ('base64', 'quoted-printable', 'uuencode', 'x-uuencode', 'uue', 'x-uue', '7bit'): raise MIMEError, ( 'An unsupported encoding was specified in tag') b = self.section if disposition: mw.addheader('Content-Disposition', disposition) if args.has_key('description'): mw.addheader('Content-Description', args['description']) mw.addheader('Content-Transfer-Encoding', encode) if name: plist = [('name', name)] else: plist = [] mfile = mw.startbody(type, plist, 1) output = StringIO() if encode == '7bit': mfile.write(render_blocks(b, md)) else: mimetools.encode(StringIO(render_blocks(b, md)), output, encode) output.seek(0) mfile.write(output.read()) return mfile.read() __call__=render String.commands['mime'] = MIMETag String.commands['boundary'] = BOUNDARYTag
participants (1)
-
Jay, Dylan