Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#2

AW: Exchange 2019 Globales Adressbuch auslesen und beschreiben

  Alt 15. Apr 2024, 17:22
Hallo,

Experte bin ich in dem Thema nicht, deshalb hab' ich mal 'ne KI bemüht und dabei ist folgendes rausgekommen:
Es gibt eine SOAP-Schnittstelle zum Exchange, zu der Du Dir die WSDL in Delphi importieren könntest, um dann dort zu schauen, ob das Gesuchte dabei ist.

Auf der Seite https://www.emailarchitect.net/eaget...hi.aspx?cat=15 könnte eventuell etwas zu finden sein, was Dir bei Deiner weiteren Forschung behilflich sein könnte.

https://github.com/alescernivec/delp...ObjLib_TLB.pas bietet eine Typelib zum Empfangen und Senden von Mails. Eventuell gibt es ja auch etwas adäquates für die Adressbücher.

Frage- und Antwortspiel mit der KI:
Zitat von Frage:
Ist es möglich, aus einem Delphiprogramm heraus auf das globale Adressbuch eines Exchangeservers 2019 lesend und schreibend via ADO, ODBC, WMI, oder auch einer beliebigen anderen Datenbankschnittstelle, zuzugreifen?
Zitat von Antwort:
Ja, es ist möglich, auf das globale Adressbuch eines Exchange-Servers 2019 aus einem Delphi-Programm heraus zuzugreifen. Allerdings ist dies nicht direkt über ADO, ODBC oder WMI möglich, sondern erfordert die Verwendung von Exchange Web Services (EWS) oder der Exchange Management Shell³.

Die Exchange Management Shell bietet eine Reihe von Cmdlets, wie 'Get-GlobalAddressList', die zum Abrufen von Informationen aus dem globalen Adressbuch verwendet werden können³.

Für den schreibenden Zugriff könnten Sie die Exchange Admin Center verwenden4. Hier können Sie eine neue Rolle namens "Address List Management" erstellen und die Rolle "Address Lists" zuweisen. Dann können Sie Ihr Konto zur Liste der Mitglieder dieser Rolle hinzufügen4.

Bitte beachten Sie, dass dies eine allgemeine Anleitung ist und die genauen Schritte je nach Ihrer spezifischen Konfiguration und Anforderungen variieren können. Es wird empfohlen, einen IT-Experten oder einen Microsoft Exchange-Spezialisten zu konsultieren, um sicherzustellen, dass die Implementierung korrekt und sicher ist.

Es ist auch wichtig zu beachten, dass der Zugriff auf das globale Adressbuch von Exchange Server 2019 bestimmte Berechtigungen erfordert und Datenschutzbestimmungen einzuhalten sind. Stellen Sie sicher, dass Sie alle relevanten Datenschutzgesetze und -richtlinien einhalten, wenn Sie auf diese Daten zugreifen und sie verwenden.

Quelle: Unterhaltung mit Bing, 14.4.2024
(1) Get-GlobalAddressList (ExchangePowerShell) | Microsoft Learn. https://learn.microsoft.com/en-us/po...ew=exchange-ps.
(2) Managing Global Address List in Microsoft 365 (Exchange Online). https://theitbros.com/global-address-list-in-exchange/.
(3) Globale Adressliste – Exchange Server 2019 – Frankys Web Forum. https://www.frankysweb.de/community/...e-adressliste/.
(4) Exchange 2019 GAL not updating automatically - Collaboration .... https://community.spiceworks.com/t/e...tically/769770.
Zitat von Frage:
Können Sie mir ein Beispiel für die Verwendung von EWS in Delphi geben?
Zitat von Antwort:
Ja, ich kann Ihnen ein Beispiel geben. Hier ist ein einfacher Codeausschnitt, der zeigt, wie man EWS in Delphi verwendet, um eine E-Mail zu senden¹:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, EASendMailObjLib_TLB; // Fügen Sie die EASendMail-Einheit hinzu

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

const
  ConnectNormal = 0;
  ConnectSSLAuto = 1;
  ConnectSTARTTLS = 2;
  ConnectDirectSSL = 3;
  ConnectTryTLS = 4;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  oSmtp : TMail;
begin
  oSmtp := TMail.Create(Application);
  oSmtp.LicenseCode := 'TryIt';

  // Setzen Sie Ihre Absender-E-Mail-Adresse
  oSmtp.FromAddr := 'test@emailarchitect.net';

  // Empfänger-E-Mail-Adresse hinzufügen
  oSmtp.AddRecipientEx('support@emailarchitect.net', 0);

  // E-Mail-Betreff setzen
  oSmtp.Subject := 'Einfache E-Mail aus Delphi-Projekt';

  // E-Mail-Text setzen
  oSmtp.BodyText := 'Dies ist eine Test-E-Mail, die aus einem Delphi-Projekt gesendet wurde, bitte nicht antworten';

  // Ihre Exchange-Server-Adresse
  oSmtp.ServerAddr := 'exch.emailarchitect.net';

  // Exchange Web Service Protocol - EWS - Exchange 2007/2010/2013/2016 setzen
  oSmtp.Protocol := 1;

  // Benutzer und Passwort für die Exchange-Benutzerauthentifizierung
  oSmtp.UserName := 'test';
  oSmtp.Password := 'testpassword';

  // Standardmäßig erfordert der Exchange Web Service (EWS) eine SSL-Verbindung
  oSmtp.ConnectType := ConnectSSLAuto;

  ShowMessage('Beginne mit dem Senden der E-Mail ...');

  if oSmtp.SendMail() = 0 then
    ShowMessage('E-Mail wurde erfolgreich gesendet!')
  else
    ShowMessage('Fehler beim Senden der E-Mail mit folgender Fehlermeldung: ' + oSmtp.GetLastErrDescription());
