我目前正在开展一个非常小的项目。我的工作基于smtpd.py,但慢慢走向完全不同的东西。
这是一个smtp服务器。它目前接收并可以转发邮件。这是非常直接的前进,但我达到了一个问我自己一些问题的地步。
smtpd.py使用asyncore和asychat。问题是它是使用异步api的单个进程。一切正常,我可以走得更远而没有太多问题。
问题是,如果服务器在端口25上绑定,则它必须位于根uid下。所以这是一个大问题。 smtp服务器背后的想法是我可以使用python实现很多东西。我希望能够访问本地用户,数据库或任何可能的数据存储。从哈希或python当前支持的任何东西,我甚至可以根据需要添加对它的支持。
问题是我觉得使用root用户进行所有这些控制是非常不安全的...如果有人可以做一些事情并且最终使用root python shell ...
所以起初我想创建线程并使用os.setuid为它们设置一个不同的uid,但它似乎不起作用或者也很危险。
我的第二个想法:接受连接然后fork并更改uid。我应该能够从分叉的进程中编写/读取套接字,一切都应该没问题。
第三个想法是拥有一个代理服务器,将所有消息中继到本身将自己处理消息的服务器。唯一的问题是,如果某人不应该使用我的smtp服务器代理无法授权或做任何事情,因为它只是一个没有任何实际访问权限的代理。
我相信分叉是最有趣的解决方案。
或者可能还有一些我还没有想到的东西。
无论如何,谢谢
- 编辑 -
显然,如果进程是以root身份启动的,一旦创建了套接字,就可以使用os.setuid切换到其他用户。我想这不是真的便携,但现在这不是一个大问题。在搜索了Pyramid / Pylons / Paste的代码后,我终于遇到了那个东西! SocketServer模块。我可能会使用ForkingMixIn或ThredingMixIn。可以定义线程数量等。
在任何情况下,对于那些想知道我为什么不使用postfix,exim或qmail的人来说。这很简单,我不是真的在制作smtp服务器。如果您只实现接收电子邮件,接受或拒绝收件人或发件人等所需的最低要求,那么smtp protocole非常简单。转义第一个“。”因为RFC说数据以“\ r \ n。\ r \ n”结尾,所以每个新行都有。
正如我所看到的,python更像是构建块。我的想法不是制作一个smtp服务器(我肯定会实现ESMTP),而是建立一个“框架”来构建自己的服务器。我遇到的问题,我不相信我一个人。有人设计了配置文件和配置postfix的方法。它是硬编码的,并不适合所有情况。制作适合所有情况的服务器也不会起作用。它可能会变得巨大而丑陋。我们的想法是在您的服务器上轻松添加所需的部件。如果要使用数据库,请使用现有模块所需的数据库。进行查询并发回结果。
如果您确实要定义适用于所有域或某些域甚至用户名的规则,则应该可以这样做。
例如,我看到一个用例。真的很奇怪,但仍然。仅使用一台服务器在postfix上设置这种设置是多么容易。你有三个域名。 a.com,b.com,c.com。a.com使用相同的用户名将所有收到的邮件发送到maildir和b.com。 b.com使用相同的用户名将所有收到的邮件发送到maildir和c.com。 c.com使用相同的用户名将所有收到的邮件发送到maildir和a.com。
没有域接受他们已发送的电子邮件。
换句话说
a.com -> b.com -> c.com -x-> a.com
b.com -> c.com -> a.com -x-> b.com
...
这里的想法是邮件将在多个域中被复制,但它无法返回给它的所有者。这种用例应该非常简单。但是,如果所有域名将邮件保存在不同的位置,或者我们希望每隔2次保存邮件,该怎么办呢。
a -> b -> c(save)
a -> b(save) -> c
a(save) -> b -> c
already saved to C so stop the mail would be sent 9 times
答案 0 :(得分:0)
该帖子的标题似乎与提出的问题不符。不过,我可以理解所提出的一些问题以及评论。特别是,我同意Jim Garrison这对于深入了解SMTP和邮件服务器原则是一次有用的学习经验。但是,如果目的不是学习,那么使用现有的,经过良好测试的,可能更安全的选项可能会更实际,更经济。值得考虑的是Lamson,因为您已经在使用Python和备用邮件服务器,特别是Exim,它提供了非常灵活和强大的配置选项和过滤功能。这些应用程序的开发人员和支持社区非常重要,并且都有详细记录。然后,您可以将时间用于解决特定于项目的问题,而不是那些已经解决的问题。
答案 1 :(得分:-1)
问题的答案是使用ServerSocket。我将使用线程或分叉子类。它非常灵活,可以毫无顾虑地取代asyncore。它已被塔架,金字塔等使用。但在我的情况下,它将处理smtp消息而不是http。