۱۳۸۸/۰۲/۳۰

ليست كردن ايميل‌هاي موجود در Global address list


Global Address List يا به اختصار GAL و يا همان Microsoft Exchange Global Address Book ، حاوي اطلاعات تمامي كاربران تعريف شده در Exchange server مايكروسافت است و زمانيكه outlook در شبكه به exchange server متصل مي‌شود، كاربران مي‌توانند با كمك آن ليست اعضاء را مشاهده كرده ، يك يا چند نفر را انتخاب نموده و به آن‌ها ايميل ارسال كنند (شكل زير):


نياز بود تا اين ليست تعريف شده در مايكروسافت اكسچنج، با اطلاعات يك ديتابيس مقايسه شوند كه آيا اين اطلاعات مطابق ركوردهاي موجود تعريف شده يا خير.
بنابراين اولين قدم، استخراج email هاي موجود در GAL بود (دسترسي به همين برگه‌ي email address كه در شكل فوق ملاحظه مي‌كنيد از طريق برنامه نويسي) كه خلاصه آن تابع زير است:
جهت استفاده از آن ابتدا بايد يك ارجاع به كتابخانه COM ايي به نام Microsoft Outlook Object Library اضافه شود.

using System.Collections.Generic;
using System.Reflection;
using Microsoft.Office.Interop.Outlook;

namespace GAL
{
//add a reference to Microsoft Outlook 12.0 Object Library
class COutLook
{
public struct User
{
public string Name;
public string Email;
}

public static List<User> ExchangeServerEmailAddresses(string userName)
{
List<User> res = new List<User>();
//Create Outlook application
Application outlookApp = new Application();
//Get Mapi NameSpace and Logon
NameSpace ns = outlookApp.GetNamespace("MAPI");
ns.Logon(userName, Missing.Value, false, true);

//Get Global Address List
AddressLists addressLists = ns.AddressLists;
AddressList globalAddressList = addressLists["Global Address List"];
AddressEntries entries = globalAddressList.AddressEntries;
foreach (AddressEntry entry in entries)
{
ExchangeUser user = entry.GetExchangeUser();
if (user != null && user.PrimarySmtpAddress != null && entry.Name != null)
res.Add(new User
{
Name = entry.Name,
Email = user.PrimarySmtpAddress
});
}

ns.Logoff();

// Clean up.
outlookApp = null;
ns = null;
addressLists = null;
globalAddressList = null;
entries = null;

return res;
}
}
}
و نحوه استفاده از آن هم به صورت زير مي‌تواند باشد:

List<COutLook.User> data = COutLook.ExchangeServerEmailAddresses("nasiri");
foreach (var list in data)
{
//....
}
در اينجا Nasiri نام كاربري شخص در دومين است (كاربر جاري لاگين كرده در سيستم).
تنها نكته‌ي مهم اين كد، مهيا نبودن فيلد ايميل در شيء AdderssEntry است كه بايد از طريق متد GetExchangeUser آن اقدام شود.