Posted in

Gizli Güç: Exchange Pickup Directory Nedir, Ne İşe Yarar?

Merhabalar,

Sahada sıkça karşılaştığım bir durumu sizlerle paylaşmak istiyorum. Exchange Server ortamlarında otomatik mail gönderimi ihtiyacı olduğunda, genellikle aşağıdaki iki yönteme başvurulduğunu görüyorum:

  1. Sunucu ip adresleri için SMTP Relay tanımlanması

  2. Script dosyasına kullanıcı adı + parola gömülerek SMTP üzerinden mail atılması

IP, spoof edilebileceğinden ya da sunucuya verilen ip(ler) değişebileceğinden hem süreklilik hem de güvenlik gereği birinci yöntem çok kullanışlı gözükmemektedir. Ama günümüzde de en çok tercih edilen yöntemlerden biridir.

Script içine gömülen parolaların güvensiz olduğunu sanırım kimse inkar etmez. Çünkü bu parolalar zamanla sızabilir, özellikle dosyalar paylaşılıyorsa veya versiyon kontrolüne giriyorsa.

Peki daha güvenli, pratik ve Exchange’in yerleşik olarak desteklediği bir yöntem var mı? Evet var: Pickup Directory.

Pickup Directory Nedir?

Pickup Directory, Exchange Transport servisinin izlediği bir klasördür. Bu klasöre bırakılan .eml uzantılı dosyalar, gerçek bir e-posta gibi işlenerek ilgili alıcılara gönderilir. Exchange Sunucusu Pickup Directory dizinini her beş saniyede bir kontrol eder ve eğer uygun formatta dosya bulursa bu dosyayı işler. Bu beş saniyelik süreyi değiştiremezsiniz.

  • SMTP bağlantısı gerekmez

  • Parola gerekmez

  • TLS, SMTP AUTH gibi protokollerle uğraşılmaz

✅ Güvenlidir, 🔄 otomatiktir, 🧰 esnektir.

Yani en kaba tabirle notepad içine biraz sonra göreceğin gibi ilgili metini yaz, .eml dosyası olarak Pickup Directory dizinine koy. Arkana yaslan ve izle.

Pickup Diretory ile ilgili exchange üzerindeki ayarlara, exchange management shell üzerinde,

Get-TransportService -Identity "Exchange Sunucu Adı" | fl *pickup*

komutunu yazarak erişebiliriz.

Set-TransportService komutuyla ise Pickup Directory dizinini, PickupDirectoryMaxHeaderSize boyutunu, PickupDirectoryMaxMessagesPerMinute ve PickupDirectoryMaxRecipientsPerMessage değerlerini ayarlayabilirsiniz. 

Default dizini %ExchangeInstallPath%TransportRoles\Pickup şeklindedir. Diğer parametre default değerleri de aşağıdaki gibidir.

PickupDirectoryMaxHeaderSize : 64 KB (65,536 bytes)
PickupDirectoryMaxMessagesPerMinute : 100
PickupDirectoryMaxRecipientsPerMessage : 100
PickupDirectoryPath : C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\Pickup

Pickup Directory Default Values

Pickup Directory Nasıl Etkinleştirilir?

Hali hazırda etkinleştirmek için herhangi bir şey yapmaya gerek yoktur. Çünkü transportservice, default durumda zaten default dizini izlemektedir. Fakat hem spesifik dizin olması açısından hem de komut parametre kullanımı açısından ben aşağıdaki gibi dizin değişikliğini yapmaktayım.

New-Item -ItemType Directory -Path “C:\PickupDirectory”

Set-TransportService m3gexc01.m3g.intra -PickupDirectoryPath “C:\PickupDirectory”

Pickup Diectory on Drive

Ben lab ortamında olduğumdan ve bana gerekli olmadığından diğer ilgili parametreleri değiştirmedim fakat siz ortamınıza ve ihtiyaçlarınıza göre aşağıdaki komuttaki gibi değiştirebilirsiniz. (200 değeri örnek olarak verilmiştir.)

Set-TransportService -Identity “M3GEXC01” -PickupDirectoryPath “C:\PickupDirectory” -PickupDirectoryMaxMessagesPerMinute 200 –PickupDirectoryMaxRecipientsPerMessage 200

🛑 Transport servisini restart ‘a ihtiyaç yoktur. Fakat muhtemelen farkedeceksiniz ki dizini değiştirmeden test yaparsanız ilgili mail gönderimi sağlanıyor, dizini değiştirdiğinizde sağlanmıyor. Eğer üstteki gibi dizini değiştirmiş iseniz, ilgili dizin üzerinde NETWORK SERVICE account ‘una okuma yazma silme yetkilerini vermeyi unutmayın.

Pickup Directory Mesaj Dosyasının Gereksinimleri Nelerdir?

