Halo. Saya ingin membagikan pustaka pengiriman email yang saya buat secara pribadi.
Mengapa saya membuatnya?
Belakangan ini, saat mengerjakan berbagai proyek, saya jadi menggunakan beragam runtime seperti Node.js, Deno, dan Bun. Namun, pada bagian pengiriman email, saya selalu merasa tidak nyaman karena harus mencari pustaka yang berbeda atau mengatur ulang konfigurasinya setiap kali. Terutama di Deno atau Bun, pustaka email untuk Node.js sering kali tidak berjalan dengan baik.
Karena itu, saya membuat Upyo dengan pemikiran bahwa akan sangat bagus jika ada pustaka email yang “sekali ditulis, bisa berjalan di mana saja”.
Fitur utama
Kompatibilitas lintas runtime
Berjalan dengan kode yang sama di Node.js, Deno, Bun, dan edge functions. Tidak perlu konfigurasi berbeda atau perubahan kode untuk tiap runtime.
Zero dependency
Secara pribadi saya tidak terlalu menyukai banyak dependensi ikut terbawa, jadi saya membuatnya sebagai zero dependency. Misalnya, untuk transport SMTP pun saya tidak memakai paket smtp, melainkan mengembangkannya sendiri.
API sederhana
Dirancang agar Anda bisa mengirim email hanya dengan beberapa baris tanpa konfigurasi yang rumit:
import { createMessage } from "@upyo/core";
import { MailgunTransport } from "@upyo/mailgun";
const message = createMessage({
from: "sender@example.com",
to: "recipient@example.com",
subject: "Hello from Upyo!",
content: { text: "간단한 이메일입니다." },
});
const transport = new MailgunTransport({
apiKey: process.env.MAILGUN_KEY,
domain: process.env.MAILGUN_DOMAIN,
});
const receipt = await transport.send(message);
Independensi penyedia
Mendukung berbagai layanan email seperti SMTP, Mailgun, dan SendGrid. Meski Anda mengganti penyedia, kode aplikasi tetap bisa dipertahankan apa adanya. Anda hanya perlu mengganti Transport. (Dukungan Amazon SES juga akan ditambahkan pada versi berikutnya.)
Ramah untuk pengujian
Menyediakan MockTransport yang memungkinkan Anda menguji logika email tanpa benar-benar mengirim email. Anda bisa melakukan pengujian tanpa khawatir email sungguhan terkirim secara tidak sengaja selama pengembangan.
Bagian yang masih kurang
- Dukungan STARTTLS pada transport SMTP belum diimplementasikan
- SMTP belum didukung di edge functions (hanya transport berbasis HTTP API yang tersedia)
- Karena masih tahap awal pengembangan, API masih bisa berubah
Mencobanya
Bisa digunakan di berbagai runtime:
npm add @upyo/core @upyo/smtp
pnpm add @upyo/core @upyo/smtp
yarn add @upyo/core @upyo/smtp
deno add --jsr @upyo/core @upyo/smtp
bun add @upyo/core @upyo/smtp
Selain @upyo/smtp, tersedia juga paket transport @upyo/mailgun, @upyo/sendgrid, @upyo/ses, dan @upyo/mock, dan ke depannya akan ada lebih banyak lagi yang ditambahkan.
Dokumentasi: https://upyo.org
Kode: https://github.com/dahlia/upyo
Penutup
Meski proyek ini berawal dari kebutuhan pribadi, saya membagikannya karena mungkin bisa membantu orang lain yang memiliki kekhawatiran serupa. Saat ini masih versi 0.1.0, tetapi saya berencana terus meningkatkannya secara konsisten.
Masukan maupun kontribusi selalu saya sambut!
Upyo adalah nama yang diambil dari kata Korea “prangko”. Maknanya adalah mengirim email seperti mengirim surat dengan prangko.
6 komentar
Ini proyek yang terasa relevan karena saya juga pernah beberapa kali, sekitar 2–3 kali, mengalami perubahan API. Situs dan dokumentasinya juga sepertinya dibuat dengan rapi dan bagus. Saat mengoperasikan layanan, kadang ada layanan email tertentu yang berhenti sehingga kita perlu menyiapkan layanan email lain sebagai failover; akan bagus juga kalau ada kode yang mengelola
transportdengan konsep pool. Akan lebih baik lagi kalauresend.comjuga didukung. Kalau nanti saat saya hendak menerapkannya itu masih belum ada, saya akan coba berkontribusi sendiri juga~!Terima kasih atas masukannya!
PoolTransportdanResendTransportakan saya coba tambahkan dalam waktu dekat!Bagaimana kalau simbol “郵票” diubah menjadi “prangko”?
Sekarang pun sudah sangat pas dan cantik, jadi saya agak berhati-hati juga mengatakannya..
Oh~ bagus ya~ mantap mantap
Apakah ini proyek satu orang?? Hebat sekali..
Ya, sejauh ini masih saya buat sendiri. 😅