Makale Özeti

Visual Studio ve Outlook interop'u sayesinde Outlook'ta kullandığımız nesnelere kendi yazdığımız uygulamalarımızdan da erişebiliyoruz. Bu sayede ister Outlook'a add-in yazma ister Outlook'dan veri alan veya Outlook'a veri gönderen Windows uygulaması yazma işi oldukça kolaylaşıyor. Ben bu makalemde Visual Studio ile C#'da Outlook Interop'u kullanarak Outlook'daki kontak bilgilerine erişme, yeni kontak ekleme, silme gibi işlemleri kendi uygulamalarımızda nasıl yapabileceğimizden bahsedeceğim. Makaleyi okudukça ve kendiniz de örnek bir uygulama yazınca siz de göreceksiniz, makaledeki bilgilerle sadece kontak işlemleri değil, Outlook'da bulunan ve çoğumuzun kullandığı Appointment, Note, Task ve tabii ki Mail işlemlerini de yapabiliyoruz.

Makale

Visual Studio ve Outlook interop'u sayesinde Outlook'ta kullandığımız nesnelere kendi yazdığımız uygulamalarımızdan da erişebiliyoruz. Bu sayede ister Outlook'a add-in yazma ister Outlook'dan veri alan veya Outlook'a veri gönderen Windows uygulaması yazma işi oldukça kolaylaşıyor.

 Ben bu makalemde Visual Studio ile C#'da Outlook Interop'u kullanarak Outlook'daki kontak bilgilerine erişme, yeni kontak ekleme, silme gibi işlemleri kendi uygulamalarımızda nasıl yapabileceğimizden bahsedeceğim. Makaleyi okudukça ve kendiniz de örnek bir uygulama yazınca siz de göreceksiniz, makaledeki bilgilerle sadece kontak işlemleri değil, Outlook'da bulunan ve çoğumuzun kullandığı Appointment, Note, Task ve tabii ki Mail işlemlerini de yapabiliyoruz.

Benim makalemde yazacağım örnek uygulama Outlook add-in'i değil, daha basit bir Windows uygulaması olacak. İlk olarak yeni bir proje oluşturalım ve Microsoft.Office.Interop.Outlook referansını projemize ekleyelim:

Ardından koda aşağıdaki using ifadesini yazalım:

using Microsoft.Office.Interop.Outlook;

Şimdi ilk iş Outlook'da yeni bir kontak ekleme işlemini yapalım. Formu aşağıdaki gibi dizayn edelim:

Bildiğiniz gibi Outlook'da bir kontağın oldukça fazla bilgisini tutabiliyoruz (yaklaşık 150 adet alan var). Biz uygulamamızda kontak kaydetme işlemini yaparken ad, soyad, e-mail adresi, görev, cinsiyet, doğumgünü, kategori, hobi, son ek, ünvan, tam ad, önem derecesi, resim bilgilerini kaydedeceğiz.

Formu dizayn edip koda geçtikten sonra ilk olarak uygulamamızda kullanacağımız üç nesneyi oluşturalım:

public Form1()
{

            InitializeComponent();
}

 Microsoft.Office.Interop.Outlook.Application insApplication = new Microsoft.Office.Interop.Outlook.Application();
            Microsoft.Office.Interop.Outlook.NameSpace insOutlookNameSpace;
            Microsoft.Office.Interop.Outlook.MAPIFolder insContactsFolder;     

private void Form1_Load(object sender, EventArgs e)
{
            insOutlookNameSpace = insApplication.GetNamespace("MAPI");
            insContactsFolder = insOutlookNameSpace.GetDefaultFolder(OlDefaultFolders.olFolderContacts);

            cmbImportance.DataSource = Enum.GetValues(typeof(OlImportance));
            cmbGender.DataSource = Enum.GetValues(typeof(OlGender));
}

