Dovecot ile Namespace ve Klasör Yapılandırması

Mail sunucusu kurulumlarında en çok göz ardı edilen konulardan biri namespace ve klasör yapılandırmasıdır. Kullanıcılar Outlook veya Thunderbird’ü açtıklarında “Gelen Kutusu” yerine “INBOX” görüyorsa, ya da Sent Items klasörü farklı isimle görünüyorsa, bunun arkasında Dovecot namespace yapılandırması yatıyor. Bu yazıda Dovecot’un namespace sistemini derinlemesine ele alacak, gerçek dünya senaryolarıyla pratik çözümler üreteceğiz.

Namespace Nedir ve Neden Önemlidir?

Dovecot’ta namespace, IMAP istemcisinin mailbox’lara nasıl erişeceğini tanımlayan bir soyutlama katmanıdır. Basitçe söylemek gerekirse, hangi klasörlerin nerede saklandığını ve IMAP protokolü üzerinden nasıl görüneceğini belirler.

Üç temel namespace türü vardır:

  • private: Kullanıcıya ait özel mailbox’lar (varsayılan INBOX ve klasörler)
  • shared: Birden fazla kullanıcının erişebildiği paylaşımlı mailbox’lar
  • public: Tüm kullanıcıların erişebildiği genel klasörler

Bir e-posta yöneticisi olarak şunu söyleyebilirim: namespace yapılandırmasını doğru yapmadan önce çok sayıda kullanıcı şikayeti aldım. “Gönderilen kutum kayboldu”, “Taslaklar farklı yerde görünüyor” gibi sorunların büyük çoğunluğu aslında namespace veya klasör ayarlarından kaynaklanıyordu.

Dovecot Konfigürasyon Dosyası Yapısı

Dovecot yapılandırması genellikle /etc/dovecot/ altında bulunur. Modern Dovecot kurulumlarında konfigürasyon modüler yapıdadır:

ls -la /etc/dovecot/conf.d/
# 10-auth.conf
# 10-mail.conf
# 10-master.conf
# 15-mailboxes.conf
# 20-imap.conf
# 90-sieve.conf

Namespace yapılandırması için iki temel dosya önemlidir: 10-mail.conf ve 15-mailboxes.conf. Namespace blokları her iki dosyada da tanımlanabilir, ancak düzeni korumak adına 10-mail.conf içinde namespace tanımlamak, 15-mailboxes.conf içinde ise mailbox özelliklerini belirtmek daha iyi bir pratiktir.

Temel Namespace Yapılandırması

Varsayılan bir Dovecot kurulumunda namespace yapılandırması şu şekilde görünür:

# /etc/dovecot/conf.d/10-mail.conf

namespace inbox {
  type = private
  separator = /
  prefix =
  inbox = yes
  
  mailbox Drafts {
    special_use = Drafts
    auto = subscribe
  }
  
  mailbox Junk {
    special_use = Junk
    auto = subscribe
  }
  
  mailbox Trash {
    special_use = Trash
    auto = subscribe
  }
  
  mailbox Sent {
    special_use = Sent
    auto = subscribe
  }
  
  mailbox "Sent Messages" {
    special_use = Sent
  }
}

Buradaki kritik parametreler şunlardır:

  • type: Namespace türü (private, shared, public)
  • separator: Klasör hiyerarşisinde kullanılan ayırıcı karakter
  • prefix: IMAP’te görünen önek (boş olabilir)
  • inbox: Bu namespace’in INBOX’ı içerip içermediği
  • auto: subscribe değeri, istemci bağlandığında otomatik abone olur
  • special_use: RFC 6154 özel kullanım bayrakları

Separator Seçimi: / mi, . mi?

Bu, tartışmalı bir konudur. Geleneksel Maildir formatı için / separator kullanılır, Mbox için ise . daha yaygındır. Ancak modern uygulamalarda / separator çok daha yaygın ve sorunsuz çalışır.

# Mbox tarzı - nokta separator
namespace inbox {
  separator = .
  prefix =
  inbox = yes
}

# Maildir tarzı - slash separator  
namespace inbox {
  separator = /
  prefix =
  inbox = yes
}

Önemli bir uyarı: Eğer mevcut bir sistemi Mbox’tan Maildir’e geçiriyorsanız, separator değişikliği kullanıcıların klasör yapısını bozabilir. Bu geçişi yaparken mutlaka yedek alın ve test ortamında deneyin.

Gerçek Dünya Senaryosu 1: Türkçe Klasör İsimleri

Türk kullanıcılar için Türkçe klasör isimleri kullanan bir kurulum yapmak istiyorsunuz. Outlook kullanıcıları “Gelen Kutusu”, “Gönderilmiş Öğeler” gibi Türkçe isimleri görmek istiyor.

