Dovecot Quota Aşımı: Kullanıcı Posta Kutusu Doldu

Sabah 9’da inbox’ına düşen “Mail gönderemiyorum, kutu dolu!” şikayetiyle başlayan gün, her mail sunucu yöneticisinin korkulu rüyasıdır. Dovecot quota sistemi doğru yapılandırıldığında hayat kurtarır, ama yanlış yönetildiğinde kullanıcıların canını yakar ve senin telefon/mail trafiğini patlatır. Bu yazıda Dovecot quota aşımı sorununu kökten çözmeyi, kullanıcıları nasıl bilgilendireceğini ve bir daha aynı sorunla karşılaşmamak için neler yapabileceğini ele alacağız.

Sorunun Anatomisi: Neler Oluyor?

Dovecot quota sistemi, kullanıcıların posta kutularının belirli bir boyutu aşmasını engeller. Kullanıcı kotasını doldurduğunda iki şey olur: yeni mail alamaz ve çoğu zaman mail gönderemez de. Gönderici tarafından ise genellikle şu hata mesajı görülür:

552 5.2.2 Mailbox full

ya da

452 4.2.2 Mailbox full (MTA limit exceeded)

Sorunun kaynağına inmeden önce şunu netleştirmek gerekiyor: Dovecot’ta quota kontrolü mail alımı sırasında LDA (Local Delivery Agent) veya LMTP üzerinden yapılır. Postfix gibi bir MTA kullanıyorsan, Postfix önce maili kabul edip sonra Dovecot’a iletmeye çalışır ve orada ret yer. Bu, gönderici tarafında “geçici hata” ya da “kalıcı hata” olarak görünebilir, quota policy servisini düzgün ayarlamazsan bounce üretir.

İlk Adım: Durumu Tespit Et

Şikayeti alan sysadmin olarak ilk yapman gereken şey, gerçekten quota dolumu mu yoksa başka bir şey mi olduğunu doğrulamak.

Dovecot’un Kendi Quota Aracıyla Kontrol

doveadm quota get -u [email protected]

Bu komut şöyle bir çıktı verir:

Quota name   Type    Value  Limit  %
user         STORAGE 524288 512000 102
user         MESSAGE 1500   -      0

Burada % sütunu 100’ü geçmişse kullanıcı kotasını aşmış demektir. STORAGE değeri KB cinsinden gelir. - işareti o limite kısıtlama uygulanmadığını gösterir.

Tüm Kullanıcıların Kotasını Listele

Hangi kullanıcıların dolmak üzere olduğunu görmek istiyorsan:

doveadm quota get -A 2>/dev/null | grep -v "^Quota" | awk '{if ($5 >= 80) print $0}'

Bu komut yüzde 80 ve üzeri dolulukta olan tüm kullanıcıları listeler. Bunu cron’a ekleyip haftalık rapor olarak alabilirsin, ama buna sonra geleceğiz.

Mail Log’larından Hata Teyidi

grep -i "quota" /var/log/mail.log | tail -50
grep -i "over quota" /var/log/mail.log | tail -20

Postfix kullanıyorsan şunu da kontrol et:

tail -100 /var/log/mail.log | grep -E "5\.2\.2|4\.2\.2|quota"

Logda şuna benzer satırlar göreceksin:

dovecot: lda([email protected]): msgid=<[email protected]>: save failed to INBOX: Quota exceeded (mailbox for user is full)
postfix/pipe[12345]: to=<[email protected]>, relay=dovecot, status=bounced (user is over quota)

Acil Çözüm: Kullanıcının Kutusunu Boşalt

Kullanıcı zaten kotayı aşmış ve acil mail alması gerekiyorsa, en hızlı çözüm geçici olarak kotayı artırmak ya da eski mailleri silmek.

Geçici Kota Artırımı

# Dovecot dict backend kullanıyorsan
doveadm quota recalc -u [email protected]

# Kullanıcıya geçici ek alan vermek için override
# /etc/dovecot/users dosyasını düzenle (passwd-file backend)
[email protected]:{plain}sifre::::/home/vmail/[email protected]::userdb_quota_rule=*:storage=1G

