J'ai besoin de créer une classe qui peut recevoir et stocker des messages SMTP, c'est-à-dire des E-Mails. Pour ce faire, j'utilise asyncore
selon un exemple affiché aquí . Cependant, asyncore.loop()
est bloqué et je ne peux donc rien faire d'autre dans le code.
J'ai donc pensé à utiliser des fils. Voici un exemple de code qui montre ce que j'ai en tête :
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()
J'espère que vous avez saisi l'image. La classe MyServer
doit pouvoir commencer et arrêter d'écouter le port 25 de manière non bloquante, et être capable d'être interrogé pour des messages pendant l'écoute (ou non). Le site start
lance la méthode asyncore.loop()
qui, lors de la réception d'un courriel, l'ajoutent à une liste interne. De façon similaire, le stop
devrait être en mesure d'arrêter ce serveur, comme suggéré aquí .
Malgré le fait que ce code ne fonctionne pas comme je l'espère (l'asynchronisme semble s'exécuter indéfiniment, même si j'appelle le code ci-dessus stop
méthode. Le site error
Je soulève est attrapé dans stop
mais pas dans le cadre de la target
fonction contenant asyncore.loop()
), je ne suis pas sûr que mon approche du problème soit judicieuse. Avez-vous des suggestions pour corriger le code ci-dessus ou proposer une mise en œuvre plus solide ( sans en utilisant un logiciel tiers), sont appréciés.