На основе компонента SMTPD я написал собственный SMTP-сервер с авторизацией и т. Д. Последнее, что мне нужно сделать, это добавить синтаксический анализ сообщений в новый поток, когда он появится.Как создать новый поток python с классами?
Таким образом, мой компонент состоит из двух классов: SMTPServer
и SMTPChannel
. Он отлично работает в одном потоке, как это:
def handle_accept(self):
pair = self.accept()
if pair is not None:
conn, addr = pair
logging.info('Incoming connection from ' + str(addr))
channel = SMTPChannel(config, conn, addr)
Вход выглядеть следующим образом:
[email protected] ~/www/py_email $ python SMTPServer.py
[2015-05-27 11:15:57] [MainThread] INFO: Server started at 192.168.0.103:1026
[2015-05-27 11:16:46] [MainThread] INFO: Incoming connection from ('192.168.0.46', 52423)
[2015-05-27 11:16:46] [MainThread] DEBUG: <-- '220 SMTP Server 0.1 ESMTP'
[2015-05-27 11:16:46] [MainThread] DEBUG: --> EHLO : '*******'
[2015-05-27 11:16:46] [MainThread] DEBUG: <-- '250-SMTP Server 0.1 ESMTP Hello *******\n250-SIZE 20480000\n250 AUTH PLAIN LOGIN CRAM-MD5'
[2015-05-27 11:16:47] [MainThread] DEBUG: --> AUTH : 'PLAIN AGFkbWluADEyMzQ='
[2015-05-27 11:16:47] [MainThread] INFO: ('192.168.0.46', 52423) successfully authenticated
[2015-05-27 11:16:47] [MainThread] DEBUG: <-- '235 Authentication successful.'
[2015-05-27 11:16:47] [MainThread] DEBUG: --> MAIL : 'FROM:<[email protected]*******>'
[2015-05-27 11:16:47] [MainThread] DEBUG: <-- '250 Ok'
[2015-05-27 11:16:47] [MainThread] DEBUG: --> RCPT : 'TO:<[email protected]*******>'
[2015-05-27 11:16:47] [MainThread] DEBUG: <-- '250 Ok'
[2015-05-27 11:16:47] [MainThread] DEBUG: --> DATA
[2015-05-27 11:16:47] [MainThread] DEBUG: <-- '354 End data with <CR><LF>.<CR><LF>'
[2015-05-27 11:16:47] [MainThread] DEBUG: <-- '250 Ok'
[2015-05-27 11:16:47] [MainThread] DEBUG: --> QUIT
[2015-05-27 11:16:47] [MainThread] DEBUG: <-- '221 Bye'
[2015-05-27 11:16:47] [MainThread] INFO: Incoming connection from ('192.168.0.46', 52422)
[2015-05-27 11:16:47] [MainThread] DEBUG: <-- '220 SMTP Server 0.1 ESMTP'
[2015-05-27 11:16:47] [MainThread] DEBUG: --> EHLO : '*******'
[2015-05-27 11:16:47] [MainThread] DEBUG: <-- '250-SMTP Server 0.1 ESMTP Hello *******\n250-SIZE 20480000\n250 AUTH PLAIN LOGIN CRAM-MD5'
[2015-05-27 11:16:48] [MainThread] DEBUG: --> AUTH : 'PLAIN AGFkbWluADEyMzQ='
[2015-05-27 11:16:48] [MainThread] INFO: ('192.168.0.46', 52422) successfully authenticated
[2015-05-27 11:16:48] [MainThread] DEBUG: <-- '235 Authentication successful.'
[2015-05-27 11:16:48] [MainThread] DEBUG: --> MAIL : 'FROM:<[email protected]*******>'
[2015-05-27 11:16:48] [MainThread] DEBUG: <-- '250 Ok'
[2015-05-27 11:16:48] [MainThread] DEBUG: --> RCPT : 'TO:<[email protected]*******>'
[2015-05-27 11:16:48] [MainThread] DEBUG: <-- '250 Ok'
[2015-05-27 11:16:48] [MainThread] DEBUG: --> DATA
[2015-05-27 11:16:48] [MainThread] DEBUG: <-- '354 End data with <CR><LF>.<CR><LF>'
[2015-05-27 11:16:48] [MainThread] DEBUG: <-- '250 Ok'
[2015-05-27 11:16:48] [MainThread] DEBUG: --> QUIT
[2015-05-27 11:16:48] [MainThread] DEBUG: <-- '221 Bye'
Но когда я добавляю темы, как это:
def handle_accept(self):
pair = self.accept()
if pair is not None:
conn, addr = pair
logging.info('Incoming connection from ' + str(addr))
new_thread = threading.Thread(target=SMTPChannel, args=(config, conn, addr,))
new_thread.start()
Журнал выглядит следующим образом:
[email protected] ~/www/py_email $ python SMTPServer.py
[2015-05-27 11:23:29] [MainThread] INFO: Server started at 192.168.0.103:1026
[2015-05-27 11:23:49] [MainThread] INFO: Incoming connection from ('192.168.0.46', 52414)
[2015-05-27 11:23:49] [Thread-1 ] DEBUG: <-- '220 SMTP Server 0.1 ESMTP'
[2015-05-27 11:23:49] [MainThread] DEBUG: --> EHLO : '*****'
[2015-05-27 11:23:49] [MainThread] DEBUG: <-- '250-SMTP Server 0.1 ESMTP Hello ********\n250-SIZE 20480000\n250 AUTH PLAIN LOGIN CRAM-MD5'
[2015-05-27 11:23:49] [MainThread] DEBUG: --> AUTH : 'PLAIN AGFkbWluADEyMzQ='
[2015-05-27 11:23:49] [MainThread] INFO: ('192.168.0.46', 52414) successfully authenticated
Как вы можете видеть Thread-1
пожаров только один раз, то все сообщения возвращаются к основной теме ... Может быть, есть что-то, чтобы иметь дело с классом, простирающимся в class MerlinSMTPServer(asyncore.dispatcher):
и class SMTPChannel(asynchat.async_chat):
@abarnert, как я уже говорил, перед тем, как 'SMTPChannel' совпадает с https://hg.python.org/cpython/file/2.7/Lib/smtpd.py, за исключением того, что он переписан как автономный (проверка метода сообщения процесса добавлено) – user1692333
Это похоже на проблему [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Почему, по-вашему, вы хотите использовать потоки с приложением 'asynchat'? Что вы пытаетесь выполнить, и почему вы думаете, что нити помогут? Если вы можете это объяснить, возможно, мы сможем объяснить, как на самом деле делать то, что вы хотите. – abarnert