@@ -292,40 +292,37 @@ def process_message(self, Peer, From, To, Data, **kwargs):
292
292
return _deliver (self , Peer , From , To , Data , ** kwargs )
293
293
294
294
295
- class SMTPOnlyOneRcpt (SMTP ):
296
- async def smtp_RCPT (self , arg ):
297
- if self .envelope .rcpt_tos :
298
- await self .push (SMTP_MULTIPLE_RCPTS_ERROR )
299
- else :
300
- await super ().smtp_RCPT (arg )
301
-
302
-
303
295
class SMTPHandler :
304
296
def __init__ (self , executor = None ):
305
297
self .executor = executor
306
298
307
299
async def handle_DATA (self , server , session , envelope ):
308
- status = await server .loop .run_in_executor (self .executor , partial (
309
- _deliver ,
310
- self ,
311
- session .peer ,
312
- envelope .mail_from ,
313
- envelope .rcpt_tos [0 ],
314
- envelope .content ,
315
- ))
316
- return status or "250 Ok"
300
+ try :
301
+ await server .loop .run_in_executor (self .executor , partial ())
302
+ server .push_to_queue (session , envelope )
303
+ status = "250 Ok"
304
+ except Exception :
305
+ # TODO log exception
306
+ status = "550 Server error"
307
+ return status
317
308
318
309
319
310
class AsyncSMTPReceiver (Controller ):
320
311
"""Receives emails and hands it to the Router for further processing."""
321
- def __init__ (self , handler = None , ** kwargs ):
312
+ def __init__ (self , handler = None , queue = None , ** kwargs ):
322
313
if handler is None :
323
314
handler = SMTPHandler ()
315
+ if queue is None :
316
+ queue = QueueReceiver (IN_QUEUE )
317
+ self .queue = queue
324
318
super ().__init__ (handler , ** kwargs )
325
319
326
320
def factory (self ):
327
- # TODO implement a queue
328
- return SMTPOnlyOneRcpt (self .handler , enable_SMTPUTF8 = self .enable_SMTPUTF8 , ident = ROUTER_VERSION_STRING )
321
+ return SMTP (self .handler , enable_SMTPUTF8 = self .enable_SMTPUTF8 , ident = ROUTER_VERSION_STRING )
322
+
323
+ def stop (self ):
324
+ super ().stop ()
325
+ self .queue .stop ()
329
326
330
327
331
328
class LMTPHandler :
@@ -430,7 +427,9 @@ def start(self, one_shot=False):
430
427
431
428
logging .debug ("Pulled message with key: %r off" , key )
432
429
self .workers .apply_async (self .process_message , args = (msg ,))
430
+ self .stop ()
433
431
432
+ def stop (self ):
434
433
self .workers .close ()
435
434
self .workers .join ()
436
435
0 commit comments