Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Auf öffentlichen Ordner in ExchangeServer ohne Outlook zugreifen (https://www.delphipraxis.net/167450-auf-oeffentlichen-ordner-exchangeserver-ohne-outlook-zugreifen.html)

Jumpy 30. Mär 2012 10:44

Auf öffentlichen Ordner in ExchangeServer ohne Outlook zugreifen
 
Hallo zusammen,

ich suche einen Weg von einem rechner auf dem kein Outlook installiert ist auf einen öffentlichen Ordner im Exchange Server (<=2003) lesend zuzugreifen. Es ist ein Ordner mit Kontakten.

Ich google und suche seit 3 Stunden und hab auch massig gefunden, aber das hat mich alles nur verwirrt, da es doch recht viele Schnittstellen zu geben scheint (MAPI,CDO,LDAP,WEBDAV,WEBSERVICES nicht, weil ExS zu alt, ...), und ich immer wieder in Sackgassen lande (z.B. klang ADO plus OLE DB Provider interessant, bis ich dann gemerkt habe, dass das Programm dazu auf dem Exchange Server selber laufen muss). Andere Schnittstellen kommen nur an die Mails (SMTP,POP3).
Viele Beispiele (auch hier in der DP) findet man auch zur "fernsteuerung" von Outlook, aber das steht mit nicht zur Verfügung.

Kann mir da jemand einen konkreten Weg aufzeigen (ohne Kostenpflichtige Komponenten), ich bin gerade echt ratlos.

mkinzler 30. Mär 2012 10:46

AW: Auf öffentlichen Ordner in ExchangeServer ohne Outlook zugreifen
 
Ist OWA installiert/aktiviert?

Coffeecoder 30. Mär 2012 10:56

AW: Auf öffentlichen Ordner in ExchangeServer ohne Outlook zugreifen
 
Zitat:

Zitat von mkinzler (Beitrag 1159393)
Ist OWA installiert/aktiviert?

Mit OWA ist das kein Problem, mach ich auch immer wenn die Arbeit mich nicht loslässt zuhause ;)

Jumpy 30. Mär 2012 11:42

AW: Auf öffentlichen Ordner in ExchangeServer ohne Outlook zugreifen
 
OWA ist installiert, hab ich gerade gehört und auch mal den Zugriff per Browser getestet.

Wie würde man das denn in einem Programm umsetzen?
Ich hab das oben vllt. undeutlich formuliert, ich will mir die Kontakte nicht anschauen, sondern ein Programm soll aus den Kontakten nur Name, Firma und Telefonnummer raussuchen und das nachher in einer DB speichern.

Sharky 30. Mär 2012 11:52

AW: Auf öffentlichen Ordner in ExchangeServer ohne Outlook zugreifen
 
Hai Jumpy,

hast Du dir einmal diese Seite angesehen?

http://www.msxfaq.de/code/webdav.htm

Jumpy 30. Mär 2012 13:03

AW: Auf öffentlichen Ordner in ExchangeServer ohne Outlook zugreifen
 
Ja, das war eine von denen ich die Infos über die ganzen möglichen Schnittstellen her hatte. WebDAV hat ich auch schon laut der Beschreibung gedacht, dass das was sein könnte. Gibt's da eine kostenlose Komponente und vllt. ein Tutorial, wie man sowas nutzt, irgendwo?

Mach mich mal auf die DP-Suche, freu mich aber weiter, falls jemand von euch noch andere oder konkretere Tipps hat, bzw. sowas vllt. schon mal gemacht hat und mir da eine Anleitung geben könnte.

shmia 30. Mär 2012 14:36

AW: Auf öffentlichen Ordner in ExchangeServer ohne Outlook zugreifen
 
"Eigentlich" wäre das Protokoll IMAP genau das Richtige für deine Anforderungen.
Meine Tests um auf einen Exchange-Server mit Thunderbird zuzugreifen haben allerdings nicht funktioniert.
Man müsste wohl IMAP im Exchange-Server explizit freischalten.

Jumpy 2. Apr 2012 13:45

AW: Auf öffentlichen Ordner in ExchangeServer ohne Outlook zugreifen
 
Zitat:

Zitat von shmia (Beitrag 1159443)
"Eigentlich" wäre das Protokoll IMAP genau das Richtige für deine Anforderungen.
Meine Tests um auf einen Exchange-Server mit Thunderbird zuzugreifen haben allerdings nicht funktioniert.
Man müsste wohl IMAP im Exchange-Server explizit freischalten.

Hallo,
habs heute morgen mal mit IMPA4 und folgendem Code versucht.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  t,s:TStringList;
  msg:TIdMessageCollection;
  mp:TIdHeaderList;
  i,j:Integer;
