Bir mail sunucusu kurma işine giriştiğinde karşına neredeyse otomatik olarak Postfix ya da Exim çıkar. İkisi de olgun, ikisi de sağlam; ama ikisi de C ile yazılmış, kendi yapılandırma diline sahip ve iş akışına özel bir mantık eklemek istediğinde seni ya harici bir milter yazmaya ya da bir sürü transport_maps numarasına zorlar. Haraka mail sunucusu tam da bu noktada farklılaşıyor: Node.js üzerinde çalışan, olay tabanlı (event-driven) bir SMTP sunucusu ve SMTP oturumunun her adımını bir JavaScript kancasına (hook) bağlamana izin veriyor. "Bu adrese gelen postayı reddetmeden önce şu API'yi sorgula" gibi bir kural, Haraka'da otuz satırlık bir eklenti demek.
Bu rehberde Haraka'yı sıfırdan kuracağız, yapılandırma dizininin nasıl çalıştığını satır satır göreceğiz, kendi eklentini nasıl yazacağını bir örnekle anlatacağım ve giden posta (outbound) tarafını üretime hazır hale getireceğiz. Sonunda da en önemli soruyu cevaplayacağız: hangi durumda Haraka doğru seçim, hangi durumda hâlâ Postfix'te kalman gerekir. Konuya girmeden önce şunu netleştireyim; Haraka bir MTA'dır, yani posta alır ve gönderir. Kullanıcıların posta kutusuna IMAP ile bağlanmasını sağlamaz, bunun için yanına Dovecot gibi bir teslimat/erişim katmanı koyman gerekir.
Haraka'yı Diğer MTA'lardan Ayıran Ne#
Haraka'nın mimarisi tek cümleyle özetlenebilir: SMTP protokolünün her aşaması bir kanca, her kanca da bir eklenti zinciri. İstemci bağlandığında connect, HELO gönderdiğinde helo, gönderici adresini bildirdiğinde mail, alıcıyı bildirdiğinde rcpt, gövde bittiğinde data_post kancaları tetiklenir. Her kancaya kayıtlı eklentiler sırayla çalışır ve zinciri next(DENY, "sebep") diyerek istediğin yerde kesebilirsin. Bu, "spam kontrolünü teslimattan sonra yap" yerine "daha alıcı adresini görür görmez reddet" demeni sağlar; sunucuya binen yük açısından aradaki fark ciddidir.
İkinci belirgin fark eşzamanlılık modeli. Postfix her bağlantı için ayrı bir işlem (process) çatallar; Haraka ise Node.js'in olay döngüsünü kullanır ve nodes ayarıyla CPU çekirdeği başına bir işçi süreci açar. Yani binlerce açık ama çoğu boşta bekleyen SMTP bağlantısını taşımak Haraka için ucuzdur — özellikle yavaş istemcilerin ya da uzun süren TLS el sıkışmalarının olduğu ortamlarda. Buna karşılık tek bir mesajın gövdesini işlerken bloklayıcı, CPU yoğun bir iş yaparsan (örneğin senkron bir imza hesabı) o işçinin tüm bağlantılarını durdurursun. Node.js'in klasik kuralı burada da geçerli: olay döngüsünü asla bloklama.
| Özellik | Haraka | Postfix |
|---|---|---|
| Dil / çalışma zamanı | JavaScript, Node.js | C, çoklu süreç |
| Genişletme yöntemi | Eklenti (hook) API'si | milter, transport, harici script |
| Yapılandırma | config/ altında düz dosyalar | main.cf + master.cf |
| Yerleşik posta kutusu teslimi | Yok (LMTP/forward ile) | local, virtual, LMTP |
| Tipik kullanım | Uygulama odaklı SMTP kapısı | Genel amaçlı MTA |
| Öğrenme eşiği | JavaScript biliyorsan düşük | Kendi diline alışman gerek |
Kurulum: Node.js'ten Çalışır Bir SMTP'ye#
Haraka npm üzerinden dağıtılır, yani önce güncel bir Node.js LTS sürümüne ihtiyacın var. Sunucuya dağıtımın paket yöneticisiyle değil, NodeSource deposu ya da nvm ile kurmanı öneririm; dağıtımların depolarındaki Node sürümü çoğu zaman geride kalır. Node hazır olduktan sonra kurulum üç komut:
# Haraka'yı global olarak kur
npm install -g Haraka
# Yapılandırma dizinini oluştur (-i = install)
haraka -i /etc/haraka
# Kurulan sürümü doğrula
haraka -v
haraka -i komutu sana hazır bir iskelet bırakır: /etc/haraka/config/ altında onlarca örnek yapılandırma dosyası, /etc/haraka/plugins/ altında kendi eklentilerin için boş bir dizin. Sunucuyu ön planda çalıştırıp ne olduğunu görmek için:
# Ön planda, ayrıntılı log ile başlat
haraka -c /etc/haraka
# Başka bir terminalden bağlanıp test et
telnet 127.0.0.1 25
Üretimde elbette bunu bir servis olarak yönetmek istersin. systemd birim dosyası basittir; önemli olan Haraka'yı root olarak başlatıp smtp.ini içindeki user/group ayarıyla yetki düşürmesine izin vermendir, çünkü 25 numaralı portu ancak ayrıcalıklı bir süreç dinleyebilir:
# /etc/systemd/system/haraka.service
[Unit]
Description=Haraka SMTP Server
After=network-online.target
[Service]
Type=simple
ExecStart=/usr/bin/haraka -c /etc/haraka
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Ardından systemctl daemon-reload && systemctl enable --now haraka ile devreye al. Servis ayağa kalkmıyorsa ilk bakacağın yer journalctl -u haraka -n 100 çıktısıdır; Haraka başlangıçta yüklenemeyen bir eklenti bulursa açıkça o eklentinin adını söyleyerek durur.
Yapılandırma Dosyaları ve Dizin Düzeni#
Haraka'da tek bir dev yapılandırma dosyası yoktur; her ayarın kendi küçük dosyası vardır ve bu dosyalar config/ altında durur. Alışması ilk başta tuhaf gelir ama sürüm kontrolüne alındığında çok temiz bir yapı ortaya çıkar. En kritik dört dosya şunlar:
config/smtp.ini— dinlenecek adres/port, işçi sayısı, yetki düşürülecek kullanıcı.config/plugins— hangi eklentilerin, hangi sırayla çalışacağı. Sıra önemlidir, satır satır okunur.config/host_list— bu sunucunun kendi posta kabul ettiği alan adları.config/me— sunucunun SMTP diyaloğunda kendini tanıttığı isim, yani banner'daki ad.
Tipik bir smtp.ini şöyle görünür:
; /etc/haraka/config/smtp.ini
listen=0.0.0.0:25,0.0.0.0:587
; Çekirdek sayısı kadar işçi süreç aç
nodes=cpus
; 25 portunu bağladıktan sonra bu kullanıcıya düş
user=haraka
group=haraka
; Mesaj başına azami boyut (bayt) - 25 MB
[headers]
max_lines=1000
config/plugins dosyası ise Haraka'nın kalbidir. Yorum satırları # ile başlar ve zincir yukarıdan aşağı çalışır:
# Bağlantı ve kimlik kontrolleri (ucuz olanlar en üstte)
access
dnsbl
helo.checks
mail_from.is_resolvable
rcpt_to.in_host_list
# Kimlik doğrulama ve TLS
tls
auth/auth_flat_file
# İçerik katmanı
data.headers
spf
dkim_verify
rspamd
# Kuyruk: nereye teslim edilecek
queue/smtp_forward
Buradaki sıralama tesadüfi değil. Ucuz kontroller (IP kara listesi, HELO biçimi, alan adı bize ait mi) en üstte durur ki spam mesajın gövdesi ağa hiç yüklenmesin. rcpt_to.in_host_list satırını atlarsan sunucun açık aktarıcı (open relay) olur; bu, dakikalar içinde kara listelere düşmen anlamına gelir. TLS ayarlarını config/tls.ini üzerinden sertifika yollarını vererek açarsın; sertifikayı Let's Encrypt ile alıyorsan yenileme kancasına systemctl reload haraka eklemeyi unutma.
Eklenti Mimarisi ve Kendi Eklentini Yazmak#
Haraka'yı seçmenin asıl gerekçesi budur. Bir eklenti, plugins/ altında tek bir .js dosyasıdır; register() içinde hangi kancaya bağlanacağını söyler, kanca fonksiyonu da next() çağırarak kararını bildirir. Aşağıda, alıcı adresine bakıp kendi uygulamanın API'sinden onay alan basit bir eklenti var:
// /etc/haraka/plugins/rcpt_api_check.js
exports.register = function () {
// rcpt kancasına bağlan: alıcı adresi bildirildiğinde çalışır
this.register_hook('rcpt', 'check_recipient');
};
exports.check_recipient = function (next, connection, params) {
const rcpt = params[0].address(); // [email protected]
const plugin = this;
fetch('https://api.firmaniz.com/mailbox/' + encodeURIComponent(rcpt))
.then((res) => {
if (res.status === 200) return next(OK); // kabul et
if (res.status === 404) {
// Kalıcı ret: gönderen bir daha denemez
return next(DENY, 'Boyle bir posta kutusu yok');
}
// API geçici olarak cevap vermiyorsa 4xx ver, kaybetme
return next(DENYSOFT, 'Gecici dogrulama hatasi, tekrar deneyin');
})
.catch((err) => {
plugin.logerror('API hatasi: ' + err.message);
return next(DENYSOFT, 'Gecici dogrulama hatasi');
});
};
Eklentiyi etkinleştirmek için tek yapman gereken adını config/plugins dosyasına, queue/ satırından önce eklemek. Burada dikkat etmen gereken iki şey var. Birincisi DENY ile DENYSOFT ayrımı: DENY kalıcı bir 5xx üretir ve gönderen tarafta bounce oluşur, DENYSOFT ise 4xx verir ve karşı taraf sonra tekrar dener. Doğrulama servisin geçici olarak ulaşılamıyorsa kesinlikle DENYSOFT kullan, yoksa API'nin beş dakikalık kesintisi yüzünden gerçek postaları kalıcı olarak reddedersin. İkincisi ise asenkron kod: kanca fonksiyonundan next() çağrılmadan çıkarsan bağlantı zaman aşımına kadar asılı kalır. Her kod yolunun bir next() ile bittiğinden emin ol.
Hazır eklenti listesini haraka -h plugins ile görebilir, tek bir eklentinin belgesini haraka -h rcpt_to.in_host_list gibi okuyabilirsin. Spam tarafında rspamd eklentisi Haraka'nın en çok kullanılan bileşenidir ve mesajı Rspamd'e gönderip dönen skora göre kabul/ret/karantina kararı verir; kendi kurallarını sıfırdan yazmak yerine bu entegrasyonu kullanmanı tavsiye ederim.
Giden Posta ve Kuyruk Davranışı#
Haraka'nın gelen posta tarafı kadar iyi bilinmeyen ama en çok kullanılan yanı giden postadır. relay eklentisi ve config/relay_acl_allow dosyasıyla hangi ağların bu sunucu üzerinden posta gönderebileceğini belirlersin; uygulama sunucularının IP'lerini buraya yazarsın. Kuyruk davranışı config/outbound.ini ile ayarlanır:
; /etc/haraka/config/outbound.ini
; Yeniden deneme aralıkları giderek uzar
disabled=false
; Kuyrukta bekleyen bir mesaj için azami süre (saniye) - 3 gün
maximum_backoff=3600
; Aynı anda kaç giden bağlantı açılsın
concurrency_max=50
; Her alıcı alan adı için ayrı kuyruk tut
enable_tls=true
Kuyruğu incelemek için Haraka'nın kendi araçları vardır; kuyruk dosyaları queue/ dizininde durur ve haraka -c /etc/haraka --qlist benzeri komutlarla listelenebilir. Ancak pratikte kuyruğu izlemenin en sağlıklı yolu dosya sayısını ve en eski dosyanın yaşını bir izleme sistemine bağlamaktır — kuyruğun sessizce şişmesi, mail altyapısında bir şeylerin bozulduğunun en erken sinyalidir. Bu konuyu ayrıntılı olarak mail kuyruğu birikti yazısında ele aldım; teşhis komutları farklı olsa da mantık her MTA'da aynıdır.
Giden postada asıl belirleyici olan sunucunun kendisi değil, DNS tarafındaki itibar kayıtlarındır. Haraka ne kadar hızlı olursa olsun, PTR kaydın yoksa ya da SPF'in yanlışsa Gmail seni eşiğinden içeri almaz. dkim_sign eklentisini açıp config/dkim_sign.ini içinde seçici (selector) ve özel anahtar yolunu tanımlamayı ilk günden yap. Gerekli tüm kayıtların listesi için mail sunucusu DNS kayıtları yazısına bakabilirsin.
Haraka mı Postfix mi: Ne Zaman Hangisi#
Dürüst cevap şu: kurumsal posta kutuları barındıracaksan, yani kullanıcıların IMAP ile bağlandığı klasik bir mail sunucusu istiyorsan Postfix + Dovecot ikilisi hâlâ daha az sürprizli bir yoldur. Belgelendirmesi geniştir, her sorunun cevabı aranmıştır, panel entegrasyonları hazırdır. Haraka'nın parladığı yer ise SMTP'nin programlanabilir olması gereken senaryolardır: uygulamanın gönderdiği işlemsel postaları imzalayıp yönlendiren bir çıkış kapısı, gelen postayı bir API'ye çeviren bir servis, alıcı doğrulamasını kendi veri tabanından anlık yapan bir ön kapı.
| Senaryo | Önerilen | Gerekçe |
|---|---|---|
| Kullanıcı posta kutuları, IMAP erişimi | Postfix + Dovecot | Yerleşik teslimat ve olgun ekosistem |
| Uygulamadan çıkan işlemsel posta kapısı | Haraka | Kolay imzalama, esnek yönlendirme |
| Gelen postayı webhook'a çevirme | Haraka | data_post kancası doğrudan uygun |
| Panel (cPanel/Plesk) ile yönetim | Postfix / Exim | Panel zaten onu yönetiyor |
| Yüksek eşzamanlı, uzun süren bağlantılar | Haraka | Olay tabanlı model avantajlı |
Karma kurulum da tamamen geçerli bir tercihtir: gelen postayı Postfix alsın, uygulamanın gönderdiklerini Haraka üstlensin. İkisini aynı makinede çalıştıracaksan portları ayırmayı unutma; ikisi birden 25'i dinleyemez.
Üretimde Sık Yapılan Hatalar#
En sık gördüğüm hata, rcpt_to.in_host_list ya da relay yapılandırmasının eksik bırakılıp sunucunun açık aktarıcı olarak internete açılmasıdır. Kurulumdan sonra mutlaka dışarıdan bir test yap: kendi alan adında olmayan bir alıcıya, kimlik doğrulaması yapmadan mesaj göndermeyi dene. Sunucu bunu kabul ediyorsa yapılandırman hatalıdır ve saatler içinde spam trafiğinin taşıyıcısı olursun.
İkinci klasik hata, eklenti sırasını önemsememektir. queue/smtp_forward satırını listenin ortasına koyarsan, altındaki kontrol eklentileri hiç çalışmadan mesaj kuyruğa girer. Kuyruk eklentisi daima en sonda durmalıdır. Üçüncü hata, olay döngüsünü bloklamaktır: bir kancada fs.readFileSync ya da senkron kripto işlemi çağırmak, o işçi sürecindeki tüm bağlantıları dondurur; her zaman asenkron API'leri kullan.
Dördüncü tuzak, log seviyesini üretimde LOGDEBUG bırakmaktır. Haraka çok konuşkandır; debug seviyesinde bir gün içinde gigabaytlarca log üretip diski doldurabilir. config/loglevel dosyasında LOGINFO yeterlidir ve logrotate kuralını ilk günden yaz. Beşinci ve en can sıkıcı olan ise 25 numaralı portun kapalı olmasıdır; bu Haraka ile ilgili değil, sağlayıcı politikasıyla ilgili bir konudur ve ayrıntısını SMTP 25 portu kapalı yazısında bulabilirsin. Kaynak planlaması yapıyorsan mail sunucusu kaynak gereksinimleri yazısı da doğrudan işine yarar.
Sıkça Sorulan Sorular#
Haraka ücretsiz mi, lisansı ne#
Haraka açık kaynaklıdır ve MIT lisansıyla dağıtılır; ticari kullanım dahil hiçbir lisans ücreti ödemezsin. Kaynak kodu GitHub üzerinde açıktır, eklentileri npm üzerinden gelir. Maliyet kalemin yalnızca üzerinde çalıştıracağın sunucu ve harcayacağın yönetim zamanı olur.
Haraka posta kutusu barındırabilir mi, IMAP desteği var mı#
Hayır, Haraka bir MTA'dır; posta alır, kabul eder ve teslim eder ama kullanıcıların bağlanacağı bir posta kutusu deposu ya da IMAP/POP3 sunucusu içermez. Klasik bir posta kutusu altyapısı istiyorsan Haraka'nın arkasına LMTP ile Dovecot koyman gerekir. queue/lmtp eklentisi tam olarak bunun içindir.
Haraka Postfix'ten daha mı hızlı#
Bağlantı sayısı yüksek ve bağlantılar uzun süre açık kalıyorsa Haraka'nın olay tabanlı modeli daha az bellek harcar. Ancak saf teslimat hızında ikisi arasında pratikte belirleyici bir fark yoktur; darboğaz genellikle disk, DNS çözümlemesi ya da spam taraması olur. Hız beklentisiyle değil, esneklik beklentisiyle Haraka'ya geçmek daha doğru bir gerekçedir.
Haraka için hangi Node.js sürümünü kullanmalıyım#
Güncel bir LTS sürümü kullan; ömrü dolmuş Node sürümleri hem güvenlik yaması almaz hem de Haraka'nın yeni sürümleriyle uyumsuzluk çıkarır. Sunucuya NodeSource deposu ya da nvm üzerinden kurup sürümü sabitlemeni, yükseltmeleri de önce bir test makinesinde denemeni öneririm. Node'u yükselttikten sonra Haraka'yı yeniden başlatmayı unutma.
Haraka'yı cPanel veya Plesk ile birlikte kullanabilir miyim#
Pratikte önerilmez. Bu paneller kendi MTA'sını (Exim ya da Postfix) yönetir; aynı makinede ikinci bir MTA'yı 25 portuna oturtmaya çalışmak çakışma üretir ve panel güncellemeleri yapılandırmanı ezebilir. Haraka'yı ayrı bir sunucuda, örneğin giden posta kapısı olarak konumlandırıp paneli ona yönlendirmek çok daha temiz bir kurgudur.
Haraka kurulumundan sonra gönderdiğim postalar spam'e düşüyor, ne yapmalıyım#
Sorun büyük ihtimalle sunucu yazılımında değil, itibar kayıtlarındadır. Sırasıyla şunları kontrol et: sunucunun IP'si için PTR kaydı var mı ve HELO adıyla eşleşiyor mu, SPF kaydında bu IP yetkili mi, dkim_sign eklentisi açık mı ve DNS'teki seçici kaydı doğru mu, DMARC politikan tanımlı mı. Bu dördü tamam değilse hiçbir MTA seni büyük sağlayıcıların gelen kutusuna sokamaz.
Kapanış#
Haraka'yı bir "Postfix alternatifi" olarak değil, SMTP'yi programlanabilir hale getiren bir araç olarak düşünmek en doğrusu. Aklında kalması gereken dört şey var: eklenti sırası yapılandırmanın kendisidir ve kuyruk eklentisi daima en sonda durur; kancalarda asla senkron iş yapma, olay döngüsünü bloklarsan tüm bağlantıları dondurursun; geçici hatalarda DENY değil DENYSOFT dön, yoksa gerçek postaları kalıcı olarak kaybedersin; ve kurulumdan sonra mutlaka açık aktarıcı testi yap. Bunlara PTR, SPF, DKIM üçlüsünü de eklersen elinde sağlam bir altyapı olur.
Kendi mail altyapını kurmak istiyor ama alt yapı tarafıyla uğraşmak istemiyorsan Clou.TR bu işin büyük kısmını üstlenebilir. Tam root erişimiyle Haraka kurmak için VDS ve sanal sunucu paketlerimize, hazır yapılandırılmış bir gönderim altyapısı için SMTP sunucu çözümümüze, kurulum ve bakımı bize bırakmak istersen sunucu yönetimi hizmetimize göz atabilirsin. Kurumsal posta kutuları için ise e-posta paketlerimiz doğrudan hazır bir çözüm sunuyor.