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.