def flatten(self, delivered_to, received, mangle_from=False, include_from=False): '''Return a string with native EOL convention. The email module apparently doesn't always use native EOL, so we force it by writing out what we need, letting the generator write out the message, splitting it into lines, and joining them with the platform EOL. Note on mangle_from: the Python Generator class apparently only quotes "From ", not ">From " (i.e. it uses mboxo format instead of mboxrd). So we don't use its mangling, and do it by hand instead. ''' if include_from: # Mbox-style From line, not rfc822 From: header field. fromline = 'From %s %s' % (mbox_from_escape(self.sender), time.asctime()) + os.linesep else: fromline = '' # Write the Return-Path: header rpline = format_header('Return-Path', '<%s>' % self.sender) # Remove previous Return-Path: header fields. del self.__msg['Return-Path'] if delivered_to: dtline = format_header('Delivered-To', self.recipient or 'unknown') else: dtline = '' if received: content = 'from %s by %s with %s' % ( self.received_from, self.received_by, self.received_with ) if self.recipient is not None: content += ' for <%s>' % self.recipient content += '; ' + time.strftime('%d %b %Y %H:%M:%S -0000', time.gmtime()) receivedline = format_header('Received', content) else: receivedline = '' # From_ handled above, always tell the generator not to include it try: tmpf = StringIO() gen = Generator(tmpf, False, 0) gen.flatten(self.__msg, False) strmsg = tmpf.getvalue() if mangle_from: # do mboxrd-style "From " line quoting strmsg = RE_FROMLINE.sub(r'>\1', strmsg) return (fromline + rpline + dtline + receivedline + os.linesep.join(strmsg.splitlines() + [''])) except TypeError as o: # email module chokes on some badly-misformatted messages, even # late during flatten(). Hope this is fixed in Python 2.4. if self.__raw is None: # Argh -- a filter took a correctly-formatted message # and returned a badly-misformatted one? raise getmailDeliveryError('failed to parse retrieved message ' 'and could not recover (%s)' % o) self.__msg = corrupt_message(o, fromstring=self.__raw) return self.flatten(delivered_to, received, mangle_from, include_from)
def flatten(self, delivered_to, received, mangle_from=False, include_from=False): '''Return a string with native EOL convention. The email module apparently doesn't always use native EOL, so we force it by writing out what we need, letting the generator write out the message, splitting it into lines, and joining them with the platform EOL. Note on mangle_from: the Python email.Generator class apparently only quotes "From ", not ">From " (i.e. it uses mboxo format instead of mboxrd). So we don't use its mangling, and do it by hand instead. ''' if include_from: # Mbox-style From line, not rfc822 From: header field. fromline = 'From %s %s' % (mbox_from_escape(self.sender), time.asctime()) + os.linesep else: fromline = '' # Write the Return-Path: header rpline = format_header('Return-Path', '<%s>' % self.sender) # Remove previous Return-Path: header fields. del self.__msg['Return-Path'] if delivered_to: dtline = format_header('Delivered-To', self.recipient or 'unknown') else: dtline = '' if received: content = 'from %s by %s with %s' % ( self.received_from, self.received_by, self.received_with ) if self.recipient is not None: content += ' for <%s>' % self.recipient content += '; ' + time.strftime('%d %b %Y %H:%M:%S -0000', time.gmtime()) receivedline = format_header('Received', content) else: receivedline = '' # From_ handled above, always tell the generator not to include it try: tmpf = cStringIO.StringIO() gen = Generator(tmpf, False, 0) gen.flatten(self.__msg, False) strmsg = tmpf.getvalue() if mangle_from: # do mboxrd-style "From " line quoting strmsg = RE_FROMLINE.sub(r'>\1', strmsg) return (fromline + rpline + dtline + receivedline + os.linesep.join(strmsg.splitlines() + [''])) except TypeError, o: # email module chokes on some badly-misformatted messages, even # late during flatten(). Hope this is fixed in Python 2.4. if self.__raw is None: # Argh -- a filter took a correctly-formatted message # and returned a badly-misformatted one? raise getmailDeliveryError('failed to parse retrieved message ' 'and could not recover (%s)' % o) self.__msg = corrupt_message(o, fromstring=self.__raw) return self.flatten(delivered_to, received, mangle_from, include_from)
def flatten(self, delivered_to, received, mangle_from=False, include_from=False): '''Return a string with native EOL convention. The email module apparently doesn't always use native EOL, so we force it by writing out what we need, letting the generator write out the message, splitting it into lines, and joining them with the platform EOL. ''' f = cStringIO.StringIO() if include_from: # This needs to be written out first, so we can't rely on the # generator f.write('From %s %s' % (mbox_from_escape(self.sender), time.asctime()) + os.linesep) # Write the Return-Path: header f.write(format_header('Return-Path', '<%s>' % self.sender)) # Remove previous Return-Path: header fields. del self.__msg['Return-Path'] if delivered_to: f.write(format_header('Delivered-To', self.recipient or 'unknown')) if received: content = 'from %s by %s with %s' % ( self.received_from, self.received_by, self.received_with) if self.recipient is not None: content += ' for <%s>' % self.recipient content += '; ' + time.strftime('%d %b %Y %H:%M:%S -0000', time.gmtime()) f.write(format_header('Received', content)) gen = Generator(f, mangle_from, 0) # From_ handled above, always tell the generator not to include it try: gen.flatten(self.__msg, False) f.seek(0) return os.linesep.join(f.read().splitlines() + ['']) except TypeError, o: # email module chokes on some badly-misformatted messages, even # late during flatten(). Hope this is fixed in Python 2.4. if self.__raw == None: # Argh -- a filter took a correctly-formatted message # and returned a badly-misformatted one? raise getmailDeliveryError('failed to parse retrieved message ' 'and could not recover (%s)' % o) self.__msg = corrupt_message(o, fromstring=self.__raw) return self.flatten(delivered_to, received, mangle_from, include_from)
def flatten(self, delivered_to, received, mangle_from=False, include_from=False): '''Return a string with native EOL convention. The email module apparently doesn't always use native EOL, so we force it by writing out what we need, letting the generator write out the message, splitting it into lines, and joining them with the platform EOL. ''' f = cStringIO.StringIO() if include_from: # This needs to be written out first, so we can't rely on the # generator f.write('From %s %s' % (mbox_from_escape(self.sender), time.asctime()) + os.linesep) # Write the Return-Path: header f.write(format_header('Return-Path', '<%s>' % self.sender)) # Remove previous Return-Path: header fields. del self.__msg['Return-Path'] if delivered_to: f.write(format_header('Delivered-To', self.recipient or 'unknown')) if received: content = 'from %s by %s with %s' % ( self.received_from, self.received_by, self.received_with ) if self.recipient is not None: content += ' for <%s>' % self.recipient content += '; ' + time.strftime('%d %b %Y %H:%M:%S -0000', time.gmtime()) f.write(format_header('Received', content)) gen = Generator(f, mangle_from, 0) # From_ handled above, always tell the generator not to include it try: gen.flatten(self.__msg, False) f.seek(0) return os.linesep.join(f.read().splitlines() + ['']) except TypeError, o: # email module chokes on some badly-misformatted messages, even # late during flatten(). Hope this is fixed in Python 2.4. if self.__raw is None: # Argh -- a filter took a correctly-formatted message # and returned a badly-misformatted one? raise getmailDeliveryError('failed to parse retrieved message ' 'and could not recover (%s)' % o) self.__msg = corrupt_message(o, fromstring=self.__raw) return self.flatten(delivered_to, received, mangle_from, include_from)
def flatten(self, delivered_to, received, mangle_from=False, include_from=False): '''Return a string with native EOL convention. The email module apparently doesn't always use native EOL, so we force it by writing out what we need, letting the generator write out the message, splitting it into lines, and joining them with the platform EOL. Note on mangle_from: the Python Generator class apparently only quotes "From ", not ">From " (i.e. it uses mboxo format instead of mboxrd). So we don't use its mangling, and do it by hand instead. ''' if include_from: # Mbox-style From line, not rfc822 From: header field. fromline = 'From %s %s' % (mbox_from_escape( self.sender), time.asctime()) + os.linesep else: fromline = '' # Write the Return-Path: header rpline = format_header('Return-Path', '<%s>' % self.sender) # Remove previous Return-Path: header fields. del self.__msg['Return-Path'] if delivered_to: dtline = format_header('Delivered-To', self.recipient or 'unknown') else: dtline = '' if received: rcvd = 'from %s by %s with %s' % ( self.received_from, self.received_by, self.received_with) if self.recipient is not None: rcvd += ' for <%s>' % self.recipient rcvd += '; ' + time.strftime('%d %b %Y %H:%M:%S -0000', time.gmtime()) rcvline = format_header('Received', rcvd) else: rcvline = '' # From_ handled above, always tell the generator not to include it try: try: strmsg = self.__msg.as_bytes(policy=self.__msg.policy.clone( linesep=os.linesep)) except AttributeError: strmsg = self.__msg.as_string() strmsg = _NL.join(strmsg.splitlines() + [b'']) except UnicodeEncodeError: # The sender did not properly encoding, e.g. via # "über".encode('latin-1').decode('utf-8',errors="replace") strm = self.__msg.as_string() # � accumulate, and since proper decoding is not possible any more: strmsg = re.sub('�+', '�', strm).encode() if mangle_from: # do mboxrd-style "From " line quoting (add one '>') RE_FROMLINE = re.compile(b'^(>*From )', re.MULTILINE) strmsg = RE_FROMLINE.sub(b'>\\1', strmsg) return ((fromline + rpline + dtline + rcvline).encode() + strmsg) except TypeError as o: # email module chokes on some badly-misformatted messages, even # late during flatten(). Hope this is fixed in Python 2.4. if self.__raw is None: # Argh -- a filter took a correctly-formatted message # and returned a badly-misformatted one? raise getmailDeliveryError('failed to parse retrieved message ' 'and could not recover (%s)' % o) self.__msg = corrupt_message(o, fromstring=self.__raw) return self.flatten(delivered_to, received, mangle_from, include_from)