Eğer MySQL backend kullanıyorsan:

mysql -u mailuser -p maildb -e "UPDATE virtual_users SET quota='1073741824' WHERE email='[email protected]';"

Ardından Dovecot’u kota cache’ini yenilemesi için zorla:

doveadm quota recalc -u [email protected]

Eski Mailleri Komut Satırından Sil

Kullanıcı adına Trash veya Spam klasörünü temizleyebilirsin:

# 30 günden eski Trash maillerini sil
doveadm expunge -u [email protected] mailbox Trash savedbefore 30d

# Spam klasörünü tamamen temizle
doveadm expunge -u [email protected] mailbox Junk all

# 90 günden eski tüm mailleri sil (dikkatli kullan!)
doveadm expunge -u [email protected] mailbox INBOX savedbefore 90d

Dikkat: expunge işlemi geri alınamaz. Üretim ortamında kullanmadan önce mutlaka kullanıcıdan onay al ya da yedek al.

Silinen mailleri fiziksel olarak diskten kaldırmak için:

doveadm purge -u [email protected]

Dovecot Quota Yapılandırması: Doğru Kurulum

Şikayetleri azaltmak ve sistemi sağlıklı tutmak için quota yapılandırmasının doğru olması şart. Tipik bir Dovecot quota yapılandırması şöyle görünür:

/etc/dovecot/conf.d/90-quota.conf Temel Yapılandırma

plugin {
  quota = maildir:User quota
  quota_rule = *:storage=1G
  quota_rule2 = Trash:storage=100M
  quota_rule3 = Spam:ignore

  # Uyarı thresholdları
  quota_warning = storage=95%% quota-warning 95 %u
  quota_warning2 = storage=80%% quota-warning 80 %u
  quota_warning3 = storage=75%% quota-warning 75 %u
  quota_warning_ignore_save_errors = yes
}

service quota-warning {
  executable = script /usr/local/bin/quota-warning.sh
  unix_listener quota-warning {
    user = vmail
    group = vmail
    mode = 0660
  }
  user = dovecot
}

Buradaki önemli noktaları açıklayayım:

  • quota_rule: Varsayılan kota kuralı. * tüm klasörler için geçerli
  • quota_rule2: Trash için ayrı kural, bu alan ana kotanın dışında
  • quota_rule3: Spam klasörü kotaya dahil edilmez (ignore)
  • quota_warning: Belirli doluluk oranlarında script çalıştırır

Quota Uyarı Script’i

#!/bin/bash
# /usr/local/bin/quota-warning.sh

PERCENT=$1
USER=$2
cat << EOF | /usr/lib/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcement"
From: [email protected]
To: $USER
Subject: Posta Kutusu Doluluk Uyarisi - %$PERCENT
Content-Type: text/plain; charset=UTF-8

Sayin kullanici,

Posta kutunuz yuzde $PERCENT doluluk oranina ulasmistir.

Lutfen eski mailerinizi silin veya yonetici ile iletisime gecin.

Sistem Yoneticisi
EOF

Bu script’e çalıştırma izni ver:

chmod +x /usr/local/bin/quota-warning.sh

Postfix ile Quota Entegrasyonu

En yaygın senaryo Postfix + Dovecot kombinasyonudur. Postfix’in mail kabul etmeden önce quota kontrolü yapması için Dovecot’un quota policy servisini etkinleştirmen gerekir. Aksi hâlde Postfix maili kabul eder, Dovecot reddeder, bounce oluşur ve bu süreç kötü görünür.

Dovecot Quota Policy Servisi

# /etc/dovecot/conf.d/90-quota.conf dosyasına ekle
service quota-status {
  executable = quota-status -p postfix
  inet_listener {
    port = 12340
  }
  client_limit = 1
}

plugin {
  quota_status_success = DUNNO
  quota_status_nouser = DUNNO
  quota_status_overquota = "552 5.2.2 Mailbox full - posta kutusu dolu"
}

