C# ile Exchange Mail Queue Sorgulama
Merhaba,
Geçtiğimiz günlerde bir problem ile karşılaştık. Mail Server’ımız içeriye mail gönderiyor ancak dışarıya mail göndermiyordu. Problem olduğunu anladıktan sonra problemi çözdük ancak biz problem olduğunu anlayana kadar epey bir süre geçmişti. Bu tarz bir problem ile karşılaşmamak adına dedim ki bir yazılım yazayım belli aralıklarla mail server’da sırada bekleyen mail sayısını alsın. Biz bunun üzerine eğer bu sayı 20 nin üzerinde ise bana mail atsın, yok şuraya loglasın, yok gitsin şunu yazsın vs gibi kontrolleri yazabilelim. O işin kolay kısmı, biz power shell komutlarını çalıştırmaya odaklanalım. Bu günkü yazımızda bu yazılımı yazacağız.
Bu iÅŸlemi yapabilmek için ms exchange power shell komutlarını kullanacağız. Uzaktan baÄŸlantı kurabilmemiz için  using System.Management.Automation; kutuphanesini kullanmamız gerekecek. Bu kutuphane varsayılan olarak visual studio 2010 içerisinde yok. Bizim bunu dışarıdan dahil etmemiz icap etmekte. Bunu yapabilmek içinde nuget manager kullanacağız. Nasıl mı ? AÅŸağıda…
Visual Studio 2010 u açtık. Bir winform projesi başlattık. Buraya kadar herşey tamam. Yukarıda Tools diye bir kısayolumuz bulunmaktadır. Buna tıkladıktan sonra Extension Manager sekmesine tıklayalım.
Bu iÅŸlemi yaptıktan sonra karşımıza extension manager ekranı gelecektir. Internete baÄŸlı olan bilgisayarımızda sol taraftan Online Galery sekmesine tıklayalım ve SaÄŸ üstte bulunan Arama alanına Nuget Package Manager yazalım (default olarak en üstte gelecektir eÄŸer gelmezi ise). Karşımıza gelen toolun üzerine tıklayıp önce download sonra ise install sekmesine basalım. Bu iÅŸlem bir kaç dakika sürebilir. Sonuna kadar bekleyelim. İşlem hakkında bilgi ekranın sol alt kısmında yazıyor olacaktır. Åžimdiye kadarki kısımda Nuget Package Manager install yapısını gördük. Ä°ÅŸlem bittikten sonra yukarıda Tools sekmesine Nuget Package Manager sekmesi eklenecektir. EÄŸer yok ise bir restart herÅŸeyi çözer…
Tools > Nuget Package Manager > Package Manager Console
Sekmelerine tıklıyoruz. Hemen altta console açılıyor oraya şu komutu yazıyoruz.
1 |
Install-Package System.Management.Automation |
Sonra install işlemi başlıyor ve bitiyor. Artık System.Management.Automation sınıfını kullanabilir durumdayız.
Önce yapacağımız işlemi kısaca özetleyelim sonrada kodlamamıza başlayalım.
Bir adet method oluşturacağız. Bu method ile exchange serverımıza bağlanıp sırada bekleyen mesajları ve bunların sayısını alacağız. Haydi başlayalım.
İlk olarak methodumuzu yazmaya başlayalım açıklamaları method içerisinde yorum satırı olarak eklemek daha güzel duracaktır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Management.Automation; using System.Management.Automation.Runspaces; using System.Security; namespace extest {    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        private void button1_Click(object sender, EventArgs e)        {            string kullaniciadi = "Administrator";            string sifre = "sifreolarakburakyazdim";            string domain = "buraksenturkdomaini";            string uri = "http://EXCH.BURAKSENTURKDOMAINI.LOCAL/powershell";            string shelluri ="http://schemas.microsoft.com/powershell/Microsoft.Exchange";            exchangeBaglantiveSonucGetir(@kullaniciadi, sifre, domain, uri,shelluri);        }        public SecureString secureStringDonustur(string strPassword)        {            var secureStr = new SecureString();            if (strPassword.Length > 0)            {                foreach (var c in strPassword.ToCharArray()) secureStr.AppendChar(c);                //Burada password olarak belirttiğim stringi char tipinden bir arraya sıra ile atıyoruz..            }            return secureStr;            //geriyede securestring tipinde bir property döndürüyoruz.        }        public void exchangeBaglantiveSonucGetir(string kullaniciAdi, string sifre, string domain, string uri, string shelluri)        {            SecureString securePwd = new SecureString();            //pscredential sınıfından nesne oluştururken parametre olarak bizden securestring classından bir nesne isteyecektir. Bu nesne enteresan bir nesnedir.            //bizim belirttiğimiz şifreyi char tipinde bir array içerisinde tutmaktadır.            //Dolayısı ile bizim sırf bu işlemi kolaylaştırabilmek için ufak bir method yazmamız gerekmekte. secureStringDonustur methodunu bu yüzden yazdım.            securePwd = secureStringDonustur(sifre);           //methoddan dönen sonucu securePwd propertymize ekledim. (Az sonra kullanacağız)            PSCredential credential = new PSCredential(domain + "\\" + kullaniciAdi, securePwd);            //Bağlantı esnasında kullanacağımız tanımlamamızı oluşturduk.            WSManConnectionInfo conBilgi = new WSManConnectionInfo(new Uri(uri),    shelluri, credential);            //Bağlantı bilgilerini tanımlıyoruz. Burada uri olarak tanımlanan yapı exchange server ınızın bilgisayar ismidir. (Computer propertyde gördüğünüz Full Computer Name)            //shell uri default bir tanımlamadır. Exchange power shelline bağlanacağımızı belirtiyoruz. Her yerde aynıdır.            conBilgi.MaximumConnectionRedirectionCount = 5;            conBilgi.SkipCACheck = true;            try            {                Runspace remoteRunspace = RunspaceFactory.CreateRunspace(conBilgi);                remoteRunspace.Open();                //İşlem yapacağımız runspace'i tanımladık ve bağlantımızı açtık.                var command = new Command("Get-Message");                command.Parameters.Add("-IncludeRecipientInfo");                command.Parameters.Add("Filter", "Status -eq \"Retry\"");                //Burada command ve parametre olarak exchange power shell komutlarını kullanıyoruz. Dilerseniz bu komutları istediğiniz şekilde değiştirip başka işlemlerde yapabilirsiniz.                // Size önerim parametreleri ayrı ayrı yukarıda gözüktüğü gibi yazın. Her ne kadar bu yapı stabil çalışsada sonuçta biz powershellde yazmıyoruz. Burası .net :)                var pipeline = remoteRunspace.CreatePipeline();                pipeline.Commands.Add(command);                var results = pipeline.Invoke();                //İşlem yapısını oluşturduk komut çalıştırmasını başlattık şimdi geldi sıra sonuçları almaya...,                MessageBox.Show(results.Count.ToString());                //Burada ilk olarak çalıştırdığım komut sonucunda kaç data dönecek ona bakıyorum.                foreach (var sonuc in results)                {                    MessageBox.Show(sonuc.Members["Subject"].Value.ToString());                    //Burada ise bana dönen sonuçların Subject kısmında yazan verileri ekrana yazdırıyorum. Burayı özellikle ekledim. Siz Subject kısmında olduğu gibi                    //kolon isimlerini buraya yazıp farklı kolon değerlerinide gösterebilirsiniz.                }                 remoteRunspace.Dispose();                //her zaman olduğu gibi gc nin işini kolaylaştırıp bu runspace'i uçuruyoruz...            }            catch (Exception ex)            {            }        }    } } |
Form1 in cs dosyasını tamamen buraya yapıştırdım. Dizayn kısmına hiç eğilmedim siz dilediğiniz gibi dizayn yapabilirsiniz.
İyi Günler Dilerim,