Salut,
Am o mare problema. Imi trebuie sa obtin adresa de mail de la sender, folosind un add-in de Outlook (2003/2007).
Problema mea este ca daca mail-ul a fost trimit de cineva aflat in LAN (prin Exchange server), cand incerc sa extrag adresa sender-ului primesc o adresa in format x.400 (Ex randomly found on the net: /G=Telemedia/S=Asiakaspalvelu/OU=Tele/O=TELEBOX/CN=robertce). si mie imi trebuie adresa standard cu care suntem toti obisnuiti, adresa SMTP.
O solutie ar fi fost sa caut contactul dupa nume in Contacts si sa extrag de acolo adresa de e-mail alternativa SMTP. Dar fiind vorba de Exchange server (Active Directory), nu avem local contacts ci doar Shared.....in GAL (Global Address List).
Cautand in GAL pot obtine un obiect AddressEntry corespunzator sender-ului dar aici problema este ca nu sunt expuse proprietati cu care sa obtin adresa alternativa din contact. Si singurele solutii pe care le-am gasit pana acum au fost aplicatii 3rd party gen CDO sau Redemption for Outlook, care expun proprietati ale obiectului MAPI (care nu este expus deloc in Outlook Object Model). Dar nu doresc sa recurd la 3rd party apps.
Any solution?
dutzu: Cautand in GAL pot obtine un obiect AddressEntry corespunzator sender-ului dar aici problema este ca nu sunt expuse proprietati cu care sa obtin adresa alternativa din contact.
Cautand in GAL pot obtine un obiect AddressEntry corespunzator sender-ului dar aici problema este ca nu sunt expuse proprietati cu care sa obtin adresa alternativa din contact.
? Marturisesc ca aici m-am blocat. E clar ca adresa se afla in GAL, ...dar ... ?
Ignat Andreihttp://serviciipeweb.ro/iafblog
intr-un final am gasit o "solutie" dar dupa cateva discutii am decis sa renuntam cu totul la chestia cu conversia adresei de mail de la x.400 la smtp din cauza ca e vorba de soft 3rd party.
Solutia ar fi fost sa folosim tool-uri 3rd party gen CDO 2.1 sau Redemption for outlook. Acestea expun proprietati ale obiectelor MAPI si iti dau acces la campurile necesare pentru a obtine informatiile necesare.
Pt. cine se loveste de problema asta......use Redemption (in plus fata de CDO, reuseste sa "evite" niste restrictii de securitate).
Ok.....new solution :)
Deci, din outlook, daca esti in cadrul unui AD cu Exchange server, daca in Mail Item te uiti la sender address vei obtine ceva de genu /G=Telemedia/S=Asiakaspalvelu/OU=Tele/O=TELEBOX/CN=robertce. Ceea ce nu-ti prea e de folos in prima faza. Solutia ca sa extragi adresa SMTP a senderului este sa interoghezi direct AD-ul folosind aceasta adresa.
Solutia am gasit-o intr-un final aici si este dupa cum urmeaza:
Pentru Outlook 2007 este foarte simplu pentru ca object model-ul de la Outlook 2007 contine clasa ExchangeUser si poti lua AddressEntry-ul de la sender si sa faci apoi o instantiere a clasei Exchange User astfel:
ExchangeUser objUser = sender.AddressEntry.GetExchangeUser();
...dupa care puteti extrage toate detaliile user-ului folosind proprietatile expuse de obiectul ExchangeUser.
Acum partea dificila, pentru Outlook 2003 trebuie sa interogam direct AD-ul folosind System.DirectoryServices folosind adresa returnata de Outlook, adresa de tip LegacyExchangeDN (LEDN).
See code below:
string LEDN = "/O=ms/OU=east/cn=Recipients/cn=whatever";
DirectoryEntry objRootDSE = new DirectoryEntry("GC://RootDSE");
String strRoot = objRootDSE.Properties["rootDomainNamingContext"].Value.ToString();
DirectoryEntry objRoot = new DirectoryEntry("GC://" + strRoot);
objRoot.RefreshCache();
DirectorySearcher objSrch = new DirectorySearcher(objRoot);
objSrch.Filter = "(&(objectClass=user)(objectCategory=person)(legacyExchangeDN= " + LEDN + "))";
objSrch.SearchScope = SearchScope.Subtree;
DirectoryEntry objUser = new DirectoryEntry();
objUser = objSrch.FindOne().GetDirectoryEntry();
Console.WriteLine("Mobile:" + objUser.Properties["mobile"].Value);
Console.WriteLine("Number:" + objUser.Properties["telephoneNumber"].Value);
Console.WriteLine("Department:" + objUser.Properties["department"].Value);
La o prima cautare, nu am gasit pe MSDN o lista cu toate proprietatile expuse de DirectoryEntry dar pentru exemple puteti sa va uitati aici. Eu am facut o aplicatie mica bazata pe codul de mai sus cu care sa vad cam ce proprietati exista (code below) :
System.DirectoryServices.PropertyCollection objUserDetails = objUser.Properties;
foreach (string sName in objUserDetails.PropertyNames)
{
if (objUserDetails[sName].Value != null)
AddText(sName + " = " + objUserDetails[sName].Value);
if (objUserDetails[sName].Count > 1)
foreach (object objValue in objUserDetails[sName])
AddText(" - " + objValue.ToString());
}
else { AddText(sName + " is null"); }