Upyo: Modern JavaScript/TypeScript için çapraz çalışma zamanı e-posta gönderim kütüphanesi
(upyo.org)Merhaba. Kişisel olarak bir e-posta gönderim kütüphanesi geliştirip paylaşmak istedim.
Neden yapıldı?
Son dönemde çeşitli projeler üzerinde çalışırken Node.js, Deno, Bun gibi farklı çalışma zamanlarını kullanmaya başladım; ancak e-posta gönderimi tarafında her seferinde farklı bir kütüphane bulmak ya da ayarları yeniden yapmak zorunda kalmak zahmetli oluyordu. Özellikle Deno veya Bun üzerinde, Node.js için hazırlanmış e-posta kütüphanelerinin çoğu zaman düzgün çalışmadığını gördüm.
Bu yüzden, “bir kez yazıp her yerde çalışan” bir e-posta kütüphanesi olsa iyi olur diye düşünerek Upyo'yu geliştirdim.
Başlıca özellikler
Çapraz çalışma zamanı uyumluluğu
Node.js, Deno, Bun ve edge functions üzerinde aynı kodla çalışır. Çalışma zamanına göre farklı ayarlar yapmanız veya kod değiştirmeniz gerekmez.
Sıfır bağımlılık
Kişisel olarak beraberinde çok sayıda bağımlılık getiren yapıları tercih etmediğim için bunu sıfır bağımlılıkla geliştirdim. Örneğin SMTP transport için smtp paketini kullanmak yerine bunu doğrudan kendim geliştirdim.
Basit API
Karmaşık ayarlara gerek kalmadan birkaç satırla e-posta gönderebilmeniz için tasarlandı:
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);
Sağlayıcı bağımsızlığı
SMTP, Mailgun, SendGrid gibi çeşitli e-posta servislerini destekler ve sağlayıcıyı değiştirseniz bile uygulama kodu olduğu gibi kalır. Yalnızca Transport değiştirmeniz yeterlidir. (Bir sonraki sürümde Amazon SES desteği de eklenecek.)
Test dostu
Gerçek e-posta göndermeden e-posta mantığını test edebilmeniz için MockTransport sunar. Geliştirme sırasında yanlışlıkla gerçek e-posta gönderilmesi endişesi olmadan test yapabilirsiniz.
Henüz eksik olan noktalar
- SMTP transport tarafında STARTTLS desteği henüz uygulanmadı
- Edge functions üzerinde SMTP henüz desteklenmiyor (yalnızca HTTP API tabanlı transport'lar kullanılabiliyor)
- Hâlâ erken geliştirme aşamasında olduğu için API değişebilir
Deneyin
Farklı çalışma zamanlarında kullanılabilir:
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
@upyo/smtp dışında @upyo/mailgun, @upyo/sendgrid, @upyo/ses, @upyo/mock transport paketleri de var; ileride daha fazlası da eklenecek.
Dokümantasyon: https://upyo.org
Kod: https://github.com/dahlia/upyo
Kapanış
Kişisel bir ihtiyaçtan yola çıkarak başlayan bir proje olsa da, benzer sorunlar yaşayanlara faydalı olabileceğini düşündüğüm için paylaşmak istedim. Henüz 0.1.0 sürümünde ama düzenli olarak geliştirmeye devam edeceğim.
Geri bildirim ve katkılar her zaman memnuniyetle karşılanır!
Upyo adı, Korece “posta pulu” anlamına gelen bir kelimeden geliyor. Tıpkı pulla mektup göndermek gibi e-posta göndermeyi ifade etmesi için bu adı seçtim.
6 yorum
API’yi 2~3 kez değiştirme deneyimim olduğu için empati kurabildiğim bir proje. Siteyi de, dokümantasyonu da temiz ve özenli hazırlamışsınız gibi görünüyor. Servis işletirken bazen belirli bir e-posta hizmeti kesintiye uğruyor ve failover için başka bir e-posta hizmeti kurmak gerekebiliyor;
transportu pool mantığıyla işleten kod da olsa güzel olurdu diye düşünüyorum.resend.comdesteği de gelse iyi olur. Daha sonra uygulayacağım zamana kadar eklenmemiş olursa bizzat katkıda bulunmayı da denerim~!Geri bildiriminiz için teşekkürler!
PoolTransportveResendTransport'u da yakında eklemeye çalışacağım!Semboldeki “郵票”yu “pul” olarak değiştirmek nasıl olur?
Şu an da gerçekten cuk oturup çok güzel göründüğü için bunu söylerken biraz temkinli davranıyorum..
Oo~ güzelmiş~ süper süper
Bu tek kişilik bir proje mi?? Gerçekten etkileyici..
Evet, şimdilik hâlâ tek başıma geliştiriyorum. 😅