Postfix Tarafında Yapılandırma

# /etc/postfix/main.cf
smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination,
    check_policy_service inet:localhost:12340

Bu yapılandırmayla Postfix, gelen her mail için Dovecot’a “bu kullanıcının kotası dolu mu?” diye sorar. Dolu ise maili teslim almayı reddeder, gönderici anında hata mesajı alır.

Değişiklikleri uygulamak için:

systemctl reload dovecot
postfix reload

Kota Durumunu İzleme ve Raporlama

Reaktif değil, proaktif olmak istiyorsan izleme sistemleri kurman gerekiyor.

Günlük Quota Rapor Script’i

#!/bin/bash
# /usr/local/bin/quota-report.sh

ADMIN_MAIL="[email protected]"
HOSTNAME=$(hostname -f)
THRESHOLD=80

echo "Sunucu: $HOSTNAME - Quota Raporu - $(date '+%d.%m.%Y')"
echo "============================================"
echo "Yuzde $THRESHOLD ve uzeri doluluk:"
echo ""

doveadm quota get -A 2>/dev/null | 
  grep "STORAGE" | 
  while read name type value limit percent rest; do
    if [ "$percent" != "-" ] && [ "${percent%.*}" -ge "$THRESHOLD" ] 2>/dev/null; then
      user=$(echo "$name" | cut -d' ' -f1)
      echo "  Kullanici: $user | Kullanim: ${value}KB / ${limit}KB | Doluluk: %$percent"
    fi
  done | mail -s "[$HOSTNAME] Quota Raporu - $(date '+%d.%m.%Y')" "$ADMIN_MAIL"

Bu script’i cron’a ekle:

# Her sabah 8'de çalıştır
0 8 * * * root /usr/local/bin/quota-report.sh

Tek Bir Kullanıcının Detaylı Analizi

Bir kullanıcı neden bu kadar yer kaplıyor anlamak istiyorsan:

# Kullanıcının klasör bazında boyutlarını göster
doveadm mailbox status -u [email protected] "vsize messages" "*"

# En büyük mailleri bul (Maildir formatında)
find /var/mail/vhosts/ornek.com/kullanici/cur -type f -printf "%s %fn" | sort -rn | head -20

# Toplam kullanım
du -sh /var/mail/vhosts/ornek.com/kullanici/

Gerçek Dünya Senaryoları

Senaryo 1: Toplu Quota Artırımı

Şirketin yeni bir politika aldı ve tüm kullanıcıların kotası 1GB’tan 2GB’a çıkarılacak. MySQL backend kullanıyorsun:

# Tüm kullanıcıların kotasını güncelle
mysql -u mailuser -p maildb << 'EOF'
UPDATE virtual_users SET quota = 2147483648;
SELECT COUNT(*) as 'Guncellenen kullanici sayisi' FROM virtual_users;
EOF

# Dovecot cache'lerini temizle
doveadm quota recalc -A

Senaryo 2: Belirli Domain’deki Tüm Kullanıcılar

Bir domain’deki tüm kullanıcıların kotası dolmuş, toplu temizlik yapman gerekiyor:

# ornek.com domain'indeki tüm kullanıcıların Trash'ini temizle
for user in $(doveadm user '*@ornek.com' 2>/dev/null); do
  echo "Temizleniyor: $user"
  doveadm expunge -u "$user" mailbox Trash savedbefore 30d
  doveadm expunge -u "$user" mailbox Junk all
  doveadm purge -u "$user"
done

Senaryo 3: Quota Hesabı Bozulmuş

Bazen Dovecot’un quota cache’i gerçek disk kullanımıyla uyuşmaz. Kullanıcı kotasını doldu görüyor ama aslında değil, ya da tam tersi:

# Quota cache'ini sıfırla ve yeniden hesapla
doveadm quota recalc -u [email protected]

# Maildir boyutunu elle kontrol et ve karşılaştır
du -sk /var/mail/vhosts/ornek.com/kullanici/
doveadm quota get -u [email protected]

