どのように私は極端な怠惰にもかかわらず、PythonでIMAPサーバーを欺くのですか?

StackOverflow https://stackoverflow.com/questions/351656

  •  20-08-2019
  •  | 
  •  

質問

私は、IMAPサーバ(ア・ラ・imaplibモジュール)Pythonで、のなしの多くの仕事をやって模擬する簡単な方法があるかどうか知りたいんです。

既存の解決策はありますか?理想的には私は、既存のIMAPサーバーに接続ダンプを行うには、モックサーバは、実際のメールボックス/メールの構造をオフに実行可能性があります。

怠惰に

いくつかの背景:私は、私が書いているこの小さなスクリプトは、時間をかけて成長すると考えのような適切なテスト環境を作成するには、それは の時間をかけて成長し、私はモックサーバーの実行を得るために多くの作業を行うにはしたくないではない。

役に立ちましたか?

解決

私はそれが非常に簡単、私が試したねじれ最後の時間でIMAPサーバを書くことが分かりました。これは、IMAPサーバを書くためのサポートが付属して、あなたは、柔軟性の膨大な量を持っています。

他のヒント

あなたは本当にいずれかのテストのためにどのくらいの必要があるのですか?あなたはすべてのあなたのテストでそれを使用できるように、実サーバの複雑さのために何かを構築するために起動した場合、あなたはすでに間違って行ってきました。ただ、いずれかのニーズをテストビットを嘲笑。

モック実装を共有するために一生懸命しようと気にしないでください。彼らは資産が、廃棄ビット-n個であるために仮定していない。

私は(のpython 3で実行されていないツイストのメール一部)私のニーズのためのpython 3で便利な何かを見つけることができませんでしたように、私はあなたがしたい場合は、改善することができasyncio小さなモックをしました。

Iはasyncio.Protocolを拡張ImapProtocolを定義しました。そして、このようにサーバーを起動します:

factory = loop.create_server(lambda: ImapProtocol(mailbox_map), 'localhost', 1143)
server = loop.run_until_complete(factory)
メールボックスの>マップ - - メッセージの>セットEメール:

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