Mail sunucusu yönetiminde en kritik görevlerden biri, e-posta kuyruğunun sağlıklı çalışmasını sağlamaktır. Exim kullanan bir sistemde kuyruk yönetimini ihmal ettiğinizde, fark etmeden binlerce takılı mesajla karşı karşıya kalabilirsiniz. Bu durum hem performansı etkiler hem de kullanıcı şikayetlerine yol açar. Bu yazıda Exim kuyruğunu etkin şekilde nasıl yöneteceğinizi ve izleyeceğinizi, gerçek dünya senaryolarıyla birlikte ele alacağız.
Exim Kuyruk Yapısını Anlamak
Exim, e-postaları göndermeden önce spool dizininde saklar. Varsayılan olarak bu dizin /var/spool/exim4/ (Debian/Ubuntu) veya /var/spool/exim/ (CentOS/RHEL) altındadır. Her mesaj iki dosyayla temsil edilir: -H uzantılı header dosyası ve -D uzantılı data dosyası.
Kuyruk yapısını anlamak için önce mevcut durumu görmeniz gerekir:
# Kuyruktaki toplam mesaj sayısını göster
exim -bpc
# Kuyruk listesini detaylı göster
exim -bp
# Daha okunabilir formatta kuyruk özeti
exim -bpr | head -50
exim -bp komutu size her mesajın ID’sini, boyutunu, gönderim zamanını, gönderen adresini ve alıcıları gösterir. Onlarca değil binlerce mesajınız varsa bu çıktıyı grep ile filtrelemek kaçınılmaz olur.
Kuyruk Dosyalarının Fiziksel Konumu
Exim, yüksek hacimli sistemlerde dosyaları hash alt dizinlerine dağıtır. split_spool_directory ayarı aktifse mesajlar mesaj ID’sinin ilk karakterine göre input/ altındaki alt dizinlere yazılır.
# Spool dizinindeki dosya sayısını kontrol et
ls /var/spool/exim4/input/ | wc -l
# Hash tabanlı alt dizin yapısını incele
ls -la /var/spool/exim4/input/
# Belirli bir mesajın header dosyasını oku
cat /var/spool/exim4/input/MESSAGEID-H
Header dosyasını okuduğunuzda mesajın nereden geldiğini, hangi alıcılara gittiğini ve neden takıldığını anlayabilirsiniz. Özellikle “frozen” (dondurulmuş) mesajlar için bu manuel inceleme oldukça değerlidir.
Temel Kuyruk Komutları
Mesaj Durumu ve Detayları
# Belirli bir mesajın detaylarını göster
exim -Mvh MESSAGEID
# Mesajın gövdesini (body) göster
exim -Mvb MESSAGEID
# Mesajın tüm logunu göster
exim -Mvl MESSAGEID
# Mesajın teslim geçmişini göster
exim -Mar MESSAGEID
Günlük operasyonlarda en çok kullandığım komut exim -Mvh ve exim -Mvl kombinasyonudur. Bir mesaj neden gitmiyor sorusunun cevabı çoğunlukla bu iki komutun çıktısında saklıdır.
Kuyruğu Tetiklemek ve Yeniden Denemek
Exim normalde belirli aralıklarla kuyrukta bekleyen mesajları denemeye devam eder. Ama bazen bunu manuel tetiklemeniz gerekir:
# Tüm kuyruğu hemen işlemeye zorla
exim -qf
# Tüm kuyruğu zorla işle (frozen mesajlar dahil)
exim -qff
# Belirli bir mesajı hemen göndermeyi dene
exim -M MESSAGEID
# Belirli bir mesajı frozen durumundan çıkar ve yeniden dene
exim -Mt MESSAGEID
-qff komutunu dikkatli kullanın. Binlerce frozen mesajınız varsa ve bunların büyük kısmı geçersiz adreslere gidiyorsa, bu komutu çalıştırmak sunucunuzu anlık olarak bunaltabilir.
Kuyruk Filtreleme ve Analiz
Gerçek bir prodüksiyon ortamında kuyruğu düz listelemek yetmez. Neyin neden takılı kaldığını anlamak için filtreleme yapmanız şarttır.
# Sadece frozen mesajları listele
exim -bp | grep '<' | grep -v '<>' | awk '{print $3}' | head -20
# Belirli bir alıcı domaine giden mesajları bul
exim -bp | grep "example.com"
# Belirli bir gönderenden gelen mesajları bul
exim -bp | grep "[email protected]"
# Kuyruktaki mesajları boyuta göre sırala
exim -bp | sort -k1 -h | tail -20
Daha kapsamlı analiz için exiqgrep aracı vazgeçilmezdir. Çoğu sistemde Exim ile birlikte gelir:
# Frozen mesajları listele
exiqgrep -z
# Belirli bir gönderenden gelen mesajları bul
exiqgrep -f "[email protected]"
# Belirli bir alıcıya giden mesajları bul
exiqgrep -r "[email protected]"
# 1 saatten uzun süredir kuyrukta olan mesajları bul
exiqgrep -o 3600
# Sonuçları sadece mesaj ID olarak döndür (işlem için kullanışlı)
exiqgrep -z -i
exiqgrep -i parametresi özellikle çok kullanışlı. Sadece ID’leri döndürdüğü için bu çıktıyı doğrudan başka komutlara besleyebilirsiniz.
Toplu Mesaj İşlemleri
Frozen Mesajları Temizlemek
Frozen mesajlar, Exim’in birkaç deneme sonrasında teslim edemediği ve “dondurduğu” iletilerdir. Bunların büyük kısmı genellikle spam, geçersiz adresler veya ulaşılamaz sunucular nedeniyle oluşur.
# Tüm frozen mesajları sil
exiqgrep -z -i | xargs exim -Mrm
# 24 saatten eski frozen mesajları sil
exiqgrep -z -o 86400 -i | xargs exim -Mrm
# Belirli bir alıcı domainine giden frozen mesajları sil
exiqgrep -z -r "@spammedfrom.com" -i | xargs exim -Mrm
Silme işlemi yapmadan önce kaç mesaj etkileneceğini görmek için şu yaklaşımı kullanın:
# Önce say
exiqgrep -z -o 86400 -i | wc -l
# Onayladıktan sonra sil
exiqgrep -z -o 86400 -i | xargs exim -Mrm
Belirli Gönderenden Gelen Mesajları Silmek
Bir spam kampanyası veya hatalı uygulama binlerce mesaj kuyrukladıysa hızlıca temizlemeniz gerekir:
# Belirli bir gönderenden gelen tüm mesajları sil
exiqgrep -f "[email protected]" -i | xargs exim -Mrm
# Boş gönderici adresli (bounce) mesajları listele
exiqgrep -f "^$" -i
# Belirli bir IP üzerinden gelen mesajları bul ve sil
exim -bp | grep "10.0.0.5" | awk '{print $3}' | xargs exim -Mrm
Log İzleme ve Analiz
Exim logları /var/log/exim4/ veya /var/log/exim/ altında bulunur. Temel log dosyaları şunlardır:
- mainlog: Ana işlem logu, tüm teslim girişimleri burada
- rejectlog: Reddedilen mesajların logu
- paniclog: Kritik hatalar, boş olması idealdir
- processlog: Exim süreç bilgileri
# Gerçek zamanlı log takibi
tail -f /var/log/exim4/mainlog
# Son 1 saatteki hataları filtrele
grep "$(date -d '1 hour ago' '+%Y-%m-%d %H:')" /var/log/exim4/mainlog | grep -i "error|failed|rejected"
# Belirli bir mesaj ID'sinin tüm logunu çek
grep "MESSAGEID" /var/log/exim4/mainlog
# Başarısız teslim istatistikleri
grep "** " /var/log/exim4/mainlog | tail -50
Gerçek Zamanlı İzleme için eximstats
Exim’in kendi eximstats aracı log dosyasından istatistik üretir:
# Günlük istatistik raporu
eximstats /var/log/exim4/mainlog
# Son saatin istatistiklerini göster (grep ile filtrele)
grep "$(date '+%Y-%m-%d %H:')" /var/log/exim4/mainlog | eximstats
# Sadece özet istatistikler
eximstats -ne -nt /var/log/exim4/mainlog
İzleme Senaryoları ve Alerting
Senaryo 1: Kuyruk Boyutu Monitörü
Prodüksiyon ortamlarında kuyruk boyutunu sürekli izlemek kritik önem taşır. İşte basit ama etkili bir izleme scripti:
#!/bin/bash
# /usr/local/bin/check_exim_queue.sh
THRESHOLD=500
ALERT_EMAIL="[email protected]"
QUEUE_SIZE=$(exim -bpc)
if [ "$QUEUE_SIZE" -gt "$THRESHOLD" ]; then
echo "UYARI: Exim kuyruğunda $QUEUE_SIZE mesaj var (eşik: $THRESHOLD)" |
mail -s "EXIM KUYRUK UYARISI - $(hostname)" "$ALERT_EMAIL"
# Detaylı rapor ekle
echo "=== Frozen Mesajlar ===" >> /tmp/exim_alert_$$.txt
exiqgrep -z | head -20 >> /tmp/exim_alert_$$.txt
echo "=== En Fazla Mesaj Biriken Domainler ===" >> /tmp/exim_alert_$$.txt
exim -bp | grep -oP '@K[^ ]+' | sort | uniq -c | sort -rn | head -10 >> /tmp/exim_alert_$$.txt
mail -s "EXIM DETAY - $(hostname)" "$ALERT_EMAIL" < /tmp/exim_alert_$$.txt
rm -f /tmp/exim_alert_$$.txt
fi
echo "$(date): Kuyruk boyutu: $QUEUE_SIZE" >> /var/log/exim_queue_monitor.log
Bu scripti cron’a ekleyin:
# Her 5 dakikada bir çalıştır
*/5 * * * * /usr/local/bin/check_exim_queue.sh
Senaryo 2: Otomatik Frozen Mesaj Temizliği
Her gece çalışan ve eski frozen mesajları temizleyen bir script:
#!/bin/bash
# /usr/local/bin/cleanup_frozen_exim.sh
LOG="/var/log/exim_cleanup.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
# 6 saatten eski frozen mesajları say
OLD_FROZEN=$(exiqgrep -z -o 21600 -i | wc -l)
echo "$DATE - Temizlenecek frozen mesaj sayısı: $OLD_FROZEN" >> "$LOG"
if [ "$OLD_FROZEN" -gt "0" ]; then
exiqgrep -z -o 21600 -i | xargs exim -Mrm
echo "$DATE - $OLD_FROZEN frozen mesaj silindi" >> "$LOG"
else
echo "$DATE - Temizlenecek mesaj yok" >> "$LOG"
fi
# Toplam kuyruk durumunu logla
TOTAL=$(exim -bpc)
FROZEN=$(exiqgrep -z | wc -l)
echo "$DATE - Toplam kuyruk: $TOTAL, Frozen: $FROZEN" >> "$LOG"
Senaryo 3: Domain Bazlı Kuyruk Analizi
Hangi domainin en fazla sorun çıkardığını tespit etmek için:
#!/bin/bash
# Domain bazlı kuyruk analizi
echo "=== Kuyruktaki Mesajların Domain Dağılımı ==="
exim -bp | grep -oP '<[^@]+@K[^>]+' | sort | uniq -c | sort -rn | head -20
echo ""
echo "=== Frozen Mesajların Domain Dağılımı ==="
exiqgrep -z | grep -oP '<[^@]+@K[^>]+' | sort | uniq -c | sort -rn | head -20
echo ""
echo "=== Son 100 Başarısız Teslim ==="
grep "** " /var/log/exim4/mainlog | tail -100 | grep -oP '@K[^ ]+' | sort | uniq -c | sort -rn | head -20
Performans Optimizasyonu için Kuyruk Ayarları
Exim’in /etc/exim4/exim4.conf.template veya /etc/exim/exim.conf dosyasındaki kuyruk ile ilgili önemli ayarlar:
- queue_run_max: Aynı anda çalışacak maksimum kuyruk işleyici sayısı
- queue_interval: Kuyruk kontrol aralığı (saniye)
- retry_interval_max: Yeniden deneme aralığının maksimum değeri
- message_size_limit: Maksimum mesaj boyutu
- queue_smtp_domains: Hangi domainler için kuyruk kullanılacağı
# Mevcut Exim konfigürasyonunu test et
exim -bV
# Konfigürasyon sözdizimini kontrol et
exim -C /etc/exim4/exim4.conf -bV
# Exim'in hangi ayarlarla çalıştığını göster
exim -bP queue_run_max
exim -bP retry_interval_max
Panik ve Hata Durumlarında Müdahale
Kuyruğun Tamamen Dolması
Eğer kuyruk çok büyüdüyse ve sistem yavaşlamaya başladıysa, önce durumu anlayın:
# Hızlı durum özeti
echo "Toplam kuyruk: $(exim -bpc)"
echo "Frozen: $(exiqgrep -z | wc -l)"
echo "1 saatten eski: $(exiqgrep -o 3600 | wc -l)"
echo "Disk kullanımı:"
du -sh /var/spool/exim4/
# En fazla mesaj gönderen IP'leri bul (spam/abuse tespiti)
grep "<=.*[" /var/log/exim4/mainlog |
grep "$(date '+%Y-%m-%d')" |
grep -oP '[(d+.){3}d+]' |
sort | uniq -c | sort -rn | head -10
Eğer belirli bir IP veya hesap spam gönderiyorsa:
# Belirli bir IP'den gelen tüm kuyruk mesajlarını sil
exim -bp | grep "[192.168.1.100]" | awk '{print $3}' | xargs exim -Mrm
# Exim'i durdurmadan önce queue runner'ı durdur
kill $(cat /var/run/exim4/exim.pid)
# veya
systemctl stop exim4
# Spool dizinini temizle (DİKKAT: tüm kuyruk silinir!)
rm -f /var/spool/exim4/input/*
# Exim'i yeniden başlat
systemctl start exim4
Paniclog Kontrolü
paniclog dosyası normalde boş olmalıdır. İçinde bir şey varsa ciddi bir sorun var demektir:
# Paniclog kontrolü
if [ -s /var/log/exim4/paniclog ]; then
echo "DİKKAT: Paniclog boş değil!"
tail -20 /var/log/exim4/paniclog
fi
# Paniclog'u inceledikten sonra temizle
> /var/log/exim4/paniclog
Exim Kuyruğu için Faydalı Aliases
Günlük kullanımı kolaylaştırmak için bu alias’ları .bashrc veya /etc/profile.d/exim-aliases.sh dosyanıza ekleyebilirsiniz:
# Exim yönetim aliasları
alias eq='exim -bp'
alias eqc='exim -bpc'
alias eqf='exiqgrep -z'
alias eqfc='exiqgrep -z | wc -l'
alias eqrun='exim -qff'
alias eqlog='tail -f /var/log/exim4/mainlog'
alias eqclean='exiqgrep -z -o 86400 -i | xargs exim -Mrm'
# Hızlı kuyruk özeti fonksiyonu
eqstatus() {
echo "Toplam mesaj: $(exim -bpc)"
echo "Frozen mesaj: $(exiqgrep -z | wc -l)"
echo "Disk (spool): $(du -sh /var/spool/exim4/ 2>/dev/null | cut -f1)"
}
Zabbix veya Nagios ile Entegrasyon
Kurumsal ortamlarda Exim kuyruğunu merkezi izleme sistemine entegre etmek çok daha sağlıklı sonuçlar verir:
#!/bin/bash
# Nagios/Zabbix için Exim kuyruk check scripti
# /usr/lib/nagios/plugins/check_exim_queue
WARNING=${1:-100}
CRITICAL=${2:-500}
QUEUE=$(exim -bpc 2>/dev/null)
if [ $? -ne 0 ]; then
echo "UNKNOWN: Exim'e erişilemiyor"
exit 3
fi
if [ "$QUEUE" -ge "$CRITICAL" ]; then
echo "CRITICAL: Exim kuyruğu $QUEUE mesaj içeriyor"
exit 2
elif [ "$QUEUE" -ge "$WARNING" ]; then
echo "WARNING: Exim kuyruğu $QUEUE mesaj içeriyor"
exit 1
else
echo "OK: Exim kuyruğu $QUEUE mesaj içeriyor"
exit 0
fi
Sonuç
Exim kuyruk yönetimi, mail sunucusu yöneticiliğinin belki de en pratik ve sürekli gereken becerisidir. exim -bp, exiqgrep ve exim -Mrm üçlüsü günlük operasyonlarınızın merkezinde yer almalı. Frozen mesajları düzenli temizlemek, kuyruk boyutunu izlemek ve anormal büyümelerde hızlı müdahale edebilmek sistem sağlığı açısından kritik önemdedir.
Özellikle paylaşımlı hosting veya yüksek hacimli mail ortamlarında izleme scriptlerini ihmal etmeyin. Bir sabah uyandığınızda 50.000 mesajlık bir kuyrukla karşılaşmak yerine, gece uyarı alıp 5 dakikada sorunu çözmek her zaman daha iyidir. Yukarıdaki scriptleri kendi ortamınıza göre uyarlayın, threshold değerlerini sisteminizin normal davranışına göre ayarlayın ve cron görevlerinizi mutlaka test edin. Mail altyapısı sessiz çalıştığında fark edilmez, sadece bozulduğunda herkesin gündemine girer.