31 puan yazan hongminhee 2025-07-14 | 6 yorum | WhatsApp'ta paylaş

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

 
davidshim 2025-08-13

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.com desteği de gelse iyi olur. Daha sonra uygulayacağım zamana kadar eklenmemiş olursa bizzat katkıda bulunmayı da denerim~!

 
hongminhee 2025-08-13

Geri bildiriminiz için teşekkürler! PoolTransport ve ResendTransport'u da yakında eklemeye çalışacağım!

 
nemorize 2025-07-15

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..

 
zinisuni 2025-07-15

Oo~ güzelmiş~ süper süper

 
cgl00 2025-07-15

Bu tek kişilik bir proje mi?? Gerçekten etkileyici..

 
hongminhee 2025-07-15

Evet, şimdilik hâlâ tek başıma geliştiriyorum. 😅