From 4d7cd09847641ed1593a12680c05470755878448 Mon Sep 17 00:00:00 2001 From: Son Date: Tue, 12 Oct 2021 14:48:33 +0200 Subject: [PATCH] use async in email handler --- email_handler.py | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/email_handler.py b/email_handler.py index 9e2a0bb6..a29798ff 100644 --- a/email_handler.py +++ b/email_handler.py @@ -31,6 +31,7 @@ It should contain the following info: """ import argparse +import asyncio import email import os import time @@ -1711,7 +1712,7 @@ def should_ignore(mail_from: str, rcpt_tos: List[str]) -> bool: return False -def handle(envelope: Envelope) -> str: +async def handle(envelope: Envelope) -> str: """Return SMTP status""" # sanitize mail_from, rcpt_tos @@ -1934,7 +1935,7 @@ def handle(envelope: Envelope) -> str: class MailHandler: async def handle_DATA(self, server, session, envelope: Envelope): try: - ret = self._handle(envelope) + ret = await self._handle(envelope) return ret except Exception: LOG.e( @@ -1945,7 +1946,7 @@ class MailHandler: return status.E404 @newrelic.agent.background_task(application=newrelic_app) - def _handle(self, envelope: Envelope): + async def _handle(self, envelope: Envelope): start = time.time() # generate a different message_id to keep track of an email lifecycle @@ -1958,23 +1959,21 @@ class MailHandler: envelope.rcpt_tos, ) - app = new_app() - with app.app_context(): - ret = handle(envelope) - elapsed = time.time() - start - LOG.i( - "Finish mail from %s, rctp tos %s, takes %s seconds <<===", - envelope.mail_from, - envelope.rcpt_tos, - elapsed, - ) - newrelic.agent.record_custom_metric( - "Custom/email_handler_time", elapsed, newrelic_app - ) - newrelic.agent.record_custom_metric( - "Custom/number_incoming_email", 1, newrelic_app - ) - return ret + ret = await handle(envelope) + elapsed = time.time() - start + LOG.i( + "Finish mail from %s, rctp tos %s, takes %s seconds <<===", + envelope.mail_from, + envelope.rcpt_tos, + elapsed, + ) + newrelic.agent.record_custom_metric( + "Custom/email_handler_time", elapsed, newrelic_app + ) + newrelic.agent.record_custom_metric( + "Custom/number_incoming_email", 1, newrelic_app + ) + return ret def main(port: int):