AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi MAPI und Exchange Server, Kontakte auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

MAPI und Exchange Server, Kontakte auslesen

Ein Thema von PASST · begonnen am 4. Aug 2009 · letzter Beitrag vom 3. Nov 2009
Antwort Antwort
PASST

Registriert seit: 30. Mär 2005
Ort: Krefeld
325 Beiträge
 
Delphi 7 Enterprise
 
#1

MAPI und Exchange Server, Kontakte auslesen

  Alt 4. Aug 2009, 15:32
Hallo allerseits,

es geht um den Zugriff per MAPI auf die Kontakte von Outlook, denen z.T. User des Exchange Servers mit Adressen aus dem Active Directory zugrunde liegen.

...Vorab kommt eine längere Umschreibung der Umstände...
Wir führen in einem öffentlichen Kontakt-Ordner des Exchange Server 2003 ein Firmenadressbuch. Die Emailadressen der Kontakte, die dort eingetragen sind, können unterschieden werden nach Usern, die im Exchange Server (bzw. im Active Directory) angelegt sind und Kontakte, die nur als externe SMTP-Adressen vorliegen. Outlook unterscheidet diese dann auch automatisch. Dies lässt sich nicht umgehen!

Greife ich aus Delphi per MAPI darauf zu, erhalte ich für ContactItem.Email1AddressType SMTP bzw. EX angezeigt. Für den Wert ContactItem.Email1Address erhalte ich dann im ersten Fall die tatsächliche SMTP-Emailadresse und im zweiten Fall ein Konstrukt aus der X400-Adresse, so dass sich anhand der OU (Organization Unit) und dem CN (Common Name) die Emailadresse bauen lässt.

...Nun zu meinem eigentlich Problem...
Da der Firmenname sich geändert hat, hat sich auch die Emaildomain geändert. Bei allen Usern des Exchange Servers bzw. des AD ist die neue Email-Domain als Hauptadresse eingetragen worden. Die Kontakte des Firmenadressbuchs dagegen, weisen für ContactItem.Email1Address weiterhin auf die alte X400-Adresse - auch wenn der Kontakt in diesem öffentlichen Ordner neu angelegt wird.

Hat jemand einen Tipp wie ich hier weiterkomme?


Gruß
Peter
  Mit Zitat antworten Zitat
PASST

Registriert seit: 30. Mär 2005
Ort: Krefeld
325 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: MAPI und Exchange Server, Kontakte auslesen

  Alt 5. Aug 2009, 15:31
Ich habe im Internet Can't get SMTP address of contact that shares email address of an Exchange user einen Thread mit dem gleichen Problem gefunden. Den Lösungsweg, der dort gefunden wurde, kann ich leider nicht nachvollziehen. Aber dafür habe ich festgestellt, dass ich über Contact.Email1DisplayName die Standard-SMTP-Adresse auslesen kann.
  Mit Zitat antworten Zitat
Borschti

Registriert seit: 1. Nov 2007
Ort: Marburg Lahn
235 Beiträge
 
Delphi 2007 Professional
 
#3

Re: MAPI und Exchange Server, Kontakte auslesen

  Alt 29. Okt 2009, 13:15
Hi, ich habe zZ. ein ähnliches Problem, ich versuche einen Kontakt in einen KontaktOrdner in den öffentlichen Ordnern zu schreiben. Kannst du mir da vllt weiter helfen indem du mir deinen Code Postet, bzw wie du überhaupt auf die Öffentlichen Ordner zugreifen konntest?

Wäre echt Super alle anderen die mir mit dem Thema weiter helfen könnten dürfen das natürlich auch Danke für alle hilfreichen und Antworten.

lg Alex
  Mit Zitat antworten Zitat
PASST

Registriert seit: 30. Mär 2005
Ort: Krefeld
325 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: MAPI und Exchange Server, Kontakte auslesen

  Alt 30. Okt 2009, 15:31
Hi Borschti,

ich habe dir mal zwei Proceduren zusammengeschrieben, die ich verwende.

Mit ReadOutlookFillTable lese ich Kontakte aus Outlook in eine Tabelle, mit Write2Outlook schreibe ich in den Kontakt hinein. Wobei ich nicht genau weiß ob die Schreibfunktion auch klappt. Habe gesehen, dass ich diese Procedure gar nicht aktiv verwende

