summaryrefslogtreecommitdiffstats
path: root/Lib/email
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/email')
-rw-r--r--Lib/email/Generator.py86
1 files changed, 29 insertions, 57 deletions
diff --git a/Lib/email/Generator.py b/Lib/email/Generator.py
index 56d44ea5..7fe634f 100644
--- a/Lib/email/Generator.py
+++ b/Lib/email/Generator.py
@@ -1,5 +1,5 @@
-# Copyright (C) 2001,2002 Python Software Foundation
-# Author: barry@zope.com (Barry Warsaw)
+# Copyright (C) 2001-2004 Python Software Foundation
+# Author: barry@python.org (Barry Warsaw)
"""Classes to generate plain text from a message object tree.
"""
@@ -7,39 +7,18 @@
import re
import sys
import time
-import locale
import random
-
-from types import ListType, StringType
from cStringIO import StringIO
from email.Header import Header
-from email.Parser import NLCRE
-
-try:
- from email._compat22 import _isstring
-except SyntaxError:
- from email._compat21 import _isstring
-
-try:
- True, False
-except NameError:
- True = 1
- False = 0
-
-EMPTYSTRING = ''
-SEMISPACE = '; '
-BAR = '|'
+
UNDERSCORE = '_'
NL = '\n'
-NLTAB = '\n\t'
-SEMINLTAB = ';\n\t'
-SPACE8 = ' ' * 8
fcre = re.compile(r'^From ', re.MULTILINE)
def _is8bitstring(s):
- if isinstance(s, StringType):
+ if isinstance(s, str):
try:
unicode(s, 'us-ascii')
except UnicodeError:
@@ -77,7 +56,7 @@ class Generator:
"""
self._fp = outfp
self._mangle_from_ = mangle_from_
- self.__maxheaderlen = maxheaderlen
+ self._maxheaderlen = maxheaderlen
def write(self, s):
# Just delegate to the file object
@@ -106,7 +85,7 @@ class Generator:
def clone(self, fp):
"""Clone this generator with the exact same options."""
- return self.__class__(fp, self._mangle_from_, self.__maxheaderlen)
+ return self.__class__(fp, self._mangle_from_, self._maxheaderlen)
#
# Protected interface - undocumented ;/
@@ -162,7 +141,7 @@ class Generator:
def _write_headers(self, msg):
for h, v in msg.items():
print >> self._fp, '%s:' % h,
- if self.__maxheaderlen == 0:
+ if self._maxheaderlen == 0:
# Explicit no-wrapping
print >> self._fp, v
elif isinstance(v, Header):
@@ -179,7 +158,7 @@ class Generator:
else:
# Header's got lots of smarts, so use it.
print >> self._fp, Header(
- v, maxlinelen=self.__maxheaderlen,
+ v, maxlinelen=self._maxheaderlen,
header_name=h, continuation_ws='\t').encode()
# A blank line always separates headers from body
print >> self._fp
@@ -195,7 +174,7 @@ class Generator:
cset = msg.get_charset()
if cset is not None:
payload = cset.body_encode(payload)
- if not _isstring(payload):
+ if not isinstance(payload, basestring):
raise TypeError, 'string payload expected: %s' % type(payload)
if self._mangle_from_:
payload = fcre.sub('>From ', payload)
@@ -211,17 +190,12 @@ class Generator:
msgtexts = []
subparts = msg.get_payload()
if subparts is None:
- # Nothing has ever been attached
- boundary = msg.get_boundary(failobj=_make_boundary())
- print >> self._fp, '--' + boundary
- print >> self._fp, '\n'
- print >> self._fp, '--' + boundary + '--'
- return
- elif _isstring(subparts):
+ subparts = []
+ elif isinstance(subparts, basestring):
# e.g. a non-strict parse of a message with no starting boundary.
self._fp.write(subparts)
return
- elif not isinstance(subparts, ListType):
+ elif not isinstance(subparts, list):
# Scalar payload
subparts = [subparts]
for part in subparts:
@@ -242,28 +216,26 @@ class Generator:
# suite.
if msg.get_boundary() <> boundary:
msg.set_boundary(boundary)
- # Write out any preamble
+ # If there's a preamble, write it out, with a trailing CRLF
if msg.preamble is not None:
- self._fp.write(msg.preamble)
- # If preamble is the empty string, the length of the split will be
- # 1, but the last element will be the empty string. If it's
- # anything else but does not end in a line separator, the length
- # will be > 1 and not end in an empty string. We need to
- # guarantee a newline after the preamble, but don't add too many.
- plines = NLCRE.split(msg.preamble)
- if plines <> [''] and plines[-1] <> '':
- self._fp.write('\n')
- # First boundary is a bit different; it doesn't have a leading extra
- # newline.
+ print >> self._fp, msg.preamble
+ # dash-boundary transport-padding CRLF
print >> self._fp, '--' + boundary
- # Join and write the individual parts
- joiner = '\n--' + boundary + '\n'
- self._fp.write(joiner.join(msgtexts))
- print >> self._fp, '\n--' + boundary + '--',
- # Write out any epilogue
+ # body-part
+ if msgtexts:
+ self._fp.write(msgtexts.pop(0))
+ # *encapsulation
+ # --> delimiter transport-padding
+ # --> CRLF body-part
+ for body_part in msgtexts:
+ # delimiter transport-padding CRLF
+ print >> self._fp, '\n--' + boundary
+ # body-part
+ self._fp.write(body_part)
+ # close-delimiter transport-padding
+ self._fp.write('\n--' + boundary + '--')
if msg.epilogue is not None:
- if not msg.epilogue.startswith('\n'):
- print >> self._fp
+ print >> self._fp
self._fp.write(msg.epilogue)
def _handle_message_delivery_status(self, msg):