Formda class level Application, NameSpace ve MAPIFolder nesnelerini tanımladık. Kontaklar ile ilgili işlemleri yapabilmek için NameSpace nesnesinin GelDefaultFolder metoduna Outlook folder'larından Contacts'ı parametre olarak geçiriyoruz. OlDefaultFolders enum'u Calendar, Inbox, Junk Mail, Deleted Items, Sent Items, Tasks, Outbox gibi Outlook folder'larını taşır. MAPI namespace nesnesini ise Application nesnesinin GetNamespace metoduna "MAPI" keyword'ünü geçirerek oluşturduk.

Formun load'ında yazdığımız son iki satır kodda ise Importance ve Gender combobox'larına OlImportance ve OlGender enum'larını datasource olarak verdik. Uygulamayı çalıştırdığımızda Importance combobox'ında Low, Normal ve High; Gender combobox'ında ise Unspecified, Female ve Male item'larını göreceğiz.

Şimdi de Insert New Outlook Contact butonunun click event'ine insert kodumuzu yazalım:

private void btnInsertContact_Click(object sender, EventArgs e)
{

            ContactItem insContactItem = (Microsoft.Office.Interop.Outlook.ContactItem)insContactsFolder.Items.Add(Microsoft.Office.Interop.Outlook.OlItemType.olContactItem); 

            //ONEMLI!: veya asagidaki gibi Application nesnesinin CreateItem metodu da kullanilabilir:
            //   ContactItem insContactItem = (ContactItem)insApplication.CreateItem(OlItemType.olContactItem);

            insContactItem.FirstName = txtFirstName.Text;
            insContactItem.LastName = txtLastName.Text;
            insContactItem.JobTitle = txtJobTitle.Text;
            insContactItem.Hobby = txtHobbies.Text;
            insContactItem.FullName = txtFullName.Text; //Dikkat!! FullName veya FirstName LastName property'leri ayni anda set edilirse son atanan property'deki deger oncekini ezer. Bundan dolayi sadece FirstName, LastName veya FullName property'sinin set edilmesi gerekmektedir.
            insContactItem.Gender = (OlGender)cmbGender.SelectedValue;
            insContactItem.Suffix = txtSuffix.Text;
            insContactItem.Email1Address = txtEmailAddress.Text;
            insContactItem.Birthday = dateBirthday.Value;
            insContactItem.Categories = txtCategories.Text;
            insContactItem.Importance = (OlImportance)cmbImportance.SelectedValue;
            if (txtPicture.Text != "")
            {
                insContactItem.AddPicture(txtPicture.Text);
            
}
           
insContactItem.Save();
            MessageBox
.Show("ok!");

}

private void btnUploadPicture_Click(object sender, EventArgs e)
{
            openFileDialog1.ShowDialog();
            if (openFileDialog1.FileName != "")
            {
                txtPicture.Text = openFileDialog1.FileName;
            }
}

Kodda ilk olarak bir ContactItem nesnesi oluşturduk. Bu nesneyi oluştururken instance'ını aldığımız MAPIFolder nesnesinin (insContactsFolder) Items.Add metodunu kullandık. Fakat aynı işlemi instance'ını aldığımız Application nesnesinin (insApplication) CreateItem metodunu kullanarak da yapabilirdik.

ContactItem nesnesini oluşturduktan sonra formdaki alanları teker teker nesnenin property'lerine atadık. Kontağa resim eklemek içinse ContactItem nesnesinin AddPicture metodunu çağırdık ve parametre olarak resmin yolunu verdik. Son olarak da Save metodunu çağırdık. Şimdi uygulamayı çalıştırıp yeni bir kontak ekleyelim.

Kaydettikten sonra Outlook'ta contacts ekranında yeni eklediğimiz kontağımızı görebiliriz:

Şimdi de uygulama ekranındaki ikinci tab'da silme, listeleme gibi bazı işlemleri yapalım. Önce formu aşağıdaki gibi dizayn edelim:

Görüldüğü gibi bu ekranda kontakları listeleme, kopyalama, silme, kontak resmini silme, kontağı Business Card Editor'de gösterme ve Categories ekranını gösterme işlemlerini yapacağız. İlk olarak kontakları listview'de listeleyen butonun kodunu yazalım:

