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.