# /etc/dovecot/conf.d/15-mailboxes.conf

namespace inbox {
  type = private
  separator = /
  prefix =
  inbox = yes
  
  mailbox "Gönderilmiş" {
    special_use = Sent
    auto = subscribe
  }
  
  mailbox "Taslaklar" {
    special_use = Drafts
    auto = subscribe
  }
  
  mailbox "Önemsiz Posta" {
    special_use = Junk
    auto = subscribe
  }
  
  mailbox "Silinmiş Öğeler" {
    special_use = Trash
    auto = subscribe
  }
  
  mailbox Archive {
    special_use = Archive
    auto = no
  }
}

Ancak burada dikkat edilmesi gereken bir nokta var: IMAP istemcileri special_use bayrağını kullandığı için asıl klasör ismi çok kritik değil, önemli olan special_use atamalarının doğru yapılması. Thunderbird ve modern Outlook, Sent bayrağını gördüğünde o klasörü Gönderilmiş olarak tanır.

Gerçek Dünya Senaryosu 2: Paylaşımlı Mailbox Yapılandırması

Bir şirkette birden fazla kişinin erişmesi gereken bir [email protected] adresi var. Bu adresi paylaşımlı mailbox olarak yapılandırmak için shared namespace kullanacağız.

Önce ACL (Access Control List) eklentisini etkinleştirin:

# /etc/dovecot/conf.d/20-imap.conf
protocol imap {
  mail_plugins = $mail_plugins acl
}

# /etc/dovecot/conf.d/90-acl.conf
plugin {
  acl = vfile
  acl_shared_dict = file:/var/lib/dovecot/shared-mailboxes.db
}

Ardından shared namespace tanımlayın:

# /etc/dovecot/conf.d/10-mail.conf - mevcut konfigürasyona ekleyin

namespace shared {
  type = shared
  separator = /
  prefix = shared/%%u/
  location = maildir:/var/mail/vhosts/%%d/%%n/Maildir
  subscriptions = yes
  list = children
}

Buradaki %%u tüm kullanıcı adını (user@domain), %%d domain’i, %%n ise domain öncesi kısmı temsil eder.

Şimdi ACL izinlerini ayarlayın. Kullanıcıların paylaşımlı mailbox’a erişimi için:

# info kullanıcısının mailbox'una diğer kullanıcıların erişimini ayarla
doveadm acl set -u [email protected] INBOX "[email protected]" lookup read write write-seen write-deleted expunge
doveadm acl set -u [email protected] INBOX "[email protected]" lookup read write write-seen write-deleted expunge

# Mevcut ACL listesini görüntüle
doveadm acl get -u [email protected] INBOX

Gerçek Dünya Senaryosu 3: Public Namespace ile Herkese Açık Klasörler

Bir eğitim kurumunda duyurular için herkese açık bir klasör oluşturmak istiyorsunuz. Tüm kullanıcılar bu klasörü sadece okuyabilsin.

# /etc/dovecot/conf.d/10-mail.conf

namespace public {
  type = public
  separator = /
  prefix = Public/
  location = maildir:/var/mail/public
  subscriptions = yes
  list = yes
}

Public klasörü için dizin oluşturun ve izinleri ayarlayın:

mkdir -p /var/mail/public/Duyurular
mkdir -p /var/mail/public/Genel

# Dovecot kullanıcısına izin verin
chown -R vmail:vmail /var/mail/public
chmod -R 770 /var/mail/public

# ACL dosyası oluşturun
cat > /var/mail/public/dovecot-acl << 'EOF'
authenticated lr
EOF

Bu yapılandırmayla tüm authenticate olmuş kullanıcılar Public/Duyurular ve Public/Genel klasörlerini listeyip okuyabilir.

Mail Storage Location ve Namespace İlişkisi

Namespace’lerin nerede depolandığını anlamak kritik önemdedir. location parametresi belirtilmezse varsayılan mail_location kullanılır.

# /etc/dovecot/conf.d/10-mail.conf

# Varsayılan mail lokasyonu
mail_location = maildir:~/Maildir

# Namespace için farklı lokasyon belirtme
namespace inbox {
  type = private
  separator = /
  prefix =
  inbox = yes
  # location belirtilmezse mail_location kullanılır
}

namespace archive {
  type = private
  separator = /
  prefix = Archive/
  # Arşiv klasörlerini farklı bir dizinde sakla
  location = maildir:/var/mail/archive/%u/Maildir
  inbox = no
  list = yes
}

Bu yapılandırma özellikle depolama optimizasyonu açısından kullanışlıdır. Eski e-postaları daha yavaş ama ucuz bir depolama alanına taşırken kullanıcılar için şeffaf bir görünüm sunabilirsiniz.

Mailbox Özel Bayrakları ve Auto Subscription

