如何嘲笑在Python,IMAP服务器,尽管极端懒惰?
题
我很好奇,想知道是否有嘲笑IMAP服务器的简单方法(一拉imaplib
模块)在Python,的不的做了很多的工作。
是否有预先存在的溶液?理想情况下,我可以连接到现有的IMAP服务器,做一个转储,并有模拟服务器跑出真正的邮箱/电子邮件结构。
一些背景到懒惰:我有一个讨厌的感觉,这个小剧本我写会随时间而增加,并会的像的创建合适的测试环境,但考虑到它可能的不的发展随着时间的推移,我不想做太多的工作,以获得模拟服务器运行。
解决方案
我觉得这是很容易写在扭曲我最后一次尝试的IMAP服务器。它配备了支持IMAP写入服务器和你有很大的灵活性。
其他提示
的量有多大,你真的需要对任何一个测试?如果你开始建立一个真正的服务器的复杂顺序的东西,这样就可以在所有的测试中使用它,您已经出了错。只是嘲笑任何一个测试需求的位。
不要刻意努力地试图共享一个模拟实现。他们不应该是资产,但丢弃位正作品。
由于我没有找到我需要的东西在Python 3便利(扭曲的邮件部分没有在Python 3中运行),我与ASYNCIO一个小假,你可以改善,如果你想:
我所定义,其延伸asyncio.Protocol一个ImapProtocol。然后启动一个服务器是这样的:
factory = loop.create_server(lambda: ImapProtocol(mailbox_map), 'localhost', 1143)
server = loop.run_until_complete(factory)
在mailbox_map是地图的地图:电子邮件 - >邮箱地图 - >的消息集。因此,所有的消息/邮箱是在存储器中。
每个客户端连接的时候,ImapProtocol的新实例被创建。 然后,执行ImapProtocol和每个客户端的回答,实施能力/登录/获取/选择/搜索/存储:
class ImapHandler(object):
def __init__(self, mailbox_map):
self.mailbox_map = mailbox_map
self.user_login = None
# ...
def connection_made(self, transport):
self.transport = transport
transport.write('* OK IMAP4rev1 MockIMAP Server ready\r\n'.encode())
def data_received(self, data):
command_array = data.decode().rstrip().split()
tag = command_array[0]
self.by_uid = False
self.exec_command(tag, command_array[1:])
def connection_lost(self, error):
if error:
log.error(error)
else:
log.debug('closing')
self.transport.close()
super().connection_lost(error)
def exec_command(self, tag, command_array):
command = command_array[0].lower()
if not hasattr(self, command):
return self.error(tag, 'Command "%s" not implemented' % command)
getattr(self, command)(tag, *command_array[1:])
def capability(self, tag, *args):
# code for it...
def login(self, tag, *args):
# code for it...
然后,在测试中,我与设置期间启动服务器:
self.loop = asyncio.get_event_loop()
self.server = self.loop.run_until_complete(self.loop.create_server(create_imap_protocol, 'localhost', 12345))
当欲模拟新的消息:
imap_receive(Mail(to='dest@fakemail.org', mail_from='exp@pouet.com', subject='hello'))
和在拆卸停止它:
self.server.close()
asyncio.wait_for(self.server.wait_closed(), 1)
CF https://github.com/bamthomas/ aioimaplib /斑点/主/ aioimaplib /测试/ imapserver.py
修改的:我有服务器的马车停,我asyncio.Protocol改写了它并修改答案以反映更改
我从来没有尝试过,但是,如果我不得不,我将与现有的SMTP服务器启动。