diff -r 8915ff3ac7fa Lib/smtpd.py --- a/Lib/smtpd.py Wed Aug 06 23:53:11 2014 +0200 +++ b/Lib/smtpd.py Wed Aug 06 23:55:44 2014 +0200 @@ -741,33 +741,46 @@ class PureProxy(SMTPServer): - def __init__(self, *args, **kwargs): - if 'enable_SMTPUTF8' in kwargs and kwargs['enable_SMTPUTF8']: - raise ValueError("PureProxy does not support SMTPUTF8.") - super(PureProxy, self).__init__(*args, **kwargs) + def process_message(self, peer, mailfrom, rcpttos, data): + data = self._insert_x_peer_header(peer, data) + refused = self._deliver(mailfrom, rcpttos, data) + # TBD: what to do with refused addresses? + print('we got some refusals:', refused, file=DEBUGSTREAM) - def process_message(self, peer, mailfrom, rcpttos, data): - lines = data.split('\n') + def process_smtputf8_message(self, peer, mailfrom, rcpttos, data): + data = self._insert_x_peer_header(peer, data) + refused = self._deliver( + mailfrom, + rcpttos, + data, + mail_options=['BODY=8BITMIME', 'SMTPUTF8'] + ) + print('we got some refusals:', refused, file=DEBUGSTREAM) + + def _insert_x_peer_header(self, peer, data): + x_peer_header = 'X-Peer: %s' % peer[0] + newline = NEWLINE + if isinstance(data, bytes): + x_peer_header = x_peer_header.encode() + newline = NEWLINE.encode() + lines = data.split(newline) # Look for the last header i = 0 for line in lines: if not line: break i += 1 - lines.insert(i, 'X-Peer: %s' % peer[0]) - data = NEWLINE.join(lines) - refused = self._deliver(mailfrom, rcpttos, data) - # TBD: what to do with refused addresses? - print('we got some refusals:', refused, file=DEBUGSTREAM) + lines.insert(i, x_peer_header) + return newline.join(lines) - def _deliver(self, mailfrom, rcpttos, data): + def _deliver(self, mailfrom, rcpttos, data, mail_options=[]): import smtplib refused = {} try: s = smtplib.SMTP() s.connect(self._remoteaddr[0], self._remoteaddr[1]) try: - refused = s.sendmail(mailfrom, rcpttos, data) + refused = s.sendmail(mailfrom, rcpttos, data, mail_options) finally: s.quit() except smtplib.SMTPRecipientsRefused as e: