msztolcman / sendria

Sendria (formerly MailTrap) is a SMTP server designed to run in your dev/test environment, that is designed to catch any email you or your application is sending, and display it in a web interface instead of sending to real world.
MIT License
149 stars 14 forks source link

[Feature Request] Non-OK SMTP responses #9

Open tabascoterrier opened 3 years ago

tabascoterrier commented 3 years ago

It's great to see this project revived!

I'm in a position where I could really do with being able to trigger error responses to certain emails (e.g. '550 Mailbox unavailable' and '421 Service not available') to aid in testing.

I tried to do this myself by adding a handle_RCPT handler into smtp.py's AsyncMessage class:

# If the address contains "smtp_response_nnn", return a suitable response code
async def handle_RCPT(self, server, session, envelope, address, rcpt_options):
    if 'smtpresponse_421' in address:
        return '421 Service not available'

    if 'smtpresponse_550' in address:
        return '550 Mailbox unavailable'

    envelope.rcpt_tos.append(address)
    return '250 OK'

This does return the expected SMTP response codes, but now the handle_message handler no longer fires so the message doesn't make it into the DB, and at this point my lack of knowledge of aiosmtpd and async Python becomes very obvious :)

It turns out this does work fine after all.

msztolcman commented 3 years ago

Hi @tabascoterrier ! It's very interesting topic. It's really useful if you could trigger some errors in this way :) Your idea is great, because RCPT TO command is sent very early and you can trigger any reponse on every later stage... will try to find a while to use your idea and maybe extend it a bit :) Thank you!