private void ListContacts()
{
            lvContacts.Items.Clear();
           
foreach (ContactItem ci in insContactsFolder.Items)
            {
                lvContacts.Items.Add(new ListViewItem(ci.FullName));
            }
}

void btnListContacts_Click(object sender, EventArgs e)
{
            ListContacts();
}

Kodda görüldüğü gibi çok basit bir şeklide MAPIFolder nesnesinin instance'ınındaki (insContactsFolder) her ContactItem tipindeki item'ları döngü içinde listview kontrolüne ekledik.

Şimdi de sırayla kalan diğer butonların kodunu yazalım:

ContactItem GetSelectedContact(string parFullName)
{
            ContactItem insContactItem = insContactsFolder.Items.OfType<ContactItem>().Where(i => i.FullName == parFullName).First();
            return insContactItem;
}

private void btnCopyContact_Click(object sender, EventArgs e)
{
            ContactItem insContactItem = GetSelectedContact(lvContacts.SelectedItems[0].Text);
           
insContactItem.Copy();
           
ListContacts();
}

private void btnDeleteContact_Click(object sender, EventArgs e)
{
            ContactItem insContactItem = GetSelectedContact(lvContacts.SelectedItems[0].Text);
           
insContactItem.Delete();
           
ListContacts();
}

private void btnRemovePicture_Click(object sender, EventArgs e)
{
            ContactItem insContactItem = GetSelectedContact(lvContacts.SelectedItems[0].Text);
           
if (insContactItem.HasPicture)
            {
                insContactItem.RemovePicture();
                insContactItem.Save();
               
MessageBox.Show("Picture removed");
            }
}

private void btnShowBusinessCardEditor_Click(object sender, EventArgs e)
{
            ContactItem insContactItem = GetSelectedContact(lvContacts.SelectedItems[0].Text);
            insContactItem.ShowBusinessCardEditor();
}

private void btnCategories_Click(object sender, EventArgs e)
{
            ContactItem insContactItem = GetSelectedContact(lvContacts.SelectedItems[0].Text);
            insContactItem.ShowCategoriesDialog();
}

Kalan işlemleri yapmak için listview'de seçili ContactItem'ı almak gerekiyor. Bunun için de GetSelectedContact fonksiyonunu yazdık. Listview'da seçili olan item'ın text'i kontağın FullName property'sindeki değer olduğu için insContactsFolder nesnesinin item'ları arasından FullName property'sinin değerine göre select işlemi yaptık ve fonksiyona ContactItem nesnesini döndürttük.

Ardından kopyalama işlemi için ContactItem nesnesinin Copy, silme işlemi için Delete, resmi silme işlemi için RemovePicture metodunu kullandık. Ancak önemli bir nokta: RemovePicture metodunu çağırdıktan sonra değişiklikleri kaydetmek için Save metodunu da çağırdık. Business Card Editor ekranını açmak için yine ContactItem nesnesinin ShowBusinessCardEditor metodunu çağırdık. Bu butona tıkladığımızda listview'de seçili kontak aşağıdaki gibi görüntülenecektir:

Son olarak da kontağın kategorilerini görüntülemek için ContactItem nesnesinin ShowCategoriesDialog metodunu çağırıyoruz. Bu butona tıkladığımızda da listview'de seçili kontağın kategorileri aşağıdaki gibi görüntülenecektir:

Son olarak bir kontağı nasıl update edebileceğimizi kısaca göstermek istiyorum:

void UpdateContact()
{
            ContactItem insContactItem = GetSelectedContact(lvContacts.SelectedItems[0].Text);
            insContactItem.FirstName = "Ad";
            insContactItem.LastName = "Soyad";
            //...
            insContactItem.Save();
}

Görüldüğü gibi bir kontağı update etmek için ilgili kontağı bir ContactItem nesnesine atamanız ve güncellemek istediğiniz property'lerini set ettikten sonra Save metodunu çağırmanız yeterli olacaktır.

Not: Yapılan uygulama makalede anlatılanlara örnektir, bu yüzden herhangi bir validation veya hata yakalama işlemi için kod yazılmamıştır.

Işıl Orhanel
isil@isilorhanel.net

 

Örnek uygulama