end;

end.
Zitat von Fortsetzung der Antwort:
Bitte beachten Sie, dass Sie Ihre eigene Lizenz, Serveradresse, Benutzernamen und Passwörter verwenden müssen. Dieses Beispiel zeigt, wie man eine einfache E-Mail sendet. Für komplexere Anforderungen, wie das Senden von Anhängen oder HTML-E-Mails, müssen Sie den Code entsprechend anpassen¹.

Es ist auch wichtig zu beachten, dass der Zugriff auf den Exchange Server bestimmte Berechtigungen erfordert und Datenschutzbestimmungen einzuhalten sind. Stellen Sie sicher, dass Sie alle relevanten Datenschutzgesetze und -richtlinien einhalten, wenn Sie auf diese Daten zugreifen und sie verwenden¹.

Quelle: Unterhaltung mit Bing, 14.4.2024
(1) Send Email with Exchange Web Service - EWS in Delphi. https://www.emailarchitect.net/easen...hi.aspx?cat=15.
(2) Retrieve Email from Exchange Server with Web Service (EWS) in Delphi. https://www.emailarchitect.net/eaget...phi.aspx?cat=2.
(3) Delphi - send mail from Office 365 with EWS protocol. https://en.delphipraxis.net/topic/85...otocol/?page=2.
(4) Delphi - send mail from Office 365 with EWS protocol. https://en.delphipraxis.net/topic/85...-ews-protocol/.
Zitat von Frage:
Können Sie mir auch zeigen, wie ich eine Eintrag im globalen Exchange-Adressbuch hinzufügen, ändern, verwenden oder löschen kann?
Zitat von Antwort:
Ja, ich kann Ihnen einige allgemeine Anweisungen geben, wie Sie einen Eintrag im globalen Exchange-Adressbuch hinzufügen, ändern, verwenden oder löschen können. Allerdings erfordert dies die Verwendung der Exchange Management Shell oder des Exchange Admin Centers und nicht direkt von Delphi¹²³.

**Hinzufügen oder Ändern eines Eintrags:**
Um einen Eintrag im globalen Adressbuch zu ändern, können Sie die Exchange Management Shell verwenden und das Cmdlet 'Set-GlobalAddressList' mit der entsprechenden Syntax verwenden¹. Hier ist ein Beispiel:
Code:
#Powershell
Set-GlobalAddressList -Identity "<GALIdentity>" -ConditionalCompany @{Add="Fabrikam"}
Zitat von Fortsetzung der Antwort:
In diesem Beispiel wird der vorhandene GAL namens "Contoso GAL" geändert, indem der Wert "Fabrikam" zum vordefinierten Empfängerfilter hinzugefügt wird¹.

**Löschen eines Eintrags:**
Um einen Eintrag zu löschen, können Sie das Cmdlet 'Remove-GlobalAddressList' verwenden². Hier ist ein Beispiel:
Code:
#Powershell
Remove-GlobalAddressList -Identity "Agency A GAL"
Zitat von Fortsetzung der Antwort:
In diesem Beispiel wird die Adressliste namens "Agency A GAL" entfernt².

Bitte beachten Sie, dass Sie Ihre eigene GAL-Identität verwenden müssen. Diese Beispiele zeigen, wie man grundlegende Änderungen vornimmt. Für komplexere Anforderungen müssen Sie den Code entsprechend anpassen¹².

Es ist auch wichtig zu beachten, dass der Zugriff auf das globale Adressbuch von Exchange Server bestimmte Berechtigungen erfordert und Datenschutzbestimmungen einzuhalten sind. Stellen Sie sicher, dass Sie alle relevanten Datenschutzgesetze und -richtlinien einhalten, wenn Sie auf diese Daten zugreifen und sie verwenden¹².

Quelle: Unterhaltung mit Bing, 14.4.2024
(1) Configure global address list properties in Exchange Online. https://learn.microsoft.com/en-us/ex...ist-properties.
(2) Remove a global address list in Exchange Online. https://learn.microsoft.com/en-us/ex...l-address-list.
(3) How Do I Manage My Contacts In The Global Address List In Exchange?. https://support.intermedia.com/app/a...in-exchange%3F.
(4) Procedures for address lists in Exchange Server | Microsoft Learn. https://learn.microsoft.com/en-us/ex...xchserver-2019.
Zitat von Frage:
Könnte die Exchange Management Shell aus Delphi heraus auch via ShellExecute aufgerufen werden?
Zitat von Antwort:
Ja, es ist möglich, die Exchange Management Shell aus Delphi heraus mit der Funktion 'ShellExecute' aufzurufen. Hier ist ein einfacher Codeausschnitt, der zeigt, wie man 'ShellExecute' in Delphi verwendet, um eine externe Anwendung zu starten¹²45:
Delphi-Quellcode:
uses ShellAPI;

procedure TForm1.Button1Click(Sender: TObject);
var
  cmd: string;
begin
  cmd := 'Pfad\zur\Exchange Management Shell';
  ShellExecute(Handle, 'open', PChar(cmd), nil, nil, SW_SHOWNORMAL);
end;
Zitat von Fortsetzung der Antwort:
In diesem Beispiel wird die Exchange Management Shell gestartet, wenn auf einen Button geklickt wird. Sie müssen "Pfad\zur\Exchange Management Shell" durch den tatsächlichen Pfad zur Exchange Management Shell auf Ihrem System ersetzen¹²45.