Microsoft kaynaklarına göre Pickup Directory içine koyacağınız dosyanın bazı gereksinimleri vardır.

  • Mesaj dosyası, temel SMTP mesaj formatına uygun bir metin dosyası olmalıdır. MIME desteği bulunmaktadır.
  • Dosya uzantısı .eml olmalıdır.
  • Gönderen alanında yalnızca bir e -posta adresi olabilir. Birden fazla e -posta adresine izin verilmez.
  • Alıcı adresi için birden fazla adres girilebilir.
  • To,CC,Bcc alanlarını desteklemektedir.
  • Mesaj başlığı ile mesaj gövdesi arasında boş bir satır olmalıdır.

Plain Text bir örnek .eml dosyası aşağıdaki gibidir.

To: administrator@m3g.intra
From: barbara.lee@contoso.com
Subject: Message subject

This is the body of the message.

Yukarıda MIME içeriğinin Pickup Directory tarafından desteklendiğini belirtmiştik. HTML içeren örnek bir .eml dosyası da aşağıdaki gibi olacaktır.

To: administrator@m3g.intra
From: report@m3g.intra
Subject: Message subject
MIME-Version: 1.0
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

<HTML><BODY>
<TABLE>
<TR><TD>cell 1</TD><TD>cell 2</TD></TR>
<TR><TD>cell 3</TD><TD>cell 4</TD></TR>
</TABLE>

</BODY></HTML>

Uygulamalı Örnek İle Canlı Senaryo

Exchange sunucu üzerinde çalıştırmam gereken bir scriptim olsun. Hiç relay connector ip tanımlaması yapmadan ya da script içinden authenticate attırmak için scripte parola yazma gereği duymadan Pickup Directory ile mailimizin teslim edildiğini görelim.

  • Lab ortamı olması dolayısı ile hemen hemen tüm Performance Counter sayaçları 0 olduğundan, script ile MsExchangeFrontEndTransport SmtpReceive sayacını takip ederek, sunucuya yapacağım Telnet bağlantıları ile bu değeri artırıp scripte eşik değerinin üzerine çıktığında mail attıracağım. Yapınızda çok farklı scriptlerin sonuçlarını mail attırıyor olabilirsiniz. Hatta çoğu script çıktısını ya da logunu dosyaya yazdırarak mail attıryor olduğunuzdan sizler kendi senaryolarınızı kendi yapınıza göre uygulayabilirsiniz.
İzlenen Sayaç : 
\MSExchangeFrontEndTransport SmtpReceive(_total)\Connections Current
Script içeriği : 

while($true)
{
$counts = Get-Counter "\\m3gexc01\msexchangefrontendtransport SmtpReceive(_total)\Connections Current"

if ($counts.CounterSamples.CookedValue -gt 2) {
$args = "From: counter@m3g.intra
To: administrator@m3g.intra
Subject: Sayac hakkında

SMTP bağlantı sayısı eşik değeri aştı:
$($counts.CounterSamples.CookedValue)
"

Set-Content -Path "C:\PickupDirectory\alert.eml" -Value $args
}
sleep 3;
}

Sunucumuz üzerinde task yapmakla uğraşmadığım için ben powershell_ise üzerinden while($true) döngüsüyle (sonsuz döngü) üç saniye aralıklarla çalıştırıyorum.

exchange smtp counter script

Script kod bloğunda bağlantı sayısı 2 ‘nin üzerine çıktığında .eml dosyasını oluşturduğundan, telnet komutu vasıtasıyla sunucuya 3 adet bağlantı sağlıyorum.

telnet connection to exchange

Bağlantıları sağladığımda Performance Counter üzerinden de Count değerinin 3 olduğu görülmektedir.

Count of smtp traffic

Bu durumdayken Pickup Directory dizininde ise durumlar nasıl gözüküyor bir bakalım.

Pickup Directory .eml file created

Görüldüğü üzere script işini yaparak sayı ikinin üzerine çıktığı için .eml dosyasını oluşturmuş. Fakat bu bu dosya burada çok durmayacak. 3-5 saniye içinde eğer gönderim başarılı olur ise, yani transportservice dosyayı başarılı bir biçimde işler ise dosya kaybolacaktır. Eğer dosyayı işlyemez ise bu dosyanın uzantısını .tmp yaparak dosyayı kaldırmayacak ve klasörde tutacaktır. Böyle bir dosya ile karşılaşmanız durumunda Get-MessageTrackingLog komutuyla detaylar incelenebilir.

.eml dosyası Pickup Directory klasöründen kaybolduğu için işleme alındığını düşünerek önce mail kutusuna bakıyorum.

eml file message delivered successfully

Görüldüğü üzere email başarılı şekilde teslim edilmiş. Hatta ben scriptte 3 saniye sleep koyduğumdan dolayı, o 3 saniye içinde bağlantı sayısı düşmediğinden (çünkü manuel telnet bağlantısı kurduğumdan) bir kaç tane mail düşmüş gözükmekte.