begin
  t:=Tstringlist.Create;
  s:=Tstringlist.Create;
  msg:=TIdMessageCollection.Create(TIdMessageItem);
  IM.Connect();
  Memo1.Lines.Add(IM.GreetingBanner);
  IM.SelectMailBox('Kontakte');

  IM.RetrieveAllMsgs(msg);
  for i := 0 to msg.Count - 1 do
   begin
   msg.Messages[i].SaveToFile('c:/Test/Test'+IntToStr(i)+'.txt');
   Memo1.Lines.Add(IntToStr(i));
   Memo1.Lines.Add(msg.Messages[i].Body.Text);
   Memo1.Lines.Add('-------------------------------------');
   end;
  IM.Disconnect(True);
  t.Free;
  s.Free;
  msg.Free;
end;
Connection klappt, ich krieg auch den Inhalt des Kontaktordners, aber irgendwie als Mail bzw. Messages interpretiert. Schau ich mir davon den Body usw. an, finde ich aber nicht die Einträge der Kontaktem z.B. Adresse.
Kann das sein, das IMAP da doch nicht das richtige ist?

shmia 2. Apr 2012 16:17

AW: Auf öffentlichen Ordner in ExchangeServer ohne Outlook zugreifen
 
Zitat:

Zitat von Jumpy (Beitrag 1159851)
habs heute morgen mal mit IMPA4 und folgendem Code versucht

Bevor du dich ins Programmieren stützt, würde ich erst einmal mit einem IMAP-fähigen EMail-Client testen.
Du hast in deinem 1. Posting von öffentlichen Ordnern gesprochen - da bin ich davon ausgegangen,
dass du auf zentral gespeicherte EMails zugreifen möchtest.

Um auf Kontakte zuzugreifen gibt es natürlich wieder andere Protokolle bzw. APIs :roll:
nämlich MAPI, CDO und LDAP.
MAPI fällt aus, weil kein Outlook vorhanden.
Das gilt auch für CDO.
Na ja und LDAP ist halt nicht wirklich so "lightweight". :?

Jumpy 3. Apr 2012 12:04

AW: Auf öffentlichen Ordner in ExchangeServer ohne Outlook zugreifen
 
Hallo,

ich hab mir jetzt mal WebDAV angeschaut und im Netz eine C# Funktion gefunden, die in etwa das machte, was ich wollte und sie ein wenig angepasst.
Wir hatten C# in der Schule, weswegen ich sie schon verstehe und Anpassungen vornehen konnte, trotzdem brauche ich Hilfe bei der Übersetzung in Delphi.

Ich könnte eine TIdHTTP-Komponente benutzen oder auch eine WebDav-Komponente die es in Indy10 geben soll, aber mein Problem sind

a)
Die ganze XML-Geschichte. Was nimmt man da für Komponenten? Und wie?
So wie ich das Verstanden habe, braucht man das zum Abschicken des Request und dann zum Auswerten der Antowrt? Angeblich gibt es da von MS irgendwelche Objekte/dlls, die man nützen könnte (z.B. XmlDocument). Nur wie?

b)
die Streams. Versteh ich das recht, dass da nicht über die HTTP-Komponente ein Befehl geschickt wird, sondern gestreamt? Oder wird der XML-Kontent gestreamt?

Hier mal die Funktion:

Code:
using System;
using System.Text;
using System.IO;
using System.Net;
using System.Xml;

public static void PrintContactsUsingExchangeWebDAV(string Folders)
        {
            int i=0;
            string server = "http://192.168.XXX.XXX";
            string User = "name";
            string pw = "pass";
            string dom = "domain";
            NetworkCredential credentials = new NetworkCredential(User, pw, dom);
            string uri = string.Format("{0}/public/{1}", server, Folders);
            // Create a byte stream of the SQL query to run against the server
            // This query searches for contacts with the givenName the begins with 'wes'
            // Link to Exchange store property names
            byte[] contents = Encoding.UTF8.GetBytes(string.Format(
               @"<?xml version=""1.0""?>
        <g:searchrequest xmlns:g=""DAV:"">
            <g:sql>
                SELECT
                    ""urn:schemas:contacts:sn"", ""urn:schemas:contacts:givenName"",
                    ""urn:schemas:contacts:email1"", ""urn:schemas:contacts:telephoneNumber""
                FROM
                    Scope('SHALLOW TRAVERSAL OF ""{0}/public/{1}""')
            </g:sql>
        </g:searchrequest>",
            server, Folders));

            HttpWebRequest request = HttpWebRequest.Create(uri) as HttpWebRequest;
            request.Credentials = credentials;
            request.Method = "SEARCH";
            request.ContentLength = contents.Length;
            request.ContentType = "text/xml";
            //request.CookieContainer = new CookieContainer();
            // Keep in mind you may actually want to cache these cookies for other requests
            //request.CookieContainer.Add(GetAuthCookies(server, credentials));

            using (Stream requestStream = request.GetRequestStream())
                   requestStream.Write(contents, 0, contents.Length);
            using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
            using (Stream responseStream = response.GetResponseStream())
            {
                // Process the response as an XML document
                XmlDocument document = new XmlDocument();
                document.Load(responseStream);
                foreach (XmlElement element in document.GetElementsByTagName("a:prop"))
                {
                    // Do work with data returned for each contact
                    i++;
                    Console.WriteLine(i.ToString() + ":");
                    Console.WriteLine("Name: {0} {1}\nEmail: {2}\nPhone: {3}",
                        (element["d:givenName"] != null ? element["d:givenName"].InnerText : ""),
                        (element["d:sn"] != null ? element["d:sn"].InnerText : ""),
                        (element["d:email1"] != null ? element["d:email1"].InnerText : ""),
                        (element["d:telephoneNumber"] != null ? element["d:telephoneNumber"].InnerText : ""));
                    Console.WriteLine("--------------------------------------------------");
                }
            }
        }