Bitte beachten Sie, dass dies nur ein einfaches Beispiel ist und Sie möglicherweise zusätzliche Parameter oder Optionen hinzufügen müssen, abhängig von dem spezifischen Befehl, den Sie ausführen möchten¹²45.

Es ist auch wichtig zu beachten, dass der Zugriff auf die Exchange Management Shell bestimmte Berechtigungen erfordert und Datenschutzbestimmungen einzuhalten sind. Stellen Sie sicher, dass Sie alle relevanten Datenschutzgesetze und -richtlinien einhalten, wenn Sie auf diese Daten zugreifen und sie verwenden¹²45.

Quelle: Unterhaltung mit Bing, 14.4.2024
(1) delphi - use shell execute to run cmd as Admin - Stack Overflow. https://stackoverflow.com/questions/...n-cmd-as-admin.
(2) delphi - Running an external program using ShellExecute - Stack Overflow. https://stackoverflow.com/questions/...g-shellexecute.
(3) How to run command line from Delphi? - Stack Overflow. https://stackoverflow.com/questions/...ne-from-delphi.
(4) Delphi: Execute external Program and pass Parameters - AskingBox. https://www.askingbox.com/tip/delphi...ass-parameters.
(5) Using ShellExecute in Delphi to Launch Applications - Azulia Designs. https://azuliadesigns.com/legacy-cod...xecute-delphi/.
Zitat von Frage:
Und wie könnte ein Aufruf des Exchange Web Services aussehen?
Zitat von Antwort:
Ja, ich kann Ihnen ein Beispiel geben. Hier ist ein einfacher Codeausschnitt, der zeigt, wie man Exchange Web Services (EWS) in Delphi verwendet, um Informationen vom Server abzurufen¹:
Delphi-Quellcode:
unit Unit1;

interface

uses
  SysUtils, Classes, HTTPApp, Rio, SOAPHTTPClient, XSBuiltIns, EWS;

type
  TForm1 = class(TForm)
    HTTPRIO1: THTTPRIO;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  lESB: ExchangeServicePortType;
  request: GetServiceConfiguration;
  Impersonation: ExchangeImpersonation;
  RequestVersion: RequestServerVersion;
  MailboxCulture1: MailboxCulture;
  GetServiceConfigurationResult: GetServiceConfigurationResponse;
  ServerVersion: ServerVersionInfo;
begin
  lESB := HTTPRIO1 as ExchangeServicePortType;
  request := GetServiceConfiguration.Create;
  request.RequestedConfiguration := ArrayOfServiceConfigurationType.Create('UnifiedMessagingConfiguration');
  Impersonation := ExchangeImpersonation.Create;
  RequestVersion := RequestServerVersion.Create;
  MailboxCulture1 := MailboxCulture.Create;
  GetServiceConfigurationResult := GetServiceConfigurationResponse.Create;
  ServerVersion := ServerVersionInfo.Create;

  try
    lESB.GetServiceConfiguration(request, Impersonation, RequestVersion, MailboxCulture1, GetServiceConfigurationResult, ServerVersion);
  finally
    request.Free;
    Impersonation.Free;
    RequestVersion.Free;
    MailboxCulture1.Free;
    GetServiceConfigurationResult.Free;
    ServerVersion.Free;
  end;
end;

end.
Zitat von Fortsetzung der Antwort:
In diesem Beispiel wird die Funktion 'GetServiceConfiguration' aufgerufen, um die Konfigurationsinformationen des Exchange-Servers abzurufen¹. Sie müssen Ihre eigene Serveradresse, Benutzernamen und Passwörter verwenden. Dieses Beispiel zeigt, wie man grundlegende Informationen vom Server abruft. Für komplexere Anforderungen, wie das Hinzufügen, Ändern oder Löschen von Einträgen im globalen Adressbuch, müssen Sie den Code entsprechend anpassen¹.

Es ist auch wichtig zu beachten, dass der Zugriff auf den Exchange Server bestimmte Berechtigungen erfordert und Datenschutzbestimmungen einzuhalten sind. Stellen Sie sicher, dass Sie alle relevanten Datenschutzgesetze und -richtlinien einhalten, wenn Sie auf diese Daten zugreifen und sie verwenden¹.

Quelle: Unterhaltung mit Bing, 14.4.2024
(1) soap - Exchange Web Services with Delphi - Stack Overflow. https://stackoverflow.com/questions/...es-with-delphi.
(2) How to call a webservice method for testing, e.g. from a browser. https://stackoverflow.com/questions/...from-a-browser.
(3) Send Email with Exchange Web Service - EWS in Delphi. https://www.emailarchitect.net/easen...hi.aspx?cat=15.
(4) Retrieve Email from Exchange Server with Web Service (EWS) in Delphi. https://www.emailarchitect.net/eaget...phi.aspx?cat=2.
(5) android - How do I call webservice from Delphi? - Stack Overflow. https://stackoverflow.com/questions/...ce-from-delphi.
(6) undefined. http://misitio.com:8080/miwebservice...ethodname=list.
(7) undefined. http://www.w3.org/2001/XMLSchema-instance.
(8) undefined. http://www.w3.org/2001/XMLSchema.
(9) undefined. http://ws.cdyne.com/WeatherWS/.
(10) undefined. https://api.billysbilling.dk/v1/contacts?wsdl.
Zitat von Frage:
Verfügen der Exchange Web Services (EWS) oder die Exchange Management Shell über eine Typelib, die man in Delphi importieren könnte um damit dann aus Delphi heraus auf den Exchange Web Services (EWS) oder die Exchange Management Shell zugreifen zu können?
Zitat von Antwort:
Es scheint, dass es keine spezifische Typenbibliothek für die Exchange Web Services (EWS) oder die Exchange Management Shell gibt, die direkt in Delphi importiert werden könnte.