special_use bayrakları RFC 6154 standardını uygular ve IMAP istemcilerinin özel klasörleri otomatik tanımasını sağlar. Kullanılabilir bayraklar:

  • Inbox: Gelen kutusu
  • Drafts: Taslaklar
  • Sent: Gönderilmiş
  • Junk: Spam/Önemsiz
  • Trash: Çöp kutusu
  • Archive: Arşiv
  • Flagged: İşaretliler

auto parametresi üç değer alabilir:

  • no: Otomatik işlem yok (varsayılan)
  • create: Klasör yoksa oluştur ama subscribe etme
  • subscribe: Klasör yoksa oluştur ve subscribe et
# Pratik bir yapılandırma örneği
namespace inbox {
  mailbox INBOX {
    special_use = Inbox
  }
  
  mailbox Drafts {
    special_use = Drafts
    auto = subscribe
  }
  
  mailbox Sent {
    special_use = Sent
    auto = subscribe
  }
  
  mailbox Spam {
    special_use = Junk
    auto = create
  }
  
  mailbox Trash {
    special_use = Trash
    auto = subscribe
  }
  
  mailbox Archive {
    special_use = Archive
    auto = no
  }
}

Namespace Yapılandırmasını Test Etme

Yapılandırma değişikliklerinden sonra mutlaka test yapın. Dovecot’un yerleşik araçları bu konuda çok yardımcı olur:

# Konfigürasyon dosyasını kontrol et
doveconf -n 2>&1 | grep -A 20 namespace

# Belirli bir kullanıcı için mailbox listesi
doveadm mailbox list -u [email protected]

# Mailbox bilgilerini göster
doveadm mailbox status -u [email protected] "messages unseen recent" '*'

# IMAP bağlantısını elle test et
openssl s_client -connect mail.domain.com:993

# Bağlantı kurulduktan sonra manuel IMAP komutları
# a LOGIN [email protected] sifre
# b LIST "" "*"
# c LSUB "" "*"

Ayrıca Dovecot’un konfigürasyon doğrulaması için:

# Sözdizimi hatalarını kontrol et
dovecot -n

# Konfigürasyonu yeniden yükle (servisi durdurmadan)
doveadm reload

# Ya da systemd ile
systemctl reload dovecot

Sık Karşılaşılan Sorunlar ve Çözümleri

Sorun 1: Klasörler IMAP istemcisinde görünmüyor

Bu genellikle list parametresi veya subscription sorunudur.

# Kullanıcının subscription listesini kontrol et
doveadm mailbox list -u [email protected] -s

# Tüm mailbox'ları listele (subscribe durumundan bağımsız)
doveadm mailbox list -u [email protected]

# Belirli bir mailbox'a subscribe et
doveadm mailbox subscribe -u [email protected] "Sent"

Sorun 2: Separator uyumsuzluğu

Eski sistemden göç sırasında sık karşılaşılan bir durum. Mevcut klasör yapısıyla separator uyuşmuyorsa:

# Mevcut mailbox yapısını kontrol et
ls -la /var/mail/vhosts/domain.com/kullanici/Maildir/

# Klasör isimlerindeki separator'u incele
find /var/mail/vhosts/domain.com/kullanici/Maildir/ -maxdepth 1 -type d -name ".*"

Sorun 3: ACL izin sorunları shared namespace’te

# ACL eklentisinin yüklenip yüklenmediğini kontrol et
doveadm config -n | grep mail_plugins

# ACL veritabanını kontrol et
cat /var/lib/dovecot/shared-mailboxes.db

# Dovecot log'larını incele
journalctl -u dovecot -f
# ya da
tail -f /var/log/dovecot.log

Performans Optimizasyonu: Namespace İndeksleme

Büyük mailbox’larda namespace indeksleme performansı kritik önem taşır. Dovecot’un index sistemi düzgün yapılandırılmazsa, özellikle shared namespace’lerde ciddi yavaşlamalar yaşanabilir.

# /etc/dovecot/conf.d/10-mail.conf

namespace inbox {
  type = private
  separator = /
  prefix =
  inbox = yes
  
  # Index dosyalarının konumu
  # Varsayılan: mail dizininin içinde
  # Performans için ayrı bir hızlı diske taşıyabilirsiniz
  # location = maildir:~/Maildir:INDEX=/var/dovecot-index/%u
}

# Genel mail ayarları
mail_location = maildir:~/Maildir:LAYOUT=fs:INDEX=/fast-disk/mail-index/%u

# Index cache ayarları
mail_cache_fields = flags date.save date.received size.virtual imap.envelope

Shared namespace için index konumunu merkezi bir yere almak performansı artırır:

namespace shared {
  type = shared
  separator = /
  prefix = shared/%%u/
  location = maildir:/var/mail/vhosts/%%d/%%n/Maildir:INDEX=/var/dovecot-shared-index/%%d/%%n
  subscriptions = yes
  list = children
}