Mach dir mal selber ein Bild:
Delphi-Quellcode:
uses ComObj, Variants;

...

procedure TForm1.ReadOutlookFillTable();
const
  olFolderContacts = $0000000A;
var
  outlook, NameSpace, Contacts, Contact: OleVariant;
  i: Integer;
  s: String;
begin

  memTab.emptyTable;

  Outlook := CreateOleObject('Outlook.Application');
  NameSpace := Outlook.GetNameSpace('MAPI');

  // Hier muss der Anwender aktiv den richtigen Ordner auswählen.
  Contacts := NameSpace.PickFolder;

  If (Contacts.Items.Count = 0)
  then lFehler := true
  else
    try
      s := contacts.items.item(1).lastname;
    except
      lFehler := true;
    end;

  if lFehler
  then begin
    showmessage('Es sind keine Kontakte im Ordner ' + Contacts.Name + ' vorhanden.');
    exit;
  end;

  with memTab do
  begin
    open;
    for i := 1 to Contacts.Items.Count do
    begin
      Contact := Contacts.Items.Item(i);
      append;
      fieldbyname('nachname').asstring := Trim(Contact.LastName);
      fieldbyname('vorname').asstring := Trim(Contact.FirstName);
      fieldbyname('firma').asstring := Trim(Contact.CompanyName);
      fieldbyname('abteilung').asstring := Trim(Contact.JobTitle);
      fieldbyname('department').asstring := Trim(Contact.Department);
      fieldbyname('sortabteilung').asstring := Contact.OfficeLocation;
      fieldbyname('ruf1').asstring := Trim(Contact.BusinessTelephoneNumber);
      if (pos('+49 (meine_vorwahl) mein_ortsanschluss', Contact.BusinessTelephoneNumber) <> 0)
      then begin
        s := Copy(Trim(Contact.BusinessTelephoneNumber), 15, 10);
        if pos('-', s) = 1 then fieldbyname('kurz1').asstring := copy(s, 2, length(s));
      end;
      fieldbyname('ruf2').asstring := Trim(Contact.Business2TelephoneNumber);
      if (pos('+49 (meine_vorwahl) mein_ortsanschluss', Contact.Business2TelephoneNumber) <> 0)
      then begin
        s := Copy(Trim(Contact.Business2TelephoneNumber), 15, 10);
        if pos('-', s) = 1 then fieldbyname('kurz2').asstring := copy(s, 2, length(s));
      end;
      fieldbyname('hotline').asstring := Trim(Contact.CompanyMainTelephoneNumber);
      fieldbyname('fax').asstring := Trim(Contact.BusinessFaxNumber);
      if (pos('+49 (meine_vorwahl) mein_ortsanschluss', Contact.BusinessFaxNumber) <> 0)
      then begin
        s := Copy(Trim(Contact.BusinessFaxNumber), 15, 10);
        if pos('-', s) = 1 then fieldbyname('faxkurz').asstring := copy(s, 2, length(s));
      end;
      fieldbyname('mobil').asstring := Trim(Contact.MobileTelephoneNumber);
      if (pos('+49 (meine_handy_vorwahl) meine_handyvpngruppe', Contact.MobileTelephoneNumber) <> 0)
      then
        fieldbyname('mobilkurz').asstring := Copy(Trim(Contact.MobileTelephoneNumber), 15, 10);

      // Outlook unterscheidet für die Emailadresse (mind.) zwei Formate:
      // die übliche SMTP oder für EX einen Exchange-User im X400-Format
      if Trim(Contact.Email1AddressType) = 'SMTP'
      then
        fieldbyname('email1').asstring := Trim(Contact.Email1Address)
      else if Trim(Contact.Email1AddressType) = 'EX'
      then begin
        fieldbyname('email1').asstring := Trim(copy(Contact.Email1DisplayName,
                                                    pos('(', Contact.Email1DisplayName) +1,
                                                    length(Contact.Email1DisplayName) - pos('(', Contact.Email1DisplayName) -1
                                                    ));
      end;
     
     ...diverses...Zeugs...
     
      post;
    end; // for i..
    first;
  end; // with memTab

  Outlook := Unassigned;