Allerdings können Sie die EWS Managed API oder EWS verwenden, um Elemente wie E-Mails, Kontakte, Termine oder Aufgaben von anderen Systemen zu importieren¹. Sie können die EWS Managed API-Methode 'Item.Save' oder den EWS-Vorgang 'CreateItem' verwenden, um die Elemente in einem Exchange-Postfach zu erstellen¹.

Es gibt auch Diskussionen und Beispiele in Delphi-Foren, wie man eine Verbindung zu einer EWS-Schnittstelle herstellt². Es könnte hilfreich sein, diese Ressourcen zu konsultieren, um weitere Informationen zu erhalten.

Bitte beachten Sie, dass Sie möglicherweise zusätzliche Anpassungen vornehmen müssen, um die EWS oder die Exchange Management Shell in Delphi zu verwenden, da die Kompatibilität und die spezifischen Implementierungsdetails von der genauen Version von Delphi und Exchange abhängen können. Es wird empfohlen, die offizielle Dokumentation und die Ressourcen der Community zu konsultieren, um die besten Praktiken und aktuellsten Informationen zu erhalten.

Quelle: Unterhaltung mit Bing, 14.4.2024
(1) Importieren von Elementen mithilfe von EWS in Exchange. https://learn.microsoft.com/de-de/ex...ws-in-exchange.
(2) Exchange Web Services Anbindung - Delphi-PRAXiS. https://www.delphipraxis.net/176119-...anbindung.html.
(3) Exportieren und Importieren von Elementen mit EWS in Exchange. https://learn.microsoft.com/de-de/ex...ws-in-exchange.
Zitat von Frage:
Gibt es eine ausführliche Dokumentation, wenn möglich mit Beispielen in Delphi, für die EWS Managed API?
Zitat von Antwort:
Es gibt eine ausführliche Dokumentation für die EWS Managed API, die von Microsoft bereitgestellt wird¹4. Allerdings scheint es, dass diese Dokumentation hauptsächlich auf .NET und C# ausgerichtet ist und keine spezifischen Beispiele für Delphi enthält¹.

Es gibt Diskussionen und Fragen auf Plattformen wie StackOverflow, wo Entwickler ihre Erfahrungen und Lösungen beim Versuch, die EWS Managed API mit Delphi zu verwenden, teilen². Diese könnten als Ausgangspunkt dienen, um zu verstehen, wie man die EWS Managed API in Delphi implementieren könnte.

Bitte beachten Sie, dass die EWS Managed API letztendlich eine SOAP-API ist². Delphi unterstützt SOAP und Sie könnten versuchen, die WSDL-Importfunktionen in Delphi zu verwenden, um auf die EWS zuzugreifen². Allerdings kann es sein, dass Sie auf einige Herausforderungen stoßen, da nicht alle Dienste gleich gut von den WSDL-Importfunktionen unterstützt werden².

Es wird empfohlen, die offizielle Dokumentation und die Ressourcen der Community zu konsultieren, um die besten Praktiken und aktuellsten Informationen zu erhalten. Es könnte auch hilfreich sein, einen erfahrenen Delphi-Entwickler oder einen Microsoft Exchange-Spezialisten zu konsultieren.

Quelle: Unterhaltung mit Bing, 14.4.2024
(1) Get started with EWS Managed API client applications. https://learn.microsoft.com/en-us/ex...t-applications.
(2) Exchange Web Services (EWS) Managed API reference. https://learn.microsoft.com/en-us/ex...e-for-exchange.
(3) It is possible to use the EWS Managed API from a Delphi Win32 VCL app .... https://stackoverflow.com/questions/...-app-and-how-t.
(4) Erste Schritte mit verwalteten EWS-API-Clientanwendungen. https://learn.microsoft.com/de-de/ex...t-applications.
Und da mich die Antworten nicht wirklich zufriedenstellen, hab' ich einfach noch 'ne zweite KI mit den gleichen Fragen gefüttert. Die Ergebnisse sind ähnlich, aber nicht gleich:
Zitat von Frage:
Ist es möglich, aus einem Delphiprogramm heraus auf das globale Adressbuch eines Exchangeservers 2019 lesend und schreibend via ADO, ODBC, WMI, oder auch einer beliebigen anderen Datenbankschnittstelle, zuzugreifen?
Zitat von Antwort:
Nein, es ist nicht möglich, direkt über ADO, ODBC, WMI oder andere Datenbankschnittstellen auf das globale Adressbuch eines Exchange Server 2019 zuzugreifen. Stattdessen muss man die Exchange Web Services (EWS) Managed API verwenden, um auf die Kontakte und das globale Adressbuch zuzugreifen.

Die EWS Managed API ist eine .NET-Bibliothek, die von Microsoft bereitgestellt wird und es Entwicklern ermöglicht, auf Exchange-Daten wie E-Mails, Kalender, Kontakte usw. über SOAP-Webservices zuzugreifen.

Aus den Suchergebnissen geht hervor, dass es einige Dokumentationen und Beispiele gibt, wie man die EWS Managed API in Delphi-Anwendungen einsetzen kann:

- Der Artikel von EmailArchitect.net zeigt, wie man mit Delphi E-Mails über Office 365 mit moderner Authentifizierung (OAuth 2.0) sendet.[3]
- Der Artikel von Add-in Express enthält C#-Beispiele für die Verwendung der EWS Managed API, die sich auch auf Delphi übertragen lassen.[4]
- Auf Stack Overflow gibt es eine Frage mit Codebeispielen für die Verwendung der EWS Managed API in Delphi.[2]

