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 = subscribeile kullanıcı deneyimini iyileştirebilirsinizspecial_usebayrakları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.