İçeriğe geç
Yasir Uslu
Tüm işler

Kendi alan adında e-posta

Posta — @usluso.com

usluso.com alan adında çalışan bir posta hizmeti. Davet edilen kişi kendi adresini seçer; gelen ve giden postalar konuşma hâlinde toplanır, yazılanlar taslak olarak kaydedilir, yeni posta telefona bildirim olarak düşer. Masaüstünde üç panelli, telefonda tek elle kullanılan bir arayüzü var; mail.usluso.com adresinde ayrı bir uygulama gibi açılır.

Durum
Canlıda · davetli
Araçlar
Next.js 16 · TypeScript · Cloudflare Workers · Supabase · PostgreSQL RLS · Resend · Web Push · Playwright
Posta — @usluso.com ekran görüntüsü

Problem

Site Vercel’de çalışıyor ve Vercel posta (SMTP) kabul etmiyor. Posta almak, başkalarının postasını birbirinden ayırmak, gönderilen postanın spam’e düşmemesi ve yabancı HTML’nin sayfada güvenle gösterilmesi gerekiyordu; hepsi ayrı bir posta sunucusu işletmeden.

Rolüm

Tek geliştirici: posta alma Worker’ı, veritabanı şeması ve güvenlik kuralları, gönderim, bildirimler, arayüz ve testler.

Yaklaşım

  1. 01

    Alma: Cloudflare Email Worker

    Cloudflare Email Routing gelen postayı bir Worker’a verir. Worker postayı postal-mime ile çözer, alıcı adresin posta kutusunu bulur, ekleri depolamaya yükler ve kaydı yazar. Adres yoksa, izni kaldırılmışsa ya da kota dolduysa posta gönderene açıklamayla geri çevrilir; kayıt başarısız olursa gönderen sunucu yeniden dener, posta kaybolmaz.

  2. 02

    Herkes yalnız kendi postası

    Postgres satır düzeyi güvenliği (RLS) her postayı posta kutusunun sahibine bağlar; yönetici dahil kimse başkasının postasını okuyamaz. Adres alma bir veritabanı fonksiyonunda: davet izni, biçim, kişi başı tek adres ve taklit edilebilecek adlar (destek, info…) orada denetlenir.

  3. 03

    Konuşmalar veritabanında

    Her posta kayıt anında bir tetikleyiciyle konuşmasına bağlanır: önce In-Reply-To ve References başlıkları, bulunamazsa son 60 günde aynı konu ve aynı karşı taraf. Liste, arama ve toplu taşıma SQL fonksiyonlarıyla tek sorguda yapılır.

  4. 04

    Yabancı HTML güvenle

    HTML posta betik çalıştıramayan bir çerçevede (sandbox) gösterilir; betik, yönlendirme ve gömülü nesneler ayrıca temizlenir. Uzak görseller, gönderen okunduğunu öğrenemesin diye kullanıcı isteyene kadar yüklenmez. Kendi rengi olmayan sade postalar temaya uyar.

  5. 05

    Anlık ve kurulabilir

    Yeni posta Supabase Realtime ile sayfaya anında düşer; Worker kaydı yazınca Web Push (VAPID) bildirimi gider, dokununca konuşma açılır. Gönderim Resend ile; alan adı SPF, DKIM ve DMARC ile doğrulandı. Worker, kodu değişince testlerden sonra GitHub Actions ile kendiliğinden yayınlanır.

Zorlu an

Kendi postamıza gelen yanıtı bulmak

Gönderim servisi kendi Message-ID’sini ürettiği için, bizim gönderdiğimiz postaya gelen yanıt başlıklardan konuşmaya bağlanamıyordu. Konu (Re:/Fwd: ekleri atılarak) ve karşı taraf eşleşmesi ikinci yol olarak eklendi; eşleşme yalnız aynı posta kutusunda ve son 60 günde aranır, böylece aynı konulu farklı kişilerin postaları karışmaz.

Kalite

API uçları ve posta dönüşümü Vitest ile, arayüz (kaydırarak silme, çoklu seçim, gönderimi geri alma, adres seçme) Playwright ile telefonda ve masaüstünde test edilir.