Commit f9416b4b authored by Hanno Schlichting's avatar Hanno Schlichting

Factored out the `Products.MIMETools` package into its own distribution.

parent f765c899
......@@ -22,6 +22,8 @@ Bugs Fixed
Restructuring
+++++++++++++
- Factored out the `Products.MIMETools` package into its own distribution.
- Factored out the `Products.ZSQLMethods` into its own distribution. The
distribution also includes the `Shared.DC.ZRDB` code. The Zope2 distribution
no longer includes the code automatically. Please depend on the new
......
......@@ -47,6 +47,7 @@ setup(name='Zope2',
'Missing',
'MultiMapping',
'Persistence',
'Products.MIMETools',
'Products.ZCTextIndex',
'Record',
'RestrictedPython',
......
......@@ -9,6 +9,7 @@ Missing = svn svn://svn.zope.org/repos/main/Missing/trunk
MultiMapping = svn svn://svn.zope.org/repos/main/MultiMapping/trunk
nt_svcutils = svn svn://svn.zope.org/repos/main/nt_svcutils/trunk
Persistence = svn svn://svn.zope.org/repos/main/Persistence/trunk
Products.MIMETools = svn svn://svn.zope.org/repos/main/Products.MIMETools/trunk
Products.ZCTextIndex = svn svn://svn.zope.org/repos/main/Products.ZCTextIndex/trunk
Record = svn svn://svn.zope.org/repos/main/Record/trunk
tempstorage = svn svn://svn.zope.org/repos/main/tempstorage/trunk
......
##############################################################################
#
# Copyright (c) 2002 Zope Foundation and Contributors.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE
#
##############################################################################
__rcs_id__='$Id$'
__version__='$Revision: 1.12 $'[11:-2]
from DocumentTemplate.DT_Util import *
from DocumentTemplate.DT_String import String
from cStringIO import StringIO
import mimetools
MIMEError = "MIME Tag Error"
class MIMETag:
'''
'''
name='mime'
blockContinuations=('boundary',)
encode=None
def __init__(self, blocks):
self.sections = []
for tname, args, section in blocks:
if tname == 'mime':
args = parse_params( args
, type=None, type_expr=None
, disposition=None, disposition_expr=None
, encode=None, encode_expr=None
, name=None, name_expr=None
, filename=None, filename_expr=None
, cid=None, cid_expr=None
, charset=None, charset_expr=None
, skip_expr=None
, multipart=None
)
self.multipart = args.get('multipart', 'mixed')
else:
args = parse_params( args
, type=None, type_expr=None
, disposition=None, disposition_expr=None
, encode=None, encode_expr=None
, name=None, name_expr=None
, filename=None, filename_expr=None
, cid=None, cid_expr=None
, charset=None, charset_expr=None
, skip_expr=None
)
has_key=args.has_key
if has_key('type'):
type = args['type']
else:
type = 'application/octet-stream'
if has_key('type_expr'):
if has_key('type'):
raise ParseError, _tm('type and type_expr given', 'mime')
args['type_expr']=Eval(args['type_expr'])
elif not has_key('type'):
args['type']='application/octet-stream'
if has_key('disposition_expr'):
if has_key('disposition'):
raise ParseError, _tm('disposition and disposition_expr given', 'mime')
args['disposition_expr']=Eval(args['disposition_expr'])
elif not has_key('disposition'):
args['disposition']=''
if has_key('encode_expr'):
if has_key('encode'):
raise ParseError, _tm('encode and encode_expr given', 'mime')
args['encode_expr']=Eval(args['encode_expr'])
elif not has_key('encode'):
args['encode']='base64'
if has_key('name_expr'):
if has_key('name'):
raise ParseError, _tm('name and name_expr given', 'mime')
args['name_expr']=Eval(args['name_expr'])
elif not has_key('name'):
args['name']=''
if has_key('filename_expr'):
if has_key('filename'):
raise ParseError, _tm('filename and filename_expr given', 'mime')
args['filename_expr']=Eval(args['filename_expr'])
elif not has_key('filename'):
args['filename']=''
if has_key('cid_expr'):
if has_key('cid'):
raise ParseError, _tm('cid and cid_expr given', 'mime')
args['cid_expr']=Eval(args['cid_expr'])
elif not has_key('cid'):
args['cid']=''
if has_key('charset_expr'):
if has_key('charset'):
raise ParseError, _tm('charset and charset_expr given', 'mime')
args['charset_expr']=Eval(args['charset_expr'])
elif not has_key('charset'):
args['charset']=''
if has_key('skip_expr'):
args['skip_expr']=Eval(args['skip_expr'])
if args['encode'] not in \
('base64', 'quoted-printable', 'uuencode', 'x-uuencode',
'uue', 'x-uue', '7bit'):
raise MIMEError, (
'An unsupported encoding was specified in tag')
self.sections.append((args, section.blocks))
def render(self, md):
from MimeWriter import MimeWriter # deprecated since Python 2.3!
contents=[]
IO = StringIO()
IO.write("Mime-Version: 1.0\n")
mw = MimeWriter(IO)
outer = mw.startmultipartbody(self.multipart)
for x in self.sections:
a, b = x
has_key=a.has_key
if has_key('skip_expr') and a['skip_expr'].eval(md):
continue
inner = mw.nextpart()
if has_key('type_expr'): t=a['type_expr'].eval(md)
else: t=a['type']
if has_key('disposition_expr'): d=a['disposition_expr'].eval(md)
else: d=a['disposition']
if has_key('encode_expr'): e=a['encode_expr'].eval(md)
else: e=a['encode']
if has_key('name_expr'): n=a['name_expr'].eval(md)
else: n=a['name']
if has_key('filename_expr'): f=a['filename_expr'].eval(md)
else: f=a['filename']
if has_key('cid_expr'): cid=a['cid_expr'].eval(md)
else: cid=a['cid']
if has_key('charset_expr'): charset=a['charset_expr'].eval(md)
else: charset=a['charset']
if d:
if f:
inner.addheader('Content-Disposition', '%s;\n filename="%s"' % (d, f))
else:
inner.addheader('Content-Disposition', d)
inner.addheader('Content-Transfer-Encoding', e)
if cid:
inner.addheader('Content-ID', '<%s>' % cid)
if n:
plist = [('name', n)]
else:
plist = []
if t.startswith('text/'):
plist.append(('charset', charset or 'us-ascii'))
innerfile = inner.startbody(t, plist, 1)
output = StringIO()
if e == '7bit':
innerfile.write(render_blocks(b, md))
else:
mimetools.encode(StringIO(render_blocks(b, md)),
output, e)
output.seek(0)
innerfile.write(output.read())
# XXX what if self.sections is empty ??? does it matter that mw.lastpart() is called
# right after mw.startmultipartbody() ?
if x is self.sections[-1]:
mw.lastpart()
outer.seek(0)
return outer.read()
__call__=render
String.commands['mime'] = MIMETag
The MIMETools Product
The MIMETools product is alpha quality software. It may not work as
documented or at all. If you encounter bugs in MIMETools, please
report your problem to support@digicool.com or discuss it on the Zope
mailing list, zope@zope.org.
Currently, the MIMETools product's only function is to provide the
<!--#mime--> DTML tag.
The <!--#mime--> tag is used to construct MIME containers. The
syntax of the <!--#mime--> tag is:
<!--#mime [type=x, disposition=y, encode=z]-->
Contents of first part
<!--#boundary [type=x, disposition=y, encode=z]-->
Contents of second part
<!--#boundary [type=x, disposition=y, encode=z]-->
Contents of nth part
<!--#/mime-->
The area of data between tags, called a block, is encoded into
whatever is specified with the 'encode' tag attribute for that block.
If no encoding is specified, 'base64' is defaulted. Valid encoding
options include 'base64', 'quoted-printable', 'uuencode',
'x-uuencode', 'uue' and 'x-uue'. If the 'encode' attribute is set to
'7bit' no encoding is done on the block and the data is assumed to be
in a valid MIME format.
If the 'disposition' attribute is not specified for a certain block,
then the 'Content-Disposition:' MIME header is not included in that
block's MIME part.
The entire MIME container, from the opening mime tag to the closing,
has it's 'Content-Type:' MIME header set to 'multipart/mixed'.
For example, the following DTML:
<!--#mime encode=7bit type=text/plain-->
This is the first part.
<!--#boundary encode=base64 type=text/plain-->
This is the second.
<!--#/mime-->
Is rendered to the following text:
Content-Type: multipart/mixed;
boundary="216.164.72.30.501.1550.923070182.795.22531"
--216.164.72.30.501.1550.923070182.795.22531
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
This is the first part.
--216.164.72.30.501.1550.923070182.795.22531
Content-Type: text/plain
Content-Transfer-Encoding: base64
VGhpcyBpcyB0aGUgc2Vjb25kLgo=
--216.164.72.30.501.1550.923070182.795.22531--
The #mime tag is particulary handy in conjunction with the #sendmail
tag. This allows Zope to send attachments along with email. Here is
an example:
Create a DTML method called 'input' with the following code:
<!--#var standard_html_header-->
<form method=post action="send" ENCTYPE="multipart/form-data">
<input type=file name="afile"><br>
Send to:<input type=textbox name="who"><br>
<input type=submit value="Send">
</form>
<!--#var standard_html_footer-->
Create another DTML Method called 'send' with the following code:
<!--#var standard_html_header-->
<!--#sendmail smtphost=localhost -->
From: michel@digicool.com
To: <!--#var who-->
<!--#mime type=text/plain encode=7bit-->
Hi <!--#var who-->, someone sent you this attachment.
<!--#boundary type=application/octet-stream disposition=attachment
encode=base64--><!--#var "afile.read()"--><!--#/mime-->
<!--#/sendmail-->
Mail with attachment was sent.
<!--#var standard_html_footer-->
Notice that there is no blank line between the 'To:' header and the
starting #mime tag. If a blank line is inserted between them then
the message will not be interpreted as multipart by the recieving mailreader.
Also notice that there is no newline between the #boundary tag and
the #var tag, or the end of the #var tag and the closing #mime tag.
This is important, if you break the tags up with newlines then they
will be encoded and included in the MIME part, which is probably not
what you're after.
As per the MIME spec, #mime tags may be nested within #mime tags arbitrarily.
##############################################################################
#
# Copyright (c) 2002 Zope Foundation and Contributors.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE
#
##############################################################################
__doc__='''MIMETools Product Initialization
$Id$'''
__version__='$Revision: 1.3 $'[11:-2]
import MIMETag
......@@ -15,6 +15,7 @@ Missing = 2.13.1
MultiMapping = 2.13.0
nt-svcutils = 2.13.0
Persistence = 2.13.2
Products.MIMETools = 2.13.0
Products.ZCTextIndex = 2.13.0
Record = 2.13.0
tempstorage = 2.11.3
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment