use async in email handler

This commit is contained in:
Son 2021-10-12 14:48:33 +02:00
parent eb0e327402
commit 4d7cd09847
1 changed files with 19 additions and 20 deletions

View File

@ -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):