Dovecot ve Postfix Entegrasyonunda Namespace Dikkate Alınacak Noktalar

Postfix’le entegre bir sistemde namespace yapılandırması LMTP veya LDA üzerinden mail teslimini etkiler. Özellikle postmaster_address ve sieve script’leri namespace’e duyarlıdır.

# /etc/dovecot/conf.d/15-lda.conf
protocol lda {
  mail_plugins = $mail_plugins sieve
  postmaster_address = [email protected]
  
  # Namespace aware delivery
  lda_mailbox_autocreate = yes
  lda_mailbox_autosubscribe = yes
}

Sieve scriptleri namespace prefix’lerini bilmek zorundadır:

# Örnek sieve script - namespace prefix'e dikkat
require ["fileinto", "mailbox"];

if header :contains "X-Spam-Flag" "YES" {
  fileinto :create "Spam";
  stop;
}

if header :contains "List-ID" "<updates.example.com>" {
  fileinto :create "Bültenler/Updates";
  stop;
}

Monitoring: Namespace Kullanımını İzleme

Production ortamında namespace ve mailbox kullanımını izlemek için:

# Tüm kullanıcıların mailbox istatistiklerini toplu al
for user in $(doveadm user '*'); do
  echo "=== $user ==="
  doveadm quota get -u "$user" 2>/dev/null
done

# Belirli bir namespace'deki toplam mail sayısı
doveadm mailbox status -u [email protected] messages 'INBOX'
doveadm mailbox status -u [email protected] messages 'Sent'

# Shared namespace erişim loglarını filtrele
grep "shared/" /var/log/dovecot.log | grep "imap" | tail -50

Göç Senaryosu: Eski Sistemden Namespace Geçişi

Mevcut bir sistemden farklı namespace yapısına geçiş yaparken dikkatli olmak gerekir. Kullanıcıların mevcut klasörleri kaybolmamalı.

#!/bin/bash
# Namespace separator değişikliği için migration script
# Nokta separator'dan slash separator'a geçiş

MAIL_BASE="/var/mail/vhosts"
OLD_SEP="."
NEW_SEP="/"

for domain_dir in "$MAIL_BASE"/*/; do
  domain=$(basename "$domain_dir")
  for user_dir in "$domain_dir"*/; do
    user=$(basename "$user_dir")
    maildir="$user_dir/Maildir"
    
    if [ -d "$maildir" ]; then
      echo "Processing: $user@$domain"
      
      # Nokta ile başlayan klasörleri bul (Maildir formatı)
      find "$maildir" -maxdepth 1 -type d -name ".*" | while read folder; do
        folder_name=$(basename "$folder" | sed 's/^.//')
        
        # Nokta separator'ı slash ile değiştir
        new_name=$(echo "$folder_name" | tr '.' '/')
        
        if [ "$folder_name" != "$new_name" ]; then
          echo "  Renaming: $folder_name -> $new_name"
          # Gerçek ortamda bu adımı dikkatli uygulayın
          # mv "$folder" "$maildir/.$new_name"
        fi
      done
    fi
  done
done

Bu scripti önce --dry-run modunda (echo ile) çalıştırıp sonuçları doğrulayın, ardından gerçek taşıma işlemini yapın.

Sonuç

Dovecot namespace ve klasör yapılandırması, ilk bakışta karmaşık görünse de temel kavramları anladıktan sonra oldukça mantıklı bir sistem ortaya çıkıyor. Private, shared ve public namespace türleri farklı kullanım senaryolarını karşılıyor; special_use bayrakları ise IMAP istemcileri arasında tutarlılık sağlıyor.

Özetlemek gerekirse:

  • Private namespace ile kullanıcı başına izole mailbox yönetimi yapabilirsiniz
  • Shared namespace ile ekip mailbox’larını merkezi yönetebilirsiniz
  • Public namespace ile tüm kullanıcılara ortak klasörler sunabilirsiniz
  • auto = subscribe ile kullanıcı deneyimini iyileştirebilirsiniz
  • special_use bayraklarını doğru atamak istemci uyumluluğunu garanti eder
  • ACL eklentisi shared ve public namespace’ler için vazgeçilmezdir
  • Değişiklik yapmadan önce mutlaka yedek alın ve test ortamında deneyin

Production ortamında herhangi bir değişiklik öncesi doveadm araçlarıyla mevcut durumu belgelemenizi şiddetle tavsiye ederim. Kullanıcı şikayeti almadan önce namespace yapılandırmanızı gözden geçirin; mail sunucusu sorunlarının önemli bir kısmı bu konfigürasyonun yanlış yapılmasından kaynaklanıyor.

Yorum yapın