Insgesamt lässt sich festhalten, dass die EWS Managed API der richtige Weg ist, um in Delphi auf das globale Adressbuch eines Exchange Server 2019 zuzugreifen, und nicht die genannten Datenbankschnittstellen.

Citations:
[1] https://afterlogic.com/news
[2] https://stackoverflow.com/questions/...es-with-delphi
[3] https://www.emailarchitect.net/easendmail/ex/d/24.aspx
[4] https://stackoverflow.com/sitemap-questions-274.xml
[5] https://www.nemasisva.com/resources-...-Platforms.pdf
Zitat von Frage:
Können Sie mir ein Beispiel für die Verwendung von EWS in Delphi geben?
Zitat von Antwort:
Basierend auf den Suchergebnissen kann ich Ihnen ein Beispiel für die Verwendung der EWS Managed API in Delphi geben:

## Beispiel für die Verwendung der EWS Managed API in Delphi

Der Artikel von EmailArchitect.net enthält ein ausführliches Codebeispiel, das zeigt, wie man mit Delphi E-Mails über Office 365 mit moderner Authentifizierung (OAuth 2.0) sendet.[2]

Hier ist ein Auszug aus dem Beispielcode:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, EAGetMailObjLib_TLB;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
  public
  end;

const
  MailServerEWS = 2;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  oClient: TEAGetMailClient;
  oFolder: TEAGetMailFolder;
  infos: TEAGetMailInfoList;
  oInfo: TEAGetMailInfo;
  oMail: TEAGetMailMessage;
  fileName: string;
  localInbox: string;
  oTools: TEAGetMailTools;
begin
  try
    oClient := TEAGetMailClient.Create;
    oClient.ServerType := MailServerEWS;
    oClient.Server := 'outlook.office365.com';
    oClient.UserName := 'user@example.com';
    oClient.Password := 'password';
    oClient.UseSSL := True;

    // Get the default inbox folder
    oFolder := oClient.GetFolderList().Item[0];

    // Select the inbox folder
    oClient.SelectFolder(oFolder);

    // Get the list of emails in the inbox
    infos := oClient.GetMailInfoList();

    // Loop through the emails and save them to disk
    for i := 0 to infos.Count - 1 do
    begin
      oInfo := infos.Item[i];
      oMail := oClient.GetMail(oInfo);
      fileName := localInbox + '\' + oTools.GenFileName(i) + '.eml';
      oMail.SaveAs(fileName, True);
    end;

    // Disconnect from the server
    oClient.Quit;
  except
    on ep: Exception do
      ShowMessage('Error: ' + ep.Message);
  end;
end;

end.
Zitat von Fortsetzung der Antwort:
Dieses Beispiel zeigt, wie man eine Verbindung zu einem Exchange Server über die EWS Managed API herstellt, die E-Mails aus dem Posteingang abruft und lokal speichert. Es verwendet die 'TEAGetMailClient'-Komponente aus der 'EAGetMailObjLib_TLB'-Bibliothek, um die Interaktion mit dem Exchange Server zu vereinfachen.

Beachten Sie, dass Sie die Zugangsdaten ('UserName' und 'Password') sowie den Servernamen ('Server') an Ihre Umgebung anpassen müssen.

Citations:
[1] https://www.rapware.com/ews/introduction
[2] https://www.emailarchitect.net/easen...hi.aspx?cat=15
[3] https://blogs.embarcadero.com/robust...ows-and-macos/
[4] https://www.emailarchitect.net/eaget...phi.aspx?cat=2
[5] https://stackoverflow.com/questions/...es-with-delphi
Zitat von Frage:
Können Sie mir auch zeigen, wie ich eine Eintrag im globalen Exchange-Adressbuch hinzufügen, ändern, verwenden oder löschen kann?
Zitat von Antwort:
Basierend auf den Suchergebnissen kann ich Ihnen zeigen, wie Sie Einträge im globalen Exchange-Adressbuch in Delphi verwalten können:

## Zugriff auf das globale Exchange-Adressbuch in Delphi

Die EWS Managed API bietet Funktionen, um auf das globale Adressbuch eines Exchange Servers zuzugreifen und Kontakte zu verwalten. Hier sind einige Beispiele:

### Kontakt hinzufügen
Um einen neuen Kontakt im globalen Adressbuch anzulegen, können Sie die 'CreateContact'-Methode der 'ExchangeService'-Klasse verwenden:
Delphi-Quellcode:
var
  service: ExchangeService;
  contact: ContactItem;
begin
  service := ExchangeService.Create;
  service.Credentials := NetworkCredential.Create('username', 'password');
  service.AutodiscoverUrl('user@example.com');

  contact := ContactItem.Create(service);
  contact.GivenName := 'John';
  contact.Surname := 'Doe';
  contact.EmailAddresses.Add('john.doe@example.com');
  contact.Save(SendInvitationsMode.SendToNone);
end;
Zitat von Fortsetzung der Antwort:
### Kontakt ändern
Um einen bestehenden Kontakt zu ändern, können Sie die 'Bind'- und 'Update'-Methoden verwenden:
Delphi-Quellcode:
var
  service: ExchangeService;
  contact: ContactItem;
begin
  service := ExchangeService.Create;
  service.Credentials := NetworkCredential.Create('username', 'password');
  service.AutodiscoverUrl('user@example.com');

  contact := ContactItem.Bind(service, ItemId.Create('contactId'));
  contact.GivenName := 'Jane';
  contact.Update(ConflictResolutionMode.AlwaysOverwrite);
