summaryrefslogtreecommitdiffstats
path: root/Lib/email
diff options
context:
space:
mode:
authorR David Murray <rdmurray@bitdance.com>2013-03-07 22:31:21 (GMT)
committerR David Murray <rdmurray@bitdance.com>2013-03-07 22:31:21 (GMT)
commit2e78cd9b5ed8a27a38920879b6d3e34d06baa8a3 (patch)
tree167476f91ebe19f06fc72c3818900e16f523b87c /Lib/email
parent03e667d15ac2ec7409e94e151cc04b2d9dd2005d (diff)
parentaddb0be63e82fd99d931c227b07a8f515ad3d181 (diff)
downloadcpython-2e78cd9b5ed8a27a38920879b6d3e34d06baa8a3.zip
cpython-2e78cd9b5ed8a27a38920879b6d3e34d06baa8a3.tar.gz
cpython-2e78cd9b5ed8a27a38920879b6d3e34d06baa8a3.tar.bz2
Merge: #14645: Generator now emits correct linesep for all parts.
Previously the parts of the message retained whatever linesep they had on read, which means if the messages weren't read in univeral newline mode, the line endings could well be inconsistent. In general sending it via smtplib would result in them getting fixed, but it is better to generate them correctly to begin with. Also, the new send_message method of smtplib does not do the fixup, so that method is producing rfc-invalid output without this fix.
Diffstat (limited to 'Lib/email')
-rw-r--r--Lib/email/generator.py22
1 files changed, 18 insertions, 4 deletions
diff --git a/Lib/email/generator.py b/Lib/email/generator.py
index de9da39..27dd0db 100644
--- a/Lib/email/generator.py
+++ b/Lib/email/generator.py
@@ -146,6 +146,19 @@ class Generator:
# BytesGenerator overrides this to encode strings to bytes.
return s
+ def _write_lines(self, lines):
+ # We have to transform the line endings.
+ if not lines:
+ return
+ lines = lines.splitlines(True)
+ for line in lines[:-1]:
+ self.write(line.rstrip('\r\n'))
+ self.write(self._NL)
+ laststripped = lines[-1].rstrip('\r\n')
+ self.write(laststripped)
+ if len(lines[-1])!=len(laststripped):
+ self.write(self._NL)
+
def _write(self, msg):
# We can't write the headers yet because of the following scenario:
# say a multipart message includes the boundary string somewhere in
@@ -217,7 +230,7 @@ class Generator:
payload = msg.get_payload()
if self._mangle_from_:
payload = fcre.sub('>From ', payload)
- self.write(payload)
+ self._write_lines(payload)
# Default body handler
_writeBody = _handle_text
@@ -256,7 +269,8 @@ class Generator:
preamble = fcre.sub('>From ', msg.preamble)
else:
preamble = msg.preamble
- self.write(preamble + self._NL)
+ self._write_lines(preamble)
+ self.write(self._NL)
# dash-boundary transport-padding CRLF
self.write('--' + boundary + self._NL)
# body-part
@@ -278,7 +292,7 @@ class Generator:
epilogue = fcre.sub('>From ', msg.epilogue)
else:
epilogue = msg.epilogue
- self.write(epilogue)
+ self._write_lines(epilogue)
def _handle_multipart_signed(self, msg):
# The contents of signed parts has to stay unmodified in order to keep
@@ -402,7 +416,7 @@ class BytesGenerator(Generator):
if _has_surrogates(msg._payload) and not self.policy.cte_type=='7bit':
if self._mangle_from_:
msg._payload = fcre.sub(">From ", msg._payload)
- self.write(msg._payload)
+ self._write_lines(msg._payload)
else:
super(BytesGenerator,self)._handle_text(msg)