Outlook-daten (Mails, Folder) auslesen

Home-›Foren-›Outlook-›Outlook VBA-›Outlook-daten (Mails, Folder) auslesen

8 Antworten anzeigen - 1 bis 8 (von insgesamt 8)
  • Autor
    Beitrag
  • #42277
    simlei
    Participant

      Ich suche eine Methode, mit der ich die Ordnerstruktur von Emails und die Emails selbst aus Outlook auslesen kann. Dazu habe ich folgenden Ansatz (in Delphi:)

      [code] var
      Form1: TForm1;
      Outlook: _Application; // OutlookApplication; for D5 users
      NmSpace: NameSpace;

      implementation

      {$R *.dfm}

      procedure TForm1.Button1Click(Sender: TObject);
      var
      Unknown: IUnknown;
      Result: HResult;
      Folder: MAPIFolder;
      begin
      {$IFDEF VER120} // Delphi 4
      Outlook := CoApplication_.Create;
      {$ELSE} // Delphi 5
      Outlook := CoOutlookApplication.Create;
      {$ENDIF}

      NmSpace := Outlook.GetNamespace(\’MAPI\‘);
      NmSpace.Logon(\’\‘, \’\‘, False, False);
      Folder := NmSpace.GetDefaultFolder(olFolderInbox);
      Folder.Display;
      end; [/code]

      Dieser Code ist nach dem Tutorial \“OLE-Automation mit Outlook\  entstanden. Mein Thread im Delphi-Forum, der mich hierher geführt hat: http://www.delphipraxis.net/post753111.html .

      Ich bin recht optimistisch, dass es mit diesem Ansatz funktionieren könnte, da zum Beispiel das Senden einer Mail via Outlook durch dieses Programm (wie im Tutorial beschrieben) funktioniert hat. Nur brauche ich eben noch ein paar Hilfestellungen, die das Tutorial (es ist sehr klein) nicht liefert:

      da ich die Emails aus der Inbox (siehe Code) und aus allen Unterordnern auslesen will, und die Ordnerstruktur auch auslesen will, brauche ich im Grunde folgende Routinen:
      a) alle Unterordner aus einem bestimmten Ordner (Im obigen Code \“Folder\“) auslesen

      b) einen Ordner, zum Beispiel \“Folder\“, einem bestimmten Ordner aus Outlook zuweisen, sodass ich darauf zugreifen kann (Im obigen Code greife ich auf \“Inbox\“ zu; aber das geschieht durch eine Konstante, und da man in Outlook ja auch eigene Folder erstellen kann, die logischweise keine eigene Konstante haben, muss es ja zB auch via Zeichenkette gehen (?)
      ( also zusammengfasst: b) = in einen Ordner in Outlook wechseln )

      c) alle E-Mails eines Ordners auslesen… ich stelle mir das so vor:

      Mit der folgenden Prozedur konnte ich eine Mails absenden. dabei habe ich ein MailItem genutzt:
      [code]procedure TForm1.Button2Click(Sender: TObject);
      var
      MI: MailItem;
      begin
      MI := Outlook.CreateItem(olMailItem) as MailItem;
      MI.Recipients.Add(\’simonjena@gmail.com\‘);
      MI.Subject := \’Greetings, O gorgeous one\‘;
      MI.Body := \’Your web pages fill me with delight\‘;
      MI.Attachments.Add(\’C:\\log.dat\‘, EmptyParam, EmptyParam, EmptyParam);
      MI.Send;
      end; [/code]

      vielleicht kann man für jeden Folder ein array of Mailitems bekommen?

      Ich danke euch vielmals, wenn ihr eine Antwort habt!

      wer hilft, dem wird auch geholfen.
      + Umkehrschluss <=>

      #147575
      MichaelBauer
      Participant

        Dieses Beispiel zeigt, wie Du rekursiv alle Ordner (und alle Items eines Ordners) durchlaufen kannst.

        Jedes Folder-Objekt hat eine Folders-Auflistung. Diese kannst Du über einen Index oder den Namen ansprechen. als Start kannst Du z.B. alle Ordner des Posteingangs nehmen oder über Folder.Parent.Folders alle Ordner des dem Posteingang übergeordneten Orders. Und jedes Folder-Objekt hat auch eine Items-Auflistung, welche den Ordnerinhalt repräsentiert.

        Viele Grüße
        Michael Bauer

        #147579
        simlei
        Participant

          Danke! Das hier hat mir sehr geholfen. Bloß eine Sache klappt noch nicht richtig:
          Bei mir gibt es keine Folder.Parent … gebts da eine Andere Möglichkeit, auf den übergeordneten Ordner zuzugreifen?

          wer hilft, dem wird auch geholfen.
          + Umkehrschluss <=>

          #147580
          simlei
          Participant

            Ich habe entdeckt dass es doch ein Folder.Parent gibt, allerdings ist es vom Typ IDispatch, die Anweisung Folder = Folder.Parent nicht. Eine Idee wie man das lösen kann?

            wer hilft, dem wird auch geholfen.
            + Umkehrschluss <=>

            #147583
            simlei
            Participant

              Es tut mir wirklich leid, noch ein Post… aber das hatte ich wieder mal 5sek nach Posten entdeckt…

              Folder.Items.Item(x) ist auch vom Typ IDispatch, und hat keine vernünftigen Properties wie zB Subject (der Mail), Body, From, CC, usw. Weiß jemand wie ich auf die Mails richtig zugreifen kann?

              wer hilft, dem wird auch geholfen.
              + Umkehrschluss <=>

              #147613
              MichaelBauer
              Participant

                Wenn ich nicht irre, entspricht IDispatch in Delphi dem Object in VB. Du mußt prüfen, ob ein bestimmter Objekttyp vorliegt, z.B. ein MailItem. Ist das der Fall, geht (in vb) folgendes:

                [code]Dim obj as Object
                Dim Mail as Outlook.MailItem

                If TypeOf obj is Outlook.MailItem then
                Set Mail=obj
                Endif[/code]

                Wenn obj nicht vom Typ MailItem ist, würde obige Zuweisung (set mail=obj) einen Fehler auslösen.

                Nach der Zuweisung an eine variable vom Typ MailItem kannst Du auf alle Eigenschaften, die das MailItem veröffentlicht, zugreifen. Wie das in Delphi ist, weiß ich nicht, aber in VB geht es auch über das generische Object:[code]Debug.Print obj.Body[/code]funktioniert problemlos (wenn obj auf ein Objekt verweist, das diese Eigenschaft untersützt); nur wird die eigenschaft nicht über IntelliSense aufgelistet.

                Wie Du Objekttypen (IDispatch->QueryInterface) in Delphi prüfst, weißt Du vielleicht selbst. Da dies hier ein VB(A) Forum ist, sind Deine Chancen, auf Delphi-Kenner zu treffen, etwas geringer.

                Viele Grüße
                Michael Bauer

                #147621
                Unbekannt
                Participant

                  Ich bin mir schon im Klaren darüber, dass hier wenig Delphi-Kenner zu finden sind; aber da diese OLE-Automation ja nicht allein für Delpi entwickelt wurde, ist es ja nicht so problematisch, sprachübergreifend Tipps zu geben, zum Beispiel klingt das mit dem IDispatch logisch… Ich danke dir auch für die Antworten bisher, sie warensehr hilfreich.
                  Ich werde mich mal damit auseinandersetzen, wie das Zuweisen auf MailItems hier funktioniert, diese Frage (mit IDispatch, womit sich Delphi-Profis ja auskennen müssten) habe ich auch deswegen jetzt in ein Delphi-Forum geschrieben.

                  Inzwischen hab ich ein weiteres Problem:
                  Mit \“Folder := NmSpace.GetDefaultFolder(olFolderInbox);\“ kann ich in \“Inbox\“ wechseln, und mit anderen Konstanten auch in \“Deleted Items\“, \“Outbox\“ und \“Sent Mails\“, jedoch nicht (und das ist mir wichtig) in den Überordner, da auch selbst erstellte Ordner in der selben Ebene wie Inbox, usw existieren könne. Vielleicht funktioniert das, wenn ich aus einem Ordner in seinen übergeordneten Ordner wechseln kann (s.o.)… Ganz besonders bin ich daran interessiert, in den Ordner \“Öffentliche Ordner\“ zu kommen! Denn hier lagern bei mir die Menge der Daten die ich haben will.

                  Edit: habe grad gemerkt dass ich nur Gast bin o0 – war nicht angemeldet

                  #147622
                  MichaelBauer
                  Participant

                    Wie gesagt, das Objekt, das von GetDefaultFolder zurückgegeben wird, hat die Parent-Eigenschaft auf jeden Fall. Sollte das in Delphi mit IDispatch nicht gehen, dann verwende eben eine passend deklarierte Variable (As Outlook.MapiFolder).

                    Nur wie Du das in Delphi umsetzt, kann ich Dir nicht sagen.

                    Viele Grüße
                    Michael Bauer

                  8 Antworten anzeigen - 1 bis 8 (von insgesamt 8)

                  Hat Ihnen der Beitrag gefallen?

                  1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Keine Bewertung vorhanden)
                  Loading...