كيف يسخرون من خادم IMAP في بيثون، على الرغم من الكسل الشديد؟

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

  •  20-08-2019
  •  | 
  •  

سؤال

وأنا الغريب أن أعرف إذا كان هناك طريقة سهلة للسخرية خادم IMAP (على غرار وحدة imaplib) في بيثون، <م> بدون القيام بالكثير من العمل.

هل هناك حل الموجودة من قبل؟ ومن الناحية المثالية أتمكن من الاتصال بخادم IMAP القائمة، والقيام تفريغ، ويكون الخادم وهمية تشغيل قبالة علبة / هيكل البريد الالكتروني الحقيقي.

وبعض الخلفية في الكسل: لدي شعور مقرف أن هذا السيناريو صغير أنا الكتابة سوف تنمو مع مرور الوقت، وسوف <م> مثل لخلق بيئة الاختبار المناسبة، ولكن نظرا لأنه قد <م > لا تنمو مع مرور الوقت، وأنا لا أريد أن تفعل الكثير من العمل للحصول على الخادم وهمية على التوالي.

هل كانت مفيدة؟

المحلول

وجدت أنه من السهل جدا أن يكتب خادم IMAP في ملتوية آخر مرة حاولت. لأنه يأتي مع دعم لكتابة خوادم IMAP وكان لديك كمية كبيرة من المرونة.

نصائح أخرى

وكيف الكثير منها هل حقا بحاجة لأي اختبار واحد؟ إذا كنت تبدأ في بناء شيء بناء على أمر من تعقيد الخادم الحقيقي بحيث يمكنك استخدامه على جميع الاختبارات الخاصة بك، وكنت قد ذهبت بالفعل خطأ. مجرد سخرية من بت أي واحد اختبارات الاحتياجات.

لا يكلف نفسه عناء محاولة من الصعب جدا أن تشترك في تنفيذ وهمية. انهم ليس من المفترض أن تكون الأصول، ولكن بت ن القطع DISCARDABLE.

وكما لم أجد شيء مناسب في بيثون 3 لاحتياجاتي (بريد جزء من الملتوية ليست قيد التشغيل في بيثون 3)، لقد فعلت ذلك لوهمية صغيرة مع asyncio التي يمكنك تحسين إذا كنت ترغب:

وأنا المحددة لImapProtocol التي تمتد asyncio.Protocol. ثم إطلاق الخادم مثل هذا:

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'))

ووقفه في teardown:

self.server.close()
asyncio.wait_for(self.server.wait_closed(), 1)

https://github.com/bamthomas/ aioimaplib / فقاعة / الماجستير / aioimaplib / الاختبارات / imapserver.py


على تحرير : لكان توقف عربات التي تجرها الدواب من الخادم، I أعاد مع asyncio.Protocol وتعديل الجواب لتعكس التغييرات

ولم أحاول أبدا، ولكن إذا كان لي أن، وأود أن تبدأ مع خادم SMTP القائمة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top