socket.error: [Errno 13] Permission denied when creating a fake email server

29,414

Solution 1

In unix (Linux, Mac OS X, BSD etc) systems, ports less than 1024 can not be bound to by normal users, only the root user can bind to those ports.

To get around this, you could run your python application as root (by using sudo), however this is not preferable. Is it possible instead to get your Flask application to talk to localhost on a higher port, say 2525? You would then need to modify the command you are using to start the smtp server to bind on port 2525 rather than 25.

Solution 2

If you are doing this as an exercise, then @solarnz has the right approach. If however, you need this done for work there is a far better solution in mailcatcher:

MailCatcher runs a super simple SMTP server which catches any message sent to it to display in a web interface. Run mailcatcher, set your favourite app to deliver to smtp://127.0.0.1:1025 instead of your default SMTP server, then check out http://127.0.0.1:1080 to see the mail that's arrived so far.

This is a program designed especially for developers whose apps need a mail server for testing but they don't want to set one up.

The great bonus is that it comes with a web interface to view messages sent by your application:

mailcatcher web interface

Solution 3

Execute program with root or sudo previliages, but as suggested above this is not recommended,

so setup your service on port >= 1024 and then setup reverse proxy for your service, or

redirect all traffice from port 25 to your service port,

For example :

/sbin/iptables -t nat -I PREROUTING -p tcp --dport 25 -j REDIRECT --to-port 2525
Share:
29,414
Takeshi Patterson
Author by

Takeshi Patterson

Updated on August 11, 2020

Comments

  • Takeshi Patterson
    Takeshi Patterson almost 4 years

    I'm trying to create a fake email server as part of a Flask app to print out errors on the console by using the following script. However, it throws an error. How can I fix this?

    dpadmins-MacBook:microblog presentation$ python -m smtpd -n -c DebuggingServer localhost:25
    
    Traceback (most recent call last):
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 162,     in _run_module_as_main
    "__main__", fname, loader, pkg_name)
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 72, in _run_code
      exec code in run_globals
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/smtpd.py", line 536,  in <module>
      (options.remotehost, options.remoteport))
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/smtpd.py", line 285, in __init__
     self.bind(localaddr)
     File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/asyncore.py", line 342, in bind
     return self.socket.bind(addr)
     File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 224, in meth
     return getattr(self._sock,name)(*args)
    socket.error: [Errno 13] Permission denied