Posted in

Export-Message ile Mail Kurtarma ve Pickup Directory Entegrasyonu

Merhabalar,

Daha önce Gizli Güç: Exchange Pickup Directory Nedir, Ne İşe Yarar? başlıklı yazımda, Exchange üzerinde manuel olarak mail dolaşıma sokmak için kullanılan Pickup dizininden bahsetmiştim. Bu yazıda ise o konunun bir adım ötesine geçerek, Transport Service üzerinde çeşitli nedenlerle gönderilemeyen veya kuyruğa takılan e-postaları nasıl dışa aktarabileceğimizi ve bu mailleri tekrar dolaşıma nasıl sokabileceğimizi adım adım göstereceğim.

Bir lab ortamındasınız ya da canlı sistemde Transport Service üzerinde bir arıza yaşadınız. Bazı mailler Submission ya da Unreachable gibi kuyruklarda sıkışmış durumda. Mailleri kaybetmeden bu sorunu aşmak için:

  • Önce Export-Message cmdlet’i ile bu mesajları dışa aktaracağız.

  • Ardından bu .eml dosyalarını Pickup dizinine bırakarak tekrar işleme alınmalarını sağlayacağız.

Yapınızdaki Exchange sunucu üzerinde farkettiniz ki Transport Queue birikiyor ve erimiyor. Hatta Retry olan queue(s) mevcut. Ne yaptıysanız bir türlü kuyruğu eritemediniz. Suspend-Queue, Suspend-Message, Redirect-Message, Retry-Queue, Resume-Queue, Resume-Message gibi komutları çalıştırdınız olmadı. Servisler çalışıyor durumda olmasına rağmen bir türlü sorunu bulamadınız. Force ederek de durdurmak, veri kaybını göze almak, sunucuyu kapatıp (ki tek sunucunuz var ise ayrı bir konu) ortamdan kaldırmak da tabi ki çözümler arasında. Fakat kuyruktaki mailleri kaybetmenin bir diğer dezavantajı hangi mailin kaybolduğu konusunda çok derin ve detaylı analiz gerektirmesidir. Biz bu duruma gelmeden dosyaları export ederek farklı bir transport service üzerinde mailleri dolaşıma sokacağız.

O zaman örneğimizde olduğu gibi sürekli retry durumda olan kuyruk sorunumuz üzerinde neler yapabileceğimize bakalım.

1. Transport Kuyruğunu İnceleyin

İlk olarak hangi kuyruklarda bekleyen mesajlar olduğunu görelim:

Get-Queue

Get-Queue

Görüldüğü üzere kuyruklarımın bir tanesi retry durumda ve kuyruk erimiyor. (Ben durumu simüle edebilmek için servislerle oynadığım için benim örneğimde sorun SmtpDeliveryToMailbox için geçerli. Fakat Submission veya Unreachable kuyruklarında da retry görebilirsiniz.)

Daha detaylı bakmak adına;

Get-Queue -Identity “Queue Identity” | Get-Message

komutunu kullanabilirsiniz. Bu komut size kuyruk üzerindeki mesajları gösterecektir.

Get-Message command on Queue

Bir adım daha ileri giderek, mesajın identity ‘si ile o mesaj için detay bilgi listeyebilirsiniz.

Get-Message -Identity “Mesaj Id No”

Eğer tüm kuyruk mesajları için detay listelemek isterseniz de Get-Queue -Identity "Queue Id" | Get-Message | fl * komutu size yardımcı olacaktır.

Get-Message with identity

Görüldüğü gibi bir çok detay mevcut. İyi de bu bilgiler ile ne yapacağım. Eğer bir hata mevcut ise, mail detay bilgilerindeki LastError kolonu size hata hakkında detay bilgi verecektir.

Aynı kolon kuyruk için de mevcuttur ve Get-Queue -Identity "Queue Id" |  fl * komutu ile eğer mesaj bazında değil de kuyruk bazında bir sorun var ise yine kuyruğun detay bilgisinde LastError kolonunda bu bilgi yer alacaktır.

 

2. Mesajları Export Edin

Mesajları dışa aktarmak için Export-Message cmdlet’ini kullanacağız. Ancak bu komut doğrudan çalışmaz; önce mesajın kimliğini almalıyız. Tabi Prod ortamlarında kuyrukta tek mesaj olmadığından mesaj id ‘si ile tek tek uğraşmak pek mümkün gözükmemektedir. Dolayısıyla tüm mesajları dışarı almak için aşağıdaki komutu kullanabilirsiniz. Fakat mesajı Export etmek için önce Suspend etmelisiniz. Yoksa Export ederken hata alırsınız.

Get-Message -Queue m3gExc01\3 | Where-Object {$_.identity -like “m3gExc01\3\*”} | Suspend-Message

Get-Message -Queue m3gExc01\3 -ResultSize Unlimited | ForEach-Object {$Temp=”c:\queueMails\”+$_.InternetMessageID+”.eml”; $Temp=$Temp.Replace(“<“,”_”); $Temp=$Temp.Replace(“>”,”_”); Export-Message $_.Identity | AssembleMessage -Path $Temp}

Komut benim örneğime göre ddüzenlendiğinden dolayı komut üzerindeki “c:\queueMails\” kısmına maillerin çıkmasını istediğiniz dizini, ‘m3gExc01\3’ kısmına da kuyruğun Id ‘sini yazmalısınız.

Suspend-Message on queue

Suspend olan mesajlar artık export komutu ile ilgili dizine alınabilir. Hata almanız durumunda ilgili dizinin olduğundan emin olunuz.

Export-Message all queue messages

Not : Bu .eml dosyalarını notepad ile açtığımızda, maillerin içeriği görünebileceğinden dolayı, güvenilir adminler tarafından yapılması önerilmektedir. Veri gizliliği ve bilmesi gereken prensibine aykırı durumlar, kişilerin ve kurumların kendi sorumluluğundadır.

3. Pickup Directory’e Taşıyın

Artık .eml dosyalarımız hazır. Artık transport servisinde ve iletiminde sorun olmayan sunucu üzerinde bunları tekrar Exchange akışına dahil etmek için Pickup dizinine taşıyacağız.

Pickup dizinini kontrol edin:

Get-TransportService -Identity “Server Name” | fl PickupDirectoryPath

Pickup Directory Path

Şimdi çıkarttığımız dosyaları (C:\queueMails\) Pickup Dizinine (C:\PickupDirectory) ister komutla ister Kopyala-Yapıştır ile taşıyalım. Ben daha gerçekçi olması adına, lab ortamında m3gexc01 adlı sunucuyu kapatıyorum ve diğer exchange sunucu üzerinden Pickup klasörüne dosyaları taşıyorum.

İlgili dosyaların işlendiğini gördükten sonra yukarıda mesaj detayını gösterdiğimiz mesaj için log analizi yapıyorum.

Get-MessageTrackingLog for pickup mail

Görüldüğü üzere mail ulaşmış durumdadır. Böylelikle kuyruktaki maillerimizi kurtarmış olduk.

Export-Message ile ilgili microsoft makalesine ilgili linkten erişebilirsiniz.

Faydalı olması dileğiyle…

One thought on “Export-Message ile Mail Kurtarma ve Pickup Directory Entegrasyonu

  1. RecepYuksel says:

    Elinize sağlık çok değerli bir makale.

Leave a Reply

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