socket.error: [Errno 13] 权限被拒绝,创建伪邮件服务器时出现错误
我正在尝试在一个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 个回答
可能是SELinux导致了这个问题。我通过输入“setenforce 0”来解决了这个问题。
以超级用户身份运行这个程序。因为smtp端口和其他小于等于1024的端口都是系统保留的,普通用户是不能使用这些端口的。
以管理员权限(root或sudo)运行程序,
但如上所述,这并不推荐,
所以建议你把服务设置在1024以上的端口,然后为你的服务设置反向代理,或者
将所有从25号端口来的流量重定向到你的服务端口,
例如:
/sbin/iptables -t nat -I PREROUTING -p tcp --dport 25 -j REDIRECT --to-port 2525
如果你是在做练习,那么@solarnz的方法是对的。不过,如果你是为了工作需要,这里有个更好的解决方案,就是mailcatcher:
MailCatcher 是一个超级简单的SMTP服务器,它可以接收发送给它的任何邮件,并在网页上显示出来。你只需运行mailcatcher,把你喜欢的应用程序设置为发送邮件到
smtp://127.0.0.1:1025
,而不是你默认的SMTP服务器,然后访问http://127.0.0.1:1080
就能看到到目前为止收到的邮件。
这个程序专门为开发者设计,适合那些需要邮件服务器来测试应用,但又不想自己搭建服务器的人。
一个很棒的优点是,它带有一个网页界面,可以查看你应用发送的邮件:
在Unix系统(比如Linux、Mac OS X、BSD等)中,端口号小于1024的端口是普通用户无法使用的,只有超级用户(root用户)才能使用这些端口。
为了绕过这个限制,你可以通过使用sudo命令以超级用户身份运行你的Python应用,但这样做并不是最好的选择。那么,有没有办法让你的Flask应用在一个更高的端口上,比如2525,与本地进行通信呢?这样的话,你就需要修改启动SMTP服务器的命令,让它绑定到2525端口,而不是默认的25端口。