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.














