def __init__(self, *args, **kwargs): self.username = None self.password = None self.authenticator = kwargs.pop('authenticator', None) self.authenticated = False self.authenticating = False BaseSMTPChannel.__init__(self, *args, **kwargs)
def push(self, msg): # catch "220 $FQDN $VERSION" from SMTPChannel.__init__() try: new_fqdn = MailSink.addr2fqdn[self._SMTPChannel__addr] if msg == '220 %s %s' % (self._SMTPChannel__fqdn, __version__): msg = '220 %s %s' % (new_fqdn, __version__) except KeyError: pass try: SMTPChannel.push(self, msg) except IndexError: # push sometimes fails with # # <type 'exceptions.IndexError'>:deque index out of range [/usr/lib/python2.7/asyncore.py|read|83] # [/usr/lib/python2.7/asyncore.py|handle_read_event|449] # [/usr/lib/python2.7/asynchat.py|handle_read|165] # [/usr/lib/python2.7/smtpd.py|found_terminator|163] # [/usr/lib/python2.7/smtpd.py|smtp_RCPT|251] # [/usr/lib/pymodules/python2.7/univention/testing/mail.py|push|74] # [/usr/lib/python2.7/smtpd.py|push|136] # [/usr/lib/python2.7/asynchat.py|push|193] # [/usr/lib/python2.7/asynchat.py|initiate_send|251] # # https://github.com/myano/jenni/issues/159 says "This is an inherent issue with multi-threading", # so just for testing, wait a moment and try angain time.sleep(3) SMTPChannel.push(self, msg)
def smtp_HELO(self, arg): # change FQDN try: self._SMTPChannel__fqdn = MailSink.addr2fqdn[self._SMTPChannel__addr] except KeyError: pass SMTPChannel.smtp_HELO(self, arg)
# start background process to run periodic jobs in active modules self.heartbeat = multiprocessing.Process(target=modules_heartbeat, args=[self.modules]) self.heartbeat.daemon = True self.heartbeat.start() try: while 1: while self.current_connections >= self.max_connections: time.sleep(0.5) pair = s.accept() log.info(_("Accepted connection")) if not pair == None: self.current_connections += 1 connection, address = pair channel = SMTPChannel(self, connection, address) asyncore.loop() except Exception, errmsg: traceback.print_exc() s.shutdown(1) s.close() # shut down hearbeat process self.heartbeat.terminate() def data_header(self, mailfrom, rcpttos): COMMASPACE = ', ' return "X-Kolab-From: " + mailfrom + "\r\n" + \ "X-Kolab-To: " + COMMASPACE.join(rcpttos) + "\r\n"
def collect_incoming_data(self, data): SMTPChannel.collect_incoming_data(self, data) self.datalen += len(data) self.datalen += 1
def smtp_DATA(self, arg): SMTPChannel.smtp_DATA(self, arg)
def smtp_RCPT(self, arg): SMTPChannel.smtp_RCPT(self, arg)
def smtp_MAIL(self, arg): SMTPChannel.smtp_MAIL(self, arg)
def __init__(self, server, conn, addr, smtpid): SMTPChannel.__init__(self, server, conn, addr) self.smtpid = smtpid self.datalen = 0
def __init__(self, server, conn, addr, fqdn=None): MailSink.addr2fqdn[addr] = fqdn SMTPChannel.__init__(self, server, conn, addr)