Exim Kuyruğu Yönetimi ve İzleme

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.

Yorum yapın