Eğer değerler hâlâ tutarsızsa, Maildir’daki maildirsize dosyasını silip yeniden oluşturabilirsin:

rm /var/mail/vhosts/ornek.com/kullanici/maildirsize
doveadm quota recalc -u [email protected]

Sık Yapılan Hatalar ve Çözümleri

Quota Uyarı Maili Gitmiyor

Uyarı script’i çalışıyor ama kullanıcıya mail gitmiyor. Kontrol et:

# Script çalışıyor mu?
tail -f /var/log/mail.log | grep quota-warning

# Script izinleri doğru mu?
ls -la /usr/local/bin/quota-warning.sh
stat /var/spool/dovecot/private/quota-warning  # unix socket varsa

# Script'i elle test et
echo "95 [email protected]" | /usr/local/bin/quota-warning.sh

Quota Değişikliği Anında Geçerli Olmuyor

Kota artırdın ama kullanıcı hâlâ mail alamıyor:

# Sadece reload yetmeyebilir, tam restart dene
systemctl restart dovecot

# Cache'i zorla temizle
doveadm quota recalc -u [email protected]

# Postfix queue'daki bekleyen mailleri yeniden dene
postqueue -f

doveadm quota get -A Yavaş Çalışıyor

Çok sayıda kullanıcı varsa bu komut dakikalarca sürebilir. Bunu production’da saat başı çalıştırmak yerine ayrı bir thread’e al ya da çıktıyı cache’le:

# Çıktıyı dosyaya yaz, rapor bu dosyadan okusun
doveadm quota get -A > /var/cache/dovecot-quota.cache 2>/dev/null &

Uzun Vadeli Önlemler

Quota dolumunu tamamen ortadan kaldıramazsın, ama sıklığını dramatik biçimde azaltabilirsin.

Otomatik Temizlik Politikaları belirle. Trash ve Spam klasörleri için otomatik silme Dovecot’un expire plugin’iyle yapılabilir ya da cron script’leriyle sağlanabilir. Kullanıcıları bu politika hakkında önceden bilgilendirmek önemli.

Quota Uyarı Kademelerini Doğru Ayarla. 75%, 85%, 95% gibi üç kademeli uyarı sistemi kullanıcıya yeterli zaman tanır. Tek uyarı yeterli değil, birçok kullanıcı ilk uyarıyı görmezden gelir.

Kullanıcı Self-Servis Portalı. Roundcube veya SOGo gibi webmail istemcilerinde quota göstergesi aktif olsun. Kullanıcı kendi durumunu görebilirse sana ulaşmadan önce harekete geçer.

IMAP Kotasını İstemciye Bildir. Dovecot, IMAP QUOTA extension’ı destekler. Outlook, Thunderbird gibi istemciler bu bilgiyi kullanıcıya gösterir. Bunun aktif olduğundan emin ol:

# /etc/dovecot/conf.d/20-imap.conf
protocol imap {
  imap_capability = +QUOTA
}

Sonuç

Dovecot quota aşımı, temelde üç ayrı katmanda ele alınması gereken bir sorundur: anı kurtarmak için acil müdahale, tekrarlanmaması için doğru yapılandırma ve uzun vadede proaktif izleme. Kullanıcıyı “kotanı doldurdun, kendin temizle” diyerek başıbaşa bırakmak kısa vadede işe yarar gibi görünse de destek yükünü artırır.

Postfix ile Dovecot quota policy servisini entegre etmek, hem gönderici tarafında anlık hata mesajı üretmesi hem de gereksiz bounce maili engellenmesi açısından kritik önem taşır. Bunu yapmadan kurulan sistemlerde bounce problemleri kaçınılmaz olur.

En önemli önlem ise otomatik izleme ve uyarı sistemi kurmak. Sabah 9’da telefon çalmadan, önceki gece sistem zaten seni uyarmışsa işin çok daha kolay. doveadm aracını iyi öğren, bu araç quota yönetiminin büyük bölümünü komut satırından kolayca yapmanı sağlar ve otomasyon script’lerinin temel taşını oluşturur.

Benzer Konular

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir