我很好奇,想知道是否有嘲笑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服务器启动。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top