end;
Zitat von Fortsetzung der Antwort:
### Kontakt löschen
Zum Löschen eines Kontakts verwenden Sie die 'Delete'-Methode:
Delphi-Quellcode:
var
  service: ExchangeService;
  contact: ContactItem;
begin
  service := ExchangeService.Create;
  service.Credentials := NetworkCredential.Create('username', 'password');
  service.AutodiscoverUrl('user@example.com');

  contact := ContactItem.Bind(service, ItemId.Create('contactId'));
  contact.Delete(DeleteMode.HardDelete);
end;
Zitat von Fortsetzung der Antwort:
### Kontakte abrufen
Um eine Liste aller Kontakte im globalen Adressbuch abzurufen, können Sie die 'FindItems'-Methode verwenden:
Delphi-Quellcode:
var
  service: ExchangeService;
  contacts: FindItemsResults<ContactItem>;
begin
  service := ExchangeService.Create;
  service.Credentials := NetworkCredential.Create('username', 'password');
  service.AutodiscoverUrl('user@example.com');

  contacts := service.FindItems(WellKnownFolderName.GlobalAddressList, new PropertySet(BasePropertySet.FirstClassProperties), new ItemView(100));
  for contact in contacts.Items do
  begin
    // Verarbeiten Sie die Kontakte
  end;
end;
Zitat von Fortsetzung der Antwort:
Beachten Sie, dass Sie für die Authentifizierung Ihre Zugangsdaten ('username' und 'password') sowie die E-Mail-Adresse ('user@example.com') anpassen müssen.

Citations:
[1] https://learn.microsoft.com/de-de/ex...es-in-exchange
[2] https://www.emailarchitect.net/eaget...phi.aspx?cat=2
[3] https://www.delphipraxis.net/211780-...-schritte.html
[4] https://blogs.embarcadero.com/robust...ows-and-macos/
[5] https://afterlogic.com/news
Zitat von Frage:
Könnte die Exchange Management Shell aus Delphi heraus auch via ShellExecute aufgerufen werden?
Zitat von Antwort:
Nein, es ist nicht möglich, die Exchange Management Shell direkt aus Delphi heraus über ShellExecute aufzurufen. Die Exchange Management Shell ist ein PowerShell-basiertes Tool, das auf dem Exchange Server selbst oder auf einem Computer mit installiertem Exchange-Verwaltungstools läuft.

Stattdessen müssen Sie die Exchange Web Services (EWS) Managed API verwenden, um auf die Funktionalität des Exchange Servers zuzugreifen. Die EWS Managed API ist eine .NET-Bibliothek, die es Ihnen ermöglicht, über SOAP-Webservices auf Exchange-Daten wie E-Mails, Kontakte, Kalender usw. zuzugreifen.

Aus den Suchergebnissen geht hervor, dass es einige Beispiele und Anleitungen gibt, wie man die EWS Managed API in Delphi-Anwendungen einsetzen kann:

- Der Artikel von EmailArchitect.net zeigt, wie man mit Delphi E-Mails über Office 365 mit moderner Authentifizierung (OAuth 2.0) sendet.[4]
- Der Artikel von Add-in Express enthält C#-Beispiele für die Verwendung der EWS Managed API, die sich auch auf Delphi übertragen lassen.[3]
- Auf Stack Overflow gibt es eine Frage mit Codebeispielen für die Verwendung der EWS Managed API in Delphi.[2]

Diese Quellen zeigen, dass die EWS Managed API der richtige Weg ist, um in Delphi auf Exchange-Funktionalitäten zuzugreifen, und nicht der direkte Aufruf der Exchange Management Shell über ShellExecute.

Citations:
[1] https://www.delphipraxis.net/211780-...-schritte.html
[2] https://learn.microsoft.com/en-us/po...ew=exchange-ps
[3] https://www.freelancer.de/projects/d...mmands-delphi/
[4] https://www.emailarchitect.net/easen...hi.aspx?cat=15
[5] https://www.emailarchitect.net/eaget...phi.aspx?cat=2
Zitat von Frage:
Und wie könnte ein Aufruf des Exchange Web Services aussehen?
Zitat von Antwort:
Basierend auf den Suchergebnissen kann ein Aufruf des Exchange Web Services in Delphi wie folgt aussehen:
Delphi-Quellcode:
uses
  Microsoft.Exchange.WebServices.Data;

procedure CallExchangeWebServices;
var
  service: ExchangeService;
  contact: ContactItem;
begin
  // Authentifizierung
  service := ExchangeService.Create;
  service.Credentials := NetworkCredential.Create('username', 'password');
  service.AutodiscoverUrl('user@example.com');

  // Kontakt erstellen
  contact := ContactItem.Create(service);
  contact.GivenName := 'John';
  contact.Surname := 'Doe';
  contact.EmailAddresses.Add('john.doe@example.com');
  contact.Save(SendInvitationsMode.SendToNone);

  // Kontakt ändern
  contact := ContactItem.Bind(service, ItemId.Create('contactId'));
  contact.GivenName := 'Jane';
  contact.Update(ConflictResolutionMode.AlwaysOverwrite);

  // Kontakt löschen
  contact := ContactItem.Bind(service, ItemId.Create('contactId'));
  contact.Delete(DeleteMode.HardDelete);

  // Kontakte abrufen
  var contacts: FindItemsResults<ContactItem>;
  contacts := service.FindItems(WellKnownFolderName.GlobalAddressList, new PropertySet(BasePropertySet.FirstClassProperties), new ItemView(100));
  for contact in contacts.Items do
  begin
    // Verarbeiten Sie die Kontakte
  end;
