آپیو: کتابخونه ایمیلی که همهجا کار میکنه
خلاصهٔ کاملتر
آپیو (Upyo) یه کتابخونه سبک و متنبازِ ایمیل برای جاوااسکریپت و تایپاسکریپته که Hong Minhee میسازه. ایدهش اینه که بیشتر کتابخونههای ایمیل بیسر و صدا فرض میکنن رو Node.js اجرا میشن، ولی آپیو رو وباستانداردهایی مثل fetch، Uint8Array و AbortSignal ساخته شده تا همون کد بدون تغییر رو چند رانتایم مختلف کار کنه.
مدل کارش سادهست: یه پیام میسازی، یه ترنسپورت (همون مقصدی که ایمیل ازش میره) انتخاب میکنی و میفرستی. این نمونه نشون میده که فرستادن ایمیل با Mailgun چقدر کوتاهه:
const message = createMessage({
from: "hello@example.com",
to: "rachel@example.net",
subject: "Hello from Upyo!",
content: { text: "This is a test email." },
});
const transport = new MailgunTransport({ apiKey: process.env.MAILGUN_KEY, domain: process.env.MAILGUN_DOMAIN });
const receipt = await transport.send(message);نکته اصلیش اینه که همه ارائهدهندهها یه اینترفیس یکسان دارن. یعنی میتونی تو محیط توسعه با SMTP لوکال کار کنی و تو production فقط با عوضکردن یه خط بری سراغ SendGrid یا Mailgun یا Amazon SES؛ کدی که پیام رو میسازه اصلاً خبردار نمیشه. ترنسپورتهای کمکی هم داره مثل Pool برای توزیع بار، Retry برای خطاهای موقت و Mock برای تست.
برای تست یه ترنسپورت Mock داره که پیامها رو تو حافظه نگه میداره تا بتونی چک کنی چی قرار بوده فرستاده بشه، و برای production هم یه ترنسپورت OpenTelemetry داره که بدون دستزدن به کد ارسال، ردیابی و متریکهایی مثل نرخ تحویل و تأخیر بهت میده.
از نظر بستهبندی هم کاملاً با تایپاسکریپت نوشته شده، هم رو npm و هم رو JSR منتشر میشه، هم ESM و هم CommonJS رو پشتیبانی میکنه و صفر وابستگی داره. نتیجه ارسال هم یه discriminated union برمیگردونه که کامپایلر میتونه موفق یا ناموفقبودنشو برات چک کنه.
نکات کلیدی:
- همون کد ارسال ایمیل رو Node.js، Deno، Bun و توابع edge بدون تغییر کار میکنه
- عوضکردن ارائهدهنده (SMTP، Mailgun، SendGrid، SES و…) فقط یه خط تغییره
- ترنسپورتهای Pool، Retry، Mock و OpenTelemetry همون اینترفیس مشترک رو دارن
- تایپاسکریپتمحور، انتشار رو npm و JSR، پشتیبانی ESM و CommonJS، صفر وابستگی




