¿Cómo manejar asyncore dentro de una clase en python, sin bloquear nada?

Necesito crear una clase que pueda recibir y almacenar mensajes SMTP, es decir, correos electrónicos. Para hacerlo, estoy usandoasyncore de acuerdo a un ejemplo publicadoaquí. Sin embargo,asyncore.loop() está bloqueando, así que no puedo hacer nada más en el código.

Así que pensé en usar hilos. Aquí hay un código de ejemplo que muestra lo que tengo en mente:

class MyServer(smtpd.SMTPServer):
    # derive from the python server class

    def process_message(..):
        # overwrite a smtpd.SMTPServer method to be able to handle the received messages
        ...
        self.list_emails.append(this_email)

    def get_number_received_emails(self):
        """Return the current number of stored emails"""
        return len(self.list_emails)


    def start_receiving(self):
        """Start the actual server to listen on port 25"""

        self.thread =   threading.Thread(target=asyncore.loop)
        self.thread.start()     

    def stop(self):
        """Stop listening now to port 25"""
        # close the SMTPserver from itself
        self.close()
        self.thread.join()

Espero que te hagas una idea. La claseMyServer debe poder iniciar y dejar de escuchar el puerto 25 de forma no bloqueante, poder consultar los mensajes mientras escucha (o no). losstart método comienza elasyncore.loop() escucha, que, cuando se produce una recepción de un correo electrónico, se anexa a una lista interna. Similar, elstop El método debería poder detener este servidor, como se sugiere.aquí.

A pesar del hecho de que este código no funciona como espero (asyncore parece funcionar para siempre, incluso llamo al anterior)stop método. loserror Levanto esta atrapado dentrostop, pero no dentro de latarget función que contieneasyncore.loop()), No estoy seguro de si mi enfoque del problema es sensato. Cualquier sugerencia para corregir el código anterior o proponer una implementación más sólida (sin utilizando software de terceros), son apreciados.

Respuestas a la pregunta(4)

Su respuesta a la pregunta