ImapKit: یه سرور IMAP واقعی برای تست کلاینت ایمیل
خلاصهٔ کاملتر
ImapKit ابزاری هست برای تست کلاینتهای ایمیل. یه سرور IMAP واقعی (یعنی همون پروتکلی که برنامههای ایمیل باهاش پیامها رو از سرور میخونن) رو داخل همون پروسس تستهات اجرا میکنه. سازندهها میگن در حد میلیثانیه بالا میاد و چیزی روی دیسک نگه نمیداره. هر تست یه سرور تازه با همون mailboxها، پیامها، کاربرها و افزونههایی میگیره که لازم داره.
فرقش با یه mock ساده اینه که کلاینت تو روی یه socket واقعی با IMAP واقعی حرف میزنه. همزمان تست میتونه زیر پای کلاینت سرور رو عوض کنه و ببینه کلاینت باهاش همگام میمونه یا نه. نمونهٔ خود سایت این شکلیه:
const server = imapkit({ plugins: ['IDLE', 'CONDSTORE', 'QRESYNC'] });
const port = await server.start();
// change the server while the client is connected
server.control.addMessage('INBOX', { raw: 'Subject: hello\r\n\r\nHi!\r\n' });
server.control.resetUidValidity('INBOX', { uids: 'shuffle', seed: 1 });به گفتهٔ سازندهها، ImapKit عمداً سختگیر طراحی شده. اگه کلاینت چیزی بفرسته که با RFCها نمیخونه، جواب BAD یا NO میگیره. یعنی باگهای کلاینت توی تستها پیدا میشن، نه وقتی به یه سرور پروداکشن وصل شدی. بیشتر از 50 افزونه هم داره، از IMAP4rev1 و IMAP4rev2 گرفته تا IDLE، CONDSTORE، QRESYNC، NOTIFY، ACL، QUOTA و COMPRESS، که برای هر سرور جدا روشن میشن.
با server.control میشه پیام اضافه کرد، فلگها رو عوض کرد، UIDVALIDITY (یعنی شناسهای که میگه شمارهگذاری پیامهای یه mailbox عوض شده یا نه) رو ریست کرد یا sessionها رو قطع کرد. کلاینتهای وصلشده همهٔ این تغییرات رو میبینن. بخش «scripted faults» هم اجازه میده رفتارهای بد سرورهای واقعی رو بازسازی کنی: جواب دیر، خروجی تکهتکه، throttling، خروج خودکار و قطع اتصال. مثلاً میشه کاری کرد که اولین SELECT با NO [UNAVAILABLE] رد بشه.
اگه چند کلاینت روی یه mailbox باشن، آپدیتهای EXISTS، EXPUNGE و فلگها رو دقیقاً همون لحظههایی میگیرن که RFC 2180 اجازه میده. برای زبانهای دیگه هم میشه دستور imapkit رو با REST API و رویدادهای سرور اجرا کرد و از Python، Go یا هر مجموعهٔ تست دیگهای کنترلش کرد. ImapKit رو همون تیمی ساخته که ImapFlow و EmailEngine رو ساخته.
نکات کلیدی:
- ImapKit داخل پروسس تست اجرا میشه، در حد میلیثانیه بالا میاد و چیزی روی دیسک نمینویسه.
- ورودیای که با RFCها نخونه جواب BAD یا NO میگیره تا باگ کلاینت زود پیدا بشه.
- بیشتر از 50 افزونه داره، از جمله IDLE، CONDSTORE، QRESYNC و NOTIFY.
- با server.control میشه وسط تست پیام اضافه کرد یا UIDVALIDITY رو ریست کرد.
- رفتار چند session روی یه mailbox از RFC 2180 پیروی میکنه.
- از طریق REST API از Python و Go هم قابل استفادهست.




