Outlook 2007 taaaaka prehistoria, kto jeszcze z tego korzysta? No właśnie kto? Sam nie wiem, ale mi się trafił projekt i musiałem go wspierać. A to znaczy, że pisanie kodu było pisaniem kodu tak by działało pod 2007 z małymi zmianami dla innych wersji. Jedną z takich rzeczy jest odczytywanie adresu email osoby, która wysłała do nas maila a jest to kontakt/osoba z naszego serwera exchange.
Normalnie posiadając obiekt _MailItem to możemy dobrać się (w outlook 2007) do osoby, która do nas wysłała maila za pomocą własności:
mail.SenderEmailAddress;
Prosto i fajnie. Do póki taka osoba nie jest z exchange. Wtedy otrzymujemy coś na w kształcie:
/O=SCN/OU=SDFSDFGSDFG/CN=RECIPIENTS/CN=ASDASFD
Fajny email? Nie :) Więc co możemy zrobić i jak to rozpoznać który to który mail?
Na szczęście istnieje własność:
mail.SenderEmailType
Która dla exchange ma wartość EX. Więc łatwo jest nam odpowiednio zareagować. Tylko jak się dobrać do emaila? Musimy stworzyć obiekt Recipient w outlooku a to znaczy, że potrzebujemy Outlook Name Space (tylko MAPI jest wspierane). Mając obiekt Recipient będziemy mogli dobrać się do AddressEntry a z niego już prosta droga do ExchangeUser… hahaha skomplikowane co?
Brzmi może tak i domyślić się też nie jest łatwo, na szczęście kod jest prosty:
var session = _outlook.Session; var recipient = session.CreateRecipient(mail.SenderEmailAddress); var entry = recipient.AddressEntry; var user = entry.GetExchangeUser(); return user.PrimarySmtpAddress;
W całości to wygląda tak:
private string get_email_address(_MailItem mail)
{
    if (mail.SenderEmailType != "EX")
    {
        return mail.SenderEmailAddress;
    }
    NameSpace session = null;
    Recipient recipient = null;
    AddressEntry entry = null;
    ExchangeUser user= null;
    try
    {
        session = _outlook.Session;
        recipient = session.CreateRecipient(mail.SenderEmailAddress);
        entry = recipient.AddressEntry;
        user = entry.GetExchangeUser();
        return user.PrimarySmtpAddress;
    }
    catch (System.Exception ex)
    {
        _log.Error(ex, "get_email_address|");
    }
    finally
    {
        user.Release();
        entry.Release();
        recipient.Release();
        session.Release();
    }
    // whatever…
    return mail.SenderEmailAddress;
}
Znów prosta nawet rzecz, zajęła mi 3h. Może więc komuś się przyda.











 
        


