diff -r fd53f083768c Lib/smtpd.py --- a/Lib/smtpd.py Sat Mar 08 21:40:29 2014 -0500 +++ b/Lib/smtpd.py Wed Apr 02 22:24:56 2014 +0200 @@ -122,7 +122,7 @@ max_command_size_limit = max(command_size_limits.values()) def __init__(self, server, conn, addr, data_size_limit=DATA_SIZE_DEFAULT, - map=None): + map=None, decode_data): asynchat.async_chat.__init__(self, conn, map=map) self.smtp_server = server self.conn = conn @@ -136,6 +136,7 @@ self.received_data = '' self.fqdn = socket.getfqdn() self.num_bytes = 0 + self.decode_data = True try: self.peer = conn.getpeername() except OSError as err: @@ -287,7 +288,10 @@ return elif limit: self.num_bytes += len(data) - self.received_lines.append(str(data, "utf-8")) + if self.decode_data: + self.received_lines.append(str(data, "utf-8")) + else: + self.received_lines.append(data) # Implementation of base class abstract method def found_terminator(self): @@ -319,6 +323,8 @@ method(arg) return else: + if not self.decode_data: + self.received_lines.append(str(line,"utf-8")) if self.smtp_state != self.DATA: self.push('451 Internal confusion') self.num_bytes = 0