socket.error:[Errno 13]创建假电子邮件服务器时权限被拒绝

时间:2014-09-07 11:33:46

标签: python sockets flask

我正在尝试创建一个虚假的电子邮件服务器作为Flask应用程序的一部分,以使用以下脚本在控制台上打印出错误。但是,它会抛出错误。我该如何解决这个问题?

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

5 个答案:

答案 0 :(得分:29)

在unix(Linux,Mac OS X,BSD等)系统中,普通用户无法绑定小于1024的端口,只有root用户可以绑定到这些端口。

为了解决这个问题,您可以以root身份运行python应用程序(通过使用sudo),但这不是首选。是否可以让你的Flask应用程序与更高端口上的localhost通信,例如2525?然后,您需要修改用于启动smtp服务器以在端口2525而不是25上绑定的命令。

答案 1 :(得分:3)

如果你这样做是为了练习,那么@solarnz有正确的方法。但是,如果您需要将此工作完成,那么mailcatcher中有一个更好的解决方案:

  

MailCatcher运行一个超级简单的SMTP服务器,可以捕获任何消息   发送到它以显示在Web界面中。运行mailcatcher,设置你​​的   最喜欢的应用程序,以提供给smtp://127.0.0.1:1025,而不是你的   默认SMTP服务器,然后查看http://127.0.0.1:1080以查看   到目前为止的邮件。

这是一个专为开发人员设计的程序,他们的应用程序需要一个邮件服务器进行测试,但他们不想设置一个。

最大的好处是它附带了一个Web界面来查看应用程序发送的消息:

mailcatcher web interface

答案 2 :(得分:2)

使用root或sudo previliages执行程序, 但如上所述,不建议这样做,

因此请在端口&gt; = 1024上设置您的服务,然后为您的服务设置反向代理,或

将所有流量从端口25重定向到您的服务端口

例如:

/sbin/iptables -t nat -I PREROUTING -p tcp --dport 25 -j REDIRECT --to-port 2525

答案 3 :(得分:0)

以超级用户身份运行程序。任何端口&lt; = 1024的smtp-port都保留给系统,普通用户不能使用。

答案 4 :(得分:0)

也许SELinux导致了这个问题。我通过“setenforce 0”解决了问题。