end;



procedure TForm1.Write2Outlook();
type
  TAbteilung = Array [1..20] of String;
const
  olFolderContacts = $0000000A;
var
  outlook, NameSpace, Contacts, Contact: OleVariant;
  i, j: Integer;
  aAbt: TAbteilung;
begin

  // Die Reihenfolge der Element gibt nachher die Sortierung im Ausdruck vor.
  aAbt[1] := 'Ein_Abteilungsname';
  aAbt[2] := 'Noch_ein_Abteilungsname';
  aAbt[3] := '...';
  ...

  Outlook := CreateOleObject('Outlook.Application');
  NameSpace := Outlook.GetNameSpace('MAPI');
  Contacts := NameSpace.GetDefaultFolder(olFolderContacts).Folders.Item('Firma');
  for i := 1 to Contacts.Items.Count do
  begin
    Contact := Contacts.Items.Item(i);

    if Trim(Contact.JobTitle) = ''
    then begin
      Contact.JobTitle := Trim(Contact.JobTitle);
      Contact.OfficeLocation := '99';
      Contact.Save;
    end
    else begin

      for j := 1 to length(aAbt) do
      begin
        if Trim(Contact.JobTitle) = aAbt[j]
        then begin
          Contact.JobTitle := Trim(Contact.JobTitle);
          if (j < 10)
          then
            Contact.OfficeLocation := '0' + inttostr(j)
          else
            Contact.OfficeLocation := inttostr(j);
          Contact.Save;
          // Schleife abbrechen brauche nicht weitersuchen!
          break;
        end;
      end; // for j..

    end; // if trim(..) else

  end; // for i..
  Outlook := Unassigned;

end;
  Mit Zitat antworten Zitat
Borschti

Registriert seit: 1. Nov 2007
Ort: Marburg Lahn
235 Beiträge
 
Delphi 2007 Professional
 
#5

Re: MAPI und Exchange Server, Kontakte auslesen

  Alt 3. Nov 2009, 15:24
Hi,

Danke für deine Hilfe, allerdings konnte ich das was ich brauchte schon alleine lösen. Aber jetzt stehe ich vor dem nächsten Problem für das mir dein Code eigentlich sehr hilfreich sein könnte.

Also, bis jetzt habe ich mir eine MAPIFolder über
Delphi-Quellcode:
  OutlookApp := TOutlookApplication.Create(Self);
  NmSpace := OutlookApp.GetNamespace('MAPI');

  SettingLog.ContactFolder := NmSpace.PickFolder;
  EdtContactPath.Text := SettingLog.ContactFolder.FullFolderPath;
geholt. Aber jetzt muss ich es irgendwie schaffen die MAPIFolder ohne NmSpace.PickFolder zu holen, ich habe nurnoch den Pfad den Zielordners(Zielkontaktordners) in dieser Form '\\Öffentliche Ordner\Alle Öffentlichen Ordner\Borrmann\Kontakt-Borrmann'

Also meine Frage: Gibt es eine Methode die mir eine MAPIFolder zurück gibt und diesen oder vllt nur 'Kontakt-Borrmann' als Parameter erwartet? Oder jemand der mir erklären kann wie ich es sonst machen könnte?

Ich hatte aus deinem Codebeispiel mal
Contacts := NameSpace.GetDefaultFolder(olFolderContacts).Folders.Item('Firma'); probiert, das gibt mir aber keine MAPIFolder zurück. Ich bekomme da nur die Fehlermeldung das ein Objekt nicht gefunden wurde :/

Hintergrund ist das ich verschiedene Parameter, unter anderem auch den Namen der MAPIFolder, in einer Datei speichern will um später über den Namen der MAPIFolder dann die MAPIFolder wieder rauszusuchen. Das muss doch irgendwie klappen
Es sollen also Vorlagendateien erstellt werden die dann später einfach wieder in das Programm eingelesen werden können, damit der Benutzer nicht jedes mal alle Konfigurationen tätigen muss.

Hoffe ich habe es verständlich geschildert und ja ich weiß da kommt zu oft das Wort MAPIFolder drinne vor

lg Aex
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz