Devo creare una classe in grado di ricevere e archiviare messaggi SMTP, ad esempio E-mail. Per fare ciò, sto usando asyncore
secondo un esempio pubblicato here. Tuttavia, asyncore.loop()
sta bloccando, quindi non posso fare nient'altro nel codice.Come gestire asyncore all'interno di una classe in python, senza bloccare nulla?
Quindi ho pensato di utilizzare i thread. Ecco un esempio di codice che mostra quello che ho in 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()
Spero che tu abbia la foto. La classe MyServer
dovrebbe essere in grado di avviare e interrompere l'ascolto della porta 25 in modo non bloccante, in grado di essere interrogato per i messaggi durante l'ascolto (o meno). Il metodo start
avvia il listener , che, quando si verifica una ricezione di un'e-mail, si aggiunge a un elenco interno. Simile, il metodo stop
dovrebbe essere in grado di arrestare questo server, come suggerito here.
Nonostante il fatto che questo codice non funziona come mi aspetto di (asyncore sembra funzionare sempre, anche io chiamo il metodo di cui sopra stop
. La error
Alzo catched all'interno stop
, ma non all'interno della funzione target
contenente asyncore.loop()
), Non sono sicuro che il mio approccio al problema sia sensato. Sono graditi suggerimenti per la correzione del codice di cui sopra o per la proposta di un'implementazione più solida (senza utilizzando software di terze parti).
Mi sento un po 'di confusione lì. Qual è il problema con il blocco di 'asyncore.loop()? Capisci perché chiami la funzione 'loop' e cosa fa? – mmgp
@mmgp: Il problema con 'asyncore.loop()' è che sta bloccando.Voglio essere in grado di utilizzare la classe in qualsiasi momento all'interno di un altro codice. Dall'altro lato, non sono un esperto di 'asyncore.loop()', ma AFAIK gestisce internamente il 'select.select', che sta cercando ad es. per i messaggi SMTP in arrivo sulla porta 25, in questo caso. – Alex
hai usato i toolkit della GUI? Fondamentalmente tutti sono basati su loop di eventi. Devi organizzare cose tali da produrre eventi che devono essere gestiti dal "ciclo degli eventi". La confusione che ho menzionato è perché sembri inconsapevole di come usare un ciclo di eventi, è questo il caso? – mmgp