1

I had "successfully" made an SMTP server. The code works fine connecting to SMTP clients. But it is neither able to recieve emails nor send it. I tried with various test servers and also the standard gmail/yahoo etc. Here is the code:

    # Copyright 2014-2021 The aiosmtpd Developers
# SPDX-License-Identifier: Apache-2.0

import asyncio
from asyncio.base_events import Server
import logging
import aiosmtpd
from aiosmtpd.controller import DEFAULT_READY_TIMEOUT, Controller
import ssl
from aiosmtpd.smtp import Envelope, Session
from smtplib import SMTP as SMTPCLient


context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain('cert.pem', 'privkey.pem')


class ExampleHandler():
    async def handle_RCPT(self, server, session, envelope, address, rcpt_options):
        if address.endswith('@example.com'):
            print('not relaying to that domain bro :(')
            return '550 not relaying to that domain'
        envelope.rcpt_tos.append(address)
        print(address+" "+"is added to rcpt_tos")
      

        # Make an envelope for the recipient with the same content.
        
        
        
        return '250 OK'



    # async def handle_EHLO(self, server, session, envelope):
    #     print('EHLO from %s' % envelope.mail_from)
    #     return '250-Hello, how are you?\n250-I am fine\n250 HELP'    


    async def handle_DATA(self, server, session, envelope):
        print('Message from %s' % envelope.mail_from)
        print('Message for %s' % envelope.rcpt_tos)
        print('Message data:\n')
        for ln in envelope.content.decode('utf8', errors='replace').splitlines():
            print(f'> {ln}'.strip())
        print()
        print('End of message')
        # Dump the contents of envelope.content to a file.
        fi=open('./mailbox/firstletter.txt','w')
        fi.write(envelope.content.decode('utf8', errors='replace'))
        fi.close()




        # print everything in DATA.
        # Send the envelope to the recipient.


        return '250 Message will be delivered'
    #Define Relay server.
  
   




async def amain(loop):
    cont = Controller(ExampleHandler(),hostname='x.x.x.x', port=25, server_hostname='Galam Limited',ready_timeout=5000) 
    # Combining ExampleHandler and Controller into a single Controller.
   
    cont.start()


if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)
    loop = asyncio.get_event_loop()
    loop.create_task(amain(loop=loop))
    try:
        loop.run_forever()
    except KeyboardInterrupt:
        pass
  

You can test the server reachability . I am stuck and spent 2 whole days to no avail. The issue is definetely not connectivity, I put the port 25 open. Made sure there are no external issues with godaddy either. Any help will be appreicated.

Edit:1 A quick peak at the wire shark data shows absolutely no packet is being transmitted to the outside when I run the client script. Here is the clinet script I used for testing.

from smtplib import SMTP as Client
from aiosmtpd.controller import Controller
class controller:
    hostname='192.168.1.33'
    port=25
client = Client(controller.hostname, controller.port)
r = client.sendmail('a@galam.in', ['tester@192.168.1.200'], """\
From: Anne Person <anne@galam.in>
To: Bart Person <tester@192.168.1.200>
Subject: A test
Message-ID: <ant>
Hi Bart, this is Anne.
""")

1 Answers1

0

SMTP 250 code means that a successful connection has been established however the remote host you are sending mails to might have categorized the domain the mail is being sent from as not legitimate.

This can happen if your domain is not authenticated/verified. You can relay your messages through a trusted SMTP service like sendgrid

You can also check if your domain is verified by sending a mail from your service to check-auth@verifier.port25.com. Port25 is an automated tool that verified your DNS records, SPF records etc.

Hope this works for you!

newt
  • 321
  • 2
  • 8