Jumpy 10. Apr 2012 09:34

AW: Auf öffentlichen Ordner in ExchangeServer ohne Outlook zugreifen
 
Hallo,

nach einem kurzen Osterurlaub, versuch ich mich weiter daran, den Code aus dem vorherigen Post in Delphi umzusetzen. Erstmal versuch ich nur, die Verbindung herzustellen und ein Suchkommando zu schicken, die Antwort soll dann einfach in ein Memo geschrieben werden.

Aber ich bekomme einen Error: HTTP/1.1 400 Bad Request

Scheinbar bau ich den Request falsch zusammen?

Vielleicht ist auch die ganze Vorgehensweise falsch, da ich nicht wirklich weiß, was ich da mache.

Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
var w:TIdWebDAV;
  content:string;
  s:string;
  c:String;
  AskStream:TMemoryStream;
  ResponseStream:TStringStream;
begin
  content:='<?xml version=""1.0""?>'+
           '<g:searchrequest xmlns:g=""DAV:"">'+
           '<g:sql>'+
           'SELECT '+
           '""urn:schemas:contacts:sn"", ""urn:schemas:contacts:givenName"",'+
           '""urn:schemas:contacts:email1"", ""urn:schemas:contacts:telephoneNumber""'+
           ' FROM '+
           'Scope(''SHALLOW TRAVERSAL OF ""http://192.168.111.157/public/Kontakte""'')'+
           '</g:sql>'+
           '</g:searchrequest>"';

  ResponseStream:=TStringStream.Create(s);
  AskStream:=TMemoryStream.Create;
  w:=TIdWebDAV.Create();
  w.Request.Method:='SEARCH';
  w.Request.Username:=Username;
  w.Request.Password:=Password;
  w.Request.BasicAuthentication:=true;
  w.Request.URL:='http://192.168.111.157/public/Kontakte';
  w.Request.ContentType:='text/xml';
  AskStream.Write(content,Length(content));
  w.DAVSearch('http://192.168.111.157/public/Kontakte',-1,-1,AskStream,ResponseStream);
  Memo1.Lines.Add(ResponseStream.DataString);
  AskStream.Free;
  ResponseStream.Free;
end;

himitsu 10. Apr 2012 09:49

AW: Auf öffentlichen Ordner in ExchangeServer ohne Outlook zugreifen
 
Die XML-Datei sieht komisch aus, vorallem die doppelten "".

Außerdem ist dieses als String deklariert, was spätestens ab Delphi 2009 probleme bereitet, abgesehn davon, daß diese bei dir als ANSI vorliegt, aber da in der XML keine Codierung angegeben ist, sollte sie UTF-8 sein.

Warum wird die XML per Format und nicht über eine XML-Lib erstellt.

Dazu sieht das Ganze sehr nach SOAP oder Ähnlichem aus ... wieso dann nicht gleich das richtige Protokoll und eine passende Komponente verwenden? [edit] Ach du Sch***, wer hat diese Komponente verbrochen?

Jumpy 10. Apr 2012 11:04

AW: Auf öffentlichen Ordner in ExchangeServer ohne Outlook zugreifen
 
Die doppelten "" sind ein Fehler. Hab diesen Block aus der C#-Vorlage (siehe Post 10) entnommen. Da braucht man zwei "" um das erste zu maskieren.

Was die deklararion als String angeht, liegt das daran, dass ich von Streams usw. keine Ahnung habe. In der C#-Version wird es ja auch so gemacht, wie du sagst, mit nem Byte-Array, das aus einem UTF-8 codierten String erstellt wird. Ich weiß halt nur nicht, wie ich das in Delphi machen sollte.

Vielleicht kann mir generell mal wer sagen, wie man einen Stream den man senden will (das ganze wird ja in der Komponente per HTTP verssandt) erstellt/aufbaut (unabh. vom konkreten Inhalt hier).

Was den Aufbau, von dem XML angeht, so ist das halt so ein Pseudo-SQL mit dem man einen WebDAV-Server abfragen kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:19 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