创建虚假电子邮件服务器时出现socket.error: [Errno 13] Permission denied错误

8

我正在尝试作为 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个回答

35

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

为了规避这个问题,您可以使用 sudo 以 root 身份运行 Python 应用程序,但这并不理想。相反,您可以将 Flask 应用程序连接到更高的端口,比如2525的本地主机。然后,您需要修改启动SMTP服务器的命令,将其绑定到2525端口而不是25端口。


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

使用root或sudo权限执行程序,但正如上面所建议的那样,这并不推荐。

因此,请将您的服务设置在端口号>=1024,并为您的服务设置反向代理,或将所有从25号端口流量重定向到您的服务端口。

例如:

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

0

以超级用户身份运行程序。任何端口<=1024的smtp端口都保留给系统,普通用户无法使用。


0

可能是SELinux引起了这个问题。我通过“setenforce 0”解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接