end;
Zitat von Fortsetzung der Antwort:
In diesem Beispiel wird zunächst eine Verbindung zum Exchange Server über die 'ExchangeService'-Klasse hergestellt. Dafür werden die Anmeldedaten ('username' und 'password') sowie die E-Mail-Adresse ('user@example.com') angegeben.

Anschließend werden verschiedene Operationen auf dem globalen Adressbuch durchgeführt:

- Einen neuen Kontakt erstellen
- Einen bestehenden Kontakt ändern
- Einen Kontakt löschen
- Eine Liste aller Kontakte im globalen Adressbuch abrufen

Die Verwendung der 'ContactItem'-Klasse und der entsprechenden Methoden wie 'Create', 'Bind', 'Update' und 'Delete' ermöglicht den Zugriff auf die Kontakte im globalen Adressbuch.

Beachten Sie, dass Sie die Zugangsdaten und E-Mail-Adresse an Ihre Umgebung anpassen müssen.

Citations:
[1] https://learn.microsoft.com/de-de/do...change-ews-api
[2] https://www.msxfaq.de/code/ews.htm
[3] https://www.frankysweb.de/exchange-2...konfiguration/
[4] https://www.msxfaq.de/code/testews.htm
[5] https://granikos.eu/troubleshooting-...aecher-teil-2/
Zitat von Frage:
Verfügen der Exchange Web Services (EWS) oder die Exchange Management Shell über eine Typelib, die man in Delphi importieren könnte um damit dann aus Delphi heraus auf den Exchange Web Services (EWS) oder die Exchange Management Shell zugreifen zu können?
Zitat von Antwort:
Basierend auf den Suchergebnissen lässt sich Folgendes sagen:

Die Exchange Web Services (EWS) verfügen über eine Typelib, die man in Delphi importieren kann, um darüber auf die EWS-Funktionalität zuzugreifen.

Im ersten Suchergebnis[1] wird ein Delphi-Beispiel gezeigt, das die 'EAGetMailObjLib_TLB'-Bibliothek verwendet, um über die EWS-Schnittstelle auf einen Exchange-Server zuzugreifen und E-Mails abzurufen.

Außerdem zeigt das fünfte Suchergebnis[5] ein Delphi-Beispiel, das die 'ExchangeServicePortType'-Klasse aus einer WSDL-Datei verwendet, um auf die EWS-Funktionalität zuzugreifen.

Allerdings gibt es keine Hinweise darauf, dass es eine Typelib für die Exchange Management Shell gibt, die man in Delphi importieren könnte. Die Exchange Management Shell ist ein PowerShell-basiertes Tool, das auf dem Exchange-Server selbst oder auf einem Computer mit installiertem Exchange-Verwaltungstools läuft.

Stattdessen muss man die EWS Managed API verwenden, um über Delphi auf die Funktionalität des Exchange-Servers zuzugreifen. Die EWS Managed API ist eine .NET-Bibliothek, die es ermöglicht, über SOAP-Webservices auf Exchange-Daten wie E-Mails, Kontakte, Kalender usw. zuzugreifen.

Zusammengefasst:
- Die Exchange Web Services (EWS) verfügen über eine Typelib, die man in Delphi importieren kann
- Es gibt keine Typelib für die Exchange Management Shell, die man in Delphi importieren könnte
- Stattdessen muss man die EWS Managed API verwenden, um über Delphi auf die Funktionalität des Exchange-Servers zuzugreifen

Citations:
[1] https://www.emailarchitect.net/eaget...phi.aspx?cat=2
[2] https://www.msxfaq.de/code/testews.htm
[3] https://www.msxfaq.de/code/ews.htm
[4] https://www.emailarchitect.net/easen...vb.aspx?cat=15
[5] https://stackoverflow.com/questions/...es-with-delphi
Zitat von Frage:
Gibt es eine ausführliche Dokumentation, wenn möglich mit Beispielen in Delphi, für die EWS Managed API?
Zitat von Antwort:
Ja, es gibt einige ausführliche Dokumentationen und Beispiele für die Verwendung der EWS Managed API in Delphi:

## Dokumentation und Beispiele in Delphi

