Мне нужно создать класс, который может принимать и хранить SMTP-сообщения, то есть E-Mails. Для этого я использую asyncore
в соответствии с примером, размещенным здесь. Однако asyncore.loop()
блокируется, поэтому я не могу ничего сделать в коде.
Итак, я подумал об использовании потоков. Вот пример-код, который показывает, что я имею в виду:
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()
Надеюсь, вы получите картину. Класс MyServer
должен иметь возможность запускать и останавливать прослушивание порта 25 неблокирующим способом, который может быть запрошен для сообщений во время прослушивания (или нет). Метод start
запускает прослушиватель asyncore.loop()
, который при приеме сообщения электронной почты добавляется к внутреннему списку. Аналогично, метод stop
должен иметь возможность остановить этот сервер, как предложено здесь.
Несмотря на то, что этот код не работает, как я ожидаю (asyncore, похоже, работает вечно, даже я называю метод stop
выше. error
Я поднимаю, задерживается в stop
, но не внутри target
, содержащая asyncore.loop()
), я не уверен, что мой подход к проблеме имеет смысл. Любые предложения по исправлению вышеуказанного кода или предложения о более надежной реализации (без использования стороннего программного обеспечения) приветствуются.