Message tracking log üzerinde inceleyecek olursak eğer;

messagetrackinglog for pickup directory send message

Yine ekran görüntüsünde görüleceği üzere mesajın source ‘unun Pickup olduğunu ve mesaj kutusuna teslim edildiğini görebilmekteyiz.

Peki alternatif olarak hangi senaryolarda kullanılabilir diye soran arkadaşlar olacaktır. Hemen aklıma gelen bir tanesini daha kısaca paylaşmış olayım.

Ekstra Senaryolar

SMTP Stres Testi

  1. Aynı .eml dosyasını 1.000 kez çoğaltın.

  2. C:\PickupDirectory altına topluca kopyalayın.

  3. Exchange sırayla bu mailleri iletmeye başlar.

Böylece gerçek bir SMTP trafiği yaratmadan, Exchange’in iletim performansını test edebilirsiniz.

İşlem sonrası:

  • Queue Viewer ile gecikmeler izlenebilir.

  • Mail.log üzerinden gecikme, hata, retry analizleri yapılabilir.

  • Performance Monitor ve MessageTracking üzerinden detaylı iletim süreci takip edilebilir.

Diğer Kullanım Senaryoları

💾 1. Legacy Script & Uygulamalar

SMTP desteği olmayan, eski uygulamalar veya VBS/Batch betikleri kolayca .eml dosyası üretebilir.

📧 2. Sunucu üzerindeki Queue mesajlarını export alarak tekrar iletime sokmak

Sunucu üzerinde bir sebepten kuyruğunuz erimiyor ve sıkıntı yaşıyorsanız, Export-Message ile dışarı aktarılan mailler tekrar iletime sokulabilir. Export-Message komutu ile ilgili microsoft linkinden bilgi alabilirsiniz.

Dilerseniz Export-Message ile Mail Kurtarma ve Pickup Directory Entegrasyonu konulu yazımı da okuyabilirsiniz.

📤 3. Erişimi Kısıtlı Ortamlarda Mail Gönderimi

SMTP portuna çıkışı olmayan sistemlerden bile lokal disk üzerinden e-posta iletimi sağlanabilir.

🔁 4. Dosya Tabanlı Otomasyon

CI/CD araçları, backup sistemleri veya SIEM çözümleri olay tespit ettiğinde .eml dosyası üretip doğrudan bildirim atabilir.

Güvenlik Avantajı

Risk Unsuru Geleneksel SMTP Pickup Directory
Parola Gereksinimi ✅ Evet ❌ Hayır
Güvenlik Açığı Riski ⚠️ Yüksek ✅ Düşük
Ayar Karmaşıklığı ⚠️ Orta ✅ Basit
Uygulama Bağımlılığı ✅ SMTP Bağımlı ❌ Dosya Yeterli
Performans Testi Uygunluğu ❌ Zayıf ✅ Uygun

Pickup Directory, Exchange Server ’ın az bilinen ama son derece güçlü bir aracıdır. Sahada aşağıdaki ihtiyaçlar için kullanmanızı taviye ederim:

  • Otomasyon betikleri

  • Sistem uyarı bildirimleri

  • SMTP güvenlik kısıtları olan ortamlar

  • Performans testleri

Sonuç: Neden Tercih Etmeliyiz?

Pickup Directory kullanımını yukarıda bahsettiğimiz mail gönderim seçeneklerinden ayıran özellik tablosundan da görüleceği üzere hem esnek hem kolay hem de daha izlenebilir bir seçenek olarak karşımıza çıkmaktadır. Tabiki yine hangisini kullanacağınız admin olarak sizin kararınız olacaktır.

Kriter SMTP Relay Script SMTP Auth Pickup Directory
Güvenlik Riski Yüksek Orta Düşük
Şifre Gerekir mi? Hayır Evet Hayır
Kurulum Karmaşıklığı Orta Düşük Düşük
İzlenebilirlik Orta Düşük Yüksek (Log)
Performans Testine Uygun Hayır Hayır Evet

EML Formatı Şablon

Son olarak yukarıdaki bahsettiğim .eml uzantılı dosya formatını şablon olarak tekrar paylaşarak yazımı bitireyim.

From: system@domain.local
To: admin@domain.local
Subject: Deneme Maili

Merhaba, bu bir Pickup Directory test mesajıdır.

Notepad ile kaydet → .eml uzantılı yap → PickupDirectory‘ye bırak → ✅ Gönderildi.

Faydalı olması dileğiyle.

Microsoft’un bu konu ile ilgili makalesine link üzerinden erişebilirsiniz.

One thought on “Gizli Güç: Exchange Pickup Directory Nedir, Ne İşe Yarar?

  1. RecepYuksel says:

    Eline sağlık, yine çok değerli ve detaylı bir makale yazmışşın, sağolasın.

Leave a Reply

Your email address will not be published. Required fields are marked *