### 1. Artikel von EmailArchitect.net
Der Artikel [Delphi - Send email using Microsoft OAuth 2.0 (Modern Authentication) + EWS/Ms Graph API/SMTP protocol from Office 365 in background service](https://www.emailarchitect.net/easendmail/ex/d/24.aspx) zeigt, wie man mit Delphi E-Mails über Office 365 mit moderner Authentifizierung (OAuth 2.0) sendet. Es enthält ausführliche Codebeispiele.[1]

### 2. Artikel von Add-in Express
Der Artikel [Office 365 – Exchange Online examples](https://www.add-in-express.com/creating-addins-blog/office365-exchange-online-examples/) von Add-in Express enthält mehrere C#-Beispiele für die Verwendung der EWS Managed API, die sich auch auf Delphi übertragen lassen.[4]

### 3. Stack Overflow Frage
Auf Stack Overflow gibt es eine Frage mit dem Titel [Exchange Web Services with Delphi](https://stackoverflow.com/questions/27393926/exchange-web-services-with-delphi), die einige Codebeispiele für die Verwendung der EWS Managed API in Delphi enthält.[2]

### 4. Microsoft Dokumentation
Die Microsoft Dokumentation [Get started with EWS Managed API client applications](https://learn.microsoft.com/en-us/exchange/client-developer/exchange-web-services/get-started-with-ews-managed-api-client-applications) enthält ebenfalls ausführliche Schritt-für-Schritt-Anleitungen und Codebeispiele, die sich auf Delphi übertragen lassen.[1]

Insgesamt finden sich in diesen Quellen viele hilfreiche Informationen und Codebeispiele, um die EWS Managed API in Delphi-Anwendungen zu verwenden.

Citations:
[1] https://learn.microsoft.com/en-us/exchange/client-developer/exchange-web-services/get-started-with-ews-managed-api-client-applications
[2] https://stackoverflow.com/questions/27393926/exchange-web-services-with-delphi
[3] https://www.emailarchitect.net/easendmail/ex/d/24.aspx
[4] https://www.add-in-express.com/creating-addins-blog/office365-exchange-online-examples/
[5] https://www.emailarchitect.net/eagetmail/ex/vb/24.aspx
Eine andere KI sagt mir zum Thema delphi unit typelib exchange address book
Zitat:
In order to work with the Exchange Address Book using Delphi, you can utilize a Type Library (TLB) to interact with the Microsoft Exchange Outlook Object Library. Here is a step-by-step guide on how to do it:

Open Microsoft Outlook and create a new profile with the Exchange server information.
Choose “View > Address Book” to open the Address Book.
In the Address Book, select “Tools > COM Add-ins” and check the “Microsoft Exchange Address Book Control” checkbox.
Close Outlook, open Delphi, and go to “Component > Import Component > Import a Type Library”.
Browse for the outllib.dll file, which is usually located in the Outlook installation directory.
Once the TLB is imported, you will see a new component named “Outlook Address Book Control” in the Component Palette.
Drag the component onto your form.
Set the DataSource property of the Address Book Control to a valid TDataSource component that is connected to a TDataSet containing the address book entries.
Set the DisplayColumns property of the Address Book Control to specify which columns to display in the Address Book.
Handle events like OnClick to perform actions when the user selects an item in the Address Book.
Ausgehend von einer weiteren KI könnte aber auch ein Datenbankzugriff im Rahmen des Möglichen sein:
Zitat von Frage:
Ist es möglich, aus einem Delphiprogramm heraus auf das globale Adressbuch eines Exchangeservers 2019 lesend und schreibend via ADO, ODBC, WMI, oder auch einer beliebigen anderen Datenbankschnittstelle, zuzugreifen?
Zitat von Antwort:
Ja, es ist möglich, aus einem Delphi-Programm heraus auf das globale Adressbuch eines Exchange-Servers 2019 lesend und schreibend zuzugreifen, indem man die entsprechende Datenbankschnittstelle verwendet.

Mit ADO (ActiveX Data Objects) oder ODBC (Open Database Connectivity) können Verbindungen zu externen Datenbanken hergestellt und Abfragen ausgeführt werden. Man könnte also eine Verbindung zum Exchange-Server herstellen und Daten aus dem globalen Adressbuch abrufen oder auch neue Daten hinzufügen.

Außerdem ist es möglich, über Windows Management Instrumentation (WMI) auf Informationen des Exchange-Servers zuzugreifen. Man kann mit WMI Abfragen durchführen, um Informationen aus dem globalen Adressbuch zu erhalten.

Es ist wichtig zu beachten, dass der Zugriff auf das globale Adressbuch eines Exchange-Servers sensible Informationen beinhalten kann und die entsprechenden Berechtigungen sowie Sicherheitsmaßnahmen berücksichtigt werden müssen.
Zitat von Frage:
Wie könnte ein entsprechender Delphi-Quelltext aussehen und die muss der Zugriff auf den Exchangeserver eingerichtet und konfiguriert werden?
Zitat von Antwort:
Hier ist ein einfaches Beispiel für Delphi-Quelltext, der den Zugriff auf das globale Adressbuch eines Exchange-Servers 2019 über ODBC demonstriert:
Delphi-Quellcode:
uses
  DB, ADODB;

var
  Connection: TADOConnection;
  Query: TADOQuery;
begin
  Connection := TADOConnection.Create(nil);
  Connection.ConnectionString := 'Provider=MSDASQL;DSN=ExchangeServerDSN;Uid=Benutzername;Pwd=Passwort';

  try
    Connection.Open;

    Query := TADOQuery.Create(nil);
    Query.Connection := Connection;
    Query.SQL.Text := 'SELECT * FROM GlobalAddressBook';

    Query.Open;

    while not Query.EOF do
    begin
      // Hier kann auf die Daten aus dem globalen Adressbuch zugegriffen werden
      // z.B. Query.FieldByName('Name').AsString

      Query.Next;
    end;
  finally
    Query.Free;
    Connection.Free;
  end;
end;
Zitat von Fortsetzung der Antwort:
Um den Zugriff auf den Exchange-Server einzurichten und zu konfigurieren, müssen zunächst die ODBC-Treiber für den Exchange-Server installiert werden. Anschließend muss eine ODBC-Datenquelle (DSN) für den Exchange-Server eingerichtet werden, über die die Verbindung hergestellt wird.

Die Verbindungszeichenfolge im obigen Beispiel zeigt, wie die Verbindung über ODBC mit einem Benutzernamen und Passwort konfiguriert werden kann. Dabei müssen die richtigen Informationen für den DSN, Benutzernamen und Passwort eingesetzt werden.

Es ist auch möglich, andere Datenbankschnittstellen wie ADO oder WMI zu verwenden, um auf das globale Adressbuch zuzugreifen. Die genaue Vorgehensweise hängt jedoch von der jeweiligen Datenbankschnittstelle ab und erfordert entsprechende Konfigurationsschritte.
Leider hab' ich keine Möglichkeit zu prüfen, ob irgendwas von dem Geschriebenen Hand und Fuß hat, aber eventuell sind ja ein paar sinnvolle Quellen oder Denkanstöße dabei.
  Mit Zitat antworten Zitat