Home-›Foren-›Outlook-›Outlook VBA-›Outlook-daten (Mails, Folder) auslesen
- This topic has 7 Antworten, 3 Stimmen, and was last updated 09:04 um 24. Juli 2007 by MichaelBauer.
- AutorBeitrag
- 22. Juli 2007 um 14:13 #42277simleiParticipant
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\“) auslesenb) 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 <=>23. Juli 2007 um 06:57 #147575MichaelBauerParticipantDieses 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 Bauer23. Juli 2007 um 10:39 #147579simleiParticipantDanke! 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 <=>23. Juli 2007 um 10:41 #147580simleiParticipantIch 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 <=>23. Juli 2007 um 10:59 #147583simleiParticipantEs 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 <=>23. Juli 2007 um 22:09 #147613MichaelBauerParticipantWenn 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.MailItemIf 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 Bauer24. Juli 2007 um 08:28 #147621UnbekanntParticipantIch 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
24. Juli 2007 um 09:04 #147622MichaelBauerParticipantWie 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 - AutorBeitrag