Die Verwendung von E-Mail breitet sich immer weiter aus. Mit E-Mail können Nachrichten auch an entfernte Standorte übermittelt werden, die nicht direkt im Netz erreichbar sind.
Die Nutzung zu reinen Nachrichtenübermittlung ist nur der Anfang. Es ist möglich die Funktionen von E Mails auch programmatisch anzusprechen und so E-Mails von Anwendungen verschicken und lesen zu lassen.
In der Session werden die Möglichkeiten gezeigt, die ein Entwickler heute mit VFP hat um per Exchange Mails (das kann auch heißen Faxe) zu verschicken.
Speziell werden die Funktionen der mitgelieferten MAPI OCX Controls erläutert und gezeigt wie diese in eine Maske integriert werden können.
Im zweiten Teil wird erläutert, wie alternativ mit der Möglichkeit der OLE Automation der Exchange Client zum Empfangen und Senden von E-Mails angesteuert werden kann.
In der Version 2.6 von FoxPro bestand bereits die Möglichkeit zum Versenden und Empfangen von E Mails mit MS Mail. Dies geschah mit Hilfe der Funktionen aus der FoxMapi.FLL. Diese Bibliothek wird jedoch bei VFP5.0 gar nicht mehr mitgeliefert.
Seit der Version 3.0 von VFP werden zwei OCX Controls mitgeliefert: MAPI Session und MAPI Message mit denen die Mail Funktionen zur Verfügung stehen. Als reine 32 Bit Controls sind sie jedoch nicht unter Windows 3.x einsetzbar.
Unter Windows 95 und Windows NT bieten diese Controls eine Möglichkeit E Mail Funktionen verwenden zu können.
Mit der Technik der OLE Automation kann der Exchange Client als OLE Server angesprochen werden um E Mail Funktionen von einem VFP Programm aus zu nutzen. Beim Einsatz dieser Möglichkeit ist es nötig Informationen über die Objekte des Exchange Clients und deren Eigenschaften und Methoden zu haben (siehe MAPI_Objects.DOC auf der Begleitdiskette).
Unter FP 2.6 war dies die einzige Möglichkeit E-Mail von FoxPro aus ansprechen zu können. Durch diese Bibliothek werden Funktionen zum Empfangen und Versenden von Nachrichten zur Verfügung gestellt. Es müssen verschieden Cursors zur Verwendung der Funktionen aufgebaut werden. Dies kann sowohl mit MS-Mail, als auch mit MS-Exchange geschehen. Unter VFP ist diese Bibliothek ebenfalls einsetzbar allerdings nur unter Windows 3.x und Windows NT (zumindest bis Version 3.51). Unter Windows 95 funktioniert die Bibliothek nicht. Es ist nicht geklärt warum dies so ist. Bei der neuen Version von VFP wird die Bibliothek gar nicht mehr mitgeliefert. Es gibt jetzt andere und einfachere Möglichkeiten E-Mail in VFP Programme einzubinden. Falls an dieser Möglichkeit E-Mails zu verschicken Interesse besteht, kann als Literatur der FoxPro Advisor Ausgabe Dezember 1996 empfohlen werden, der einen Artikel zu dem Thema enthält. Wenn der Bedarf besteht aus Windows 95 unter FP 2.6 Mail zu senden gibt es im FOXFORUM auf Compuserve ein Tool mit dem dies möglich sein soll (ohne Gewähr).
Seit VFP 3.0 werden zwei OLE Container Controls ausgeliefert, die die MAPI Funktionen auf Masken von VFP bringen. Die Controls sind unter Windows 95 und Windows NT einsetzbar. Die größte Schwierigkeit bisher (VFP 3.0) war die fehlende Dokumentation zu diesen Controls. Bei VFP 5.0 wird nun eine Hilfedatei zu allen OCX Controls mitgeliefert (es handelt sich um die Visual Basic Hilfe). Die Hilfe ist im CTRLHELP Unterverzeichnis des VFP5 Verzeichnisses zu finden. Die Hilfe zu den beiden MAPI Controls sind unter ‘System’ zu finden. Die Controls stellen Eigenschaften und Methoden zur Verfügung um MAPI Funktionen anzusprechen. Das heißt es können E-Mails empfangen und gesendet werden.
Mit dem Session Control wird eine Mail Session verwaltet. Die Session kann in einem MAPI kompatiblen Mail Tool eröffnet werden. Das heißt es kann sowohl MS Mail, als auch Exchange verwendet werden. Dazu wird eine Methode des Session Controls ausgeführt: SignOn. Mit den Eigenschaften dieses Controls wird gesteuert wie das Login zu der Session geschehen soll:
LogonUI (logisch): Diese Eigenschaft bestimmt, ob eine Dialog Box beim Eröffnen der Session angezeigt werden soll oder nicht
NewSession (logisch): Dieses aFlag bestimmt ob eine neue Session eröffnet werden soll wenn bereits eine Mail Session (Exchange) besteht oder ob die bestehende Session verwendet werden soll.
Username (String): Hier kann der Username für das Eröffnen der Session angegeben werden. Achtung: Bei Exchange ist hier der Name des Profils einzutragen.
Password (String): Das Passwort für die Eröffnung der Session. Das Passwort kann bei Exchange weggelassen werden.
DowloadMails (logisch): Dieses Flag bestimmt ob zu Beginn der Session ein Abgleich für alle Offline Dienste (Internet Mail, Compuserve Mail, Remote Mail) gemacht werden soll oder nicht. Achtung!: Der Defaultwert für diese Eigenschaft ist .T. . Das heißt es werden alle definierten offline Verbindungen kontaktiert wenn die Session gestartet wird.
Das Control dient nur zum Eröffnen und Schließen einer Session. Wichtig ist die SessionID die von der SignOn Methode zurückgeliefert/gesetzt wird. Diese ID wird benötigt um mit dem Message Control auf die Nachrichten zugreifen zu können.
Zum Schließen einer Mail Session wird die SignOff Methode ausgeführt.
Das Message Control dient der Verwaltung von Messages. Die Steuerung des Controls geschieht über Eigenschaften des Objekts. Die meisten Eigenschaften sind zur Designzeit nicht verfügbar, da sie Eigenschaften von Messages enthalten und diese beim Design noch nicht vorhanden sind.
Die Verbindung zur Session geschieht über die SessionID. Es muß also um mit diesem Control zu arbeiten zuerst die SessionID von der Session (Session OCX) übertragen werden.
Um Messages in den Puffer des Controls zu laden, wird die fetch() Methode ausgeführt. Danach stehen alle Messages zur Verfügung und können durch Verändern der MsgIndex Eigenschaft durchgeblättert werden. Die Anzahl der Messages steht in MsgCount.
Vorsicht!: Der MsgIndex beginnt bei 0 und geht daher nur bis MsgCount -1.
Als weitere steuernde Eigenschaften können FetchSorted und FetchUnreadOnly verwendet werden. Mit FetchUnreadOnly = .T. werden nur Messages geholt, die noch nicht gelesen wurden. Mit FetchSorted = .T. werden die Nachrichten in Eingangsreihenfolge gelesen. Mit FetchSorted = .F. werden die Nachrichten in derselben Reihenfolge gelesen, wie sie in der InBox des Benutzers auftauchen würden.
Weitere Eigenschaften:
Achtung!: beim ‘normalen’ Einlesen von Mails ist die Nachricht mit MsgIndex = 0 die älteste Mail!
Eine neue Nachricht wird angelegt durch den Aufruf der Methode Compose(). Alternativ kann der MsgIndex auf -1 gesetzt werden. Es werden dabei alle Nachrichten Eigenschaften leer angelegt und können danach gefüllt werden. Die Nachricht kann zusammengestellt werden mit den Empfängern, dem Betreff, dem Nachrichtentext und eventuell mit Anlagen. Versandt wird die Nachricht erst, wenn die Methode Send() aufgerufen wird.
Anhänge zu einer Nachricht werden in einer Collection verwaltet. Für die Verwaltung der Anhänge gibt es die Eigenschaften AttachmentCount (Anzahl der Attachments) und AttachmentIndex (zur Bestimmung des aktuellen Attachments). Wenn eine Mail einen Anhang enthält, so ist in der Eigenschaft AttachmentPathName der Ort abgelegt wo die Anlage zu finden ist. Wenn die Anlage in der Mail enthalten ist so verweist dieser Pfad auf das temporäre Verzeichnis des Betriebssystems. Bei einer Verbindung zum Original (Link) kann der Name der verbundenen Datei direkt dort gefunden werden. Die Anlage kann von dort aus kopiert/gesichert werden. Die Datei wird bei der Beendigung der Session wieder aus dem temporären Verzeichnis gelöscht.
Eine weitere Möglichkeit um aus VFP Mails zu versenden, besteht mittels OLE Automation. Bei dieser Möglichkeit wird der Exchange Client als OLE Server eingesetzt.
Bei dieser Variante wird Exchange per OLE Automation angesteuert, wie das auch mit Word oder Excel möglich ist (siehe auch Session OLE-Automation mit WinWord und Excel D-OLE).
Als erste Voraussetzung für das hier beschriebene Vorgehen muß der Exchange Client auf dem PC installiert sein. Es kann sich dabei entweder um die Version, die mit Windows 95 ausgelifert wird (mit Service Pack 1), oder den Client für den Exchange Server handeln.
Es wird von VFP aus ein Objekt erstellt, das dann als (Objekt)Referenzen jeweils Collections mit den darunterliegenden Ebenen enthält. Für die Collections legt man am besten eigene Objektreferenzen in VFP Variablen ab.
Die Hierarchie sieht im Einzelnen wie folgt aus: Auf der obersten Ebene gibt es ein Session Objekt dies enthält eine Collection von Verzeichnissen (InfoStores) Sowie zwei spezielle Verzeichnisse (vom Typ Folder): InBox und OutBox. Innerhalb der Verzeichnis Objekte gibt es eine Message Collection, die die Message Objekte enthält. Ein einzelnes Message Objekt enthält mehrere Collections von weiteren Objekten: Fields (Felder, für die Verwaltung von Formularen), Attachments, Recipients. Außer den Collections sind noch weitere unterschiedliche Properties zu den einzelnen Objekten vorhanden. Manche Collections haben eine Item und eine Count Eigenschaft. Dann können auch die einzelnen Elemente der Collection mit Item(<Index>) angesprochen werden.
Das Hauptproblem bei der OLE Automation (auch generell) ist die Dokumentation der Eigenschaften und Methoden, die die OLE Server zur Verfügung stellen.
Für die MAPI Objekte gibt es auf der Begleitdiskette ein Dokument (MAPI_Objects.DOC), das die Objekte, Collections, Properties und Methoden beschreibt.
Das Vorgehen im Einzelnen sieht folgendermaßen aus:
Zuerst muß ein Session Objekt erstellt werden. Dies geschieht mit dem ‘normalen’ VFP Befehl oSession = createobject(„Mapi.Session“).
Um mit diesem Session Objekt arbeiten zu können muß ein Logon für die Session durchgeführt werden: oSession.Logon(). Der Logon Methode können Parameter für das Benutzerprofil, das Flag, ob eine Dialogbox erscheinen soll und das Flag, ob eine Session eröffnet werden soll mitgegeben werden.
Nach dem Logon steht im Inbox Objekt eine Messages Collection zur Verfügung mit der die Nachrichten der InBox gelesen werden können. Für das Arbeiten mit den Nachrichten ist es am Besten sich darauf wieder eine Objektreferenz zu erstellen:
oMessages = oSession.InBox.Messages.
Mit den Methoden des oMessages Objektes können die eigentlichen Messages geholt und gelesen/verarbeitet werden. Es gibt dafür die Methoden GetFirst(), GetNext(), GetPrevious(), GetLast(). Außerdem kann die aktuelle Message mit Delete() (Methode der Messages Collection) gelöscht werden.
Die aktuelle Message läßt sich mit der von Getxxx zurückgegebenen Objekt Referenz manipulieren:
oAktMessage = oMessages.GetFirst().
Zur aktuellen Message existieren dann die verschiedenen Eigenschaften wie der Nachrichtentext (oAktMessage.Text), der Betreff (oAktMessage.Subject), eine Collection der Empfänger (oAktMessage.Recipients) usw.. Die einzelnen Empfänger können über oAktMessage.Recipients.Item(<Index>) angesprochen werden, da die Recipient Collection ein Item Property hat.
Das Senden von Message per OLE Automation geschieht ähnlich wie beim OCX Message Control indem zuerst per oAktMessage = oMessages.Add() ein neues Message Objekt erstellt wird. Danach werden die Eigenschaften der neuen Nachricht (Subject, Text, Recipients, usw.) gefüllt und die Nachricht per oAktMessage.Send() verschickt.
Anhänge (Attachments) zu einer Nachricht werden über eine Collection der Message verwaltet. Diese Collection hat eine Item und eine Count Eigenschaft mit der die Anhänge verwaltet werden können. Es gibt jeweils eine Methode für das Zufügen und das Löschen von Anhängen. Der einzelne Anhang hat wiederum die Eigenschaft Name. Um einen Anhang als Datei zu speichern wird die Methode WriteToFile(<File>) verwendet, die als Parameter den Dateinamen erhält, unter dem der Anhang abgespeichert werden soll.
Neue Anhänge werden mit Methode Add() der Attachments Collection erstellt. Die eigentliche Datei kann dann mit der Methode ReadfromFile(<File>) der neuen Message hinzugefügt werden.
Die beiden Methoden Exchange anzusteuern die hier vorgestellt wurden sollen nun zusammenfassend gegenübergestellt werden:
Beide Methoden verwenden die MAPI Schnittstelle von Windows.
Die OCX Objekte können auch mit anderen Mail Systemen, die MAPI kompatibel sind eingesetzt werden (z.B. MS Mail).
Die OLE Automation ist von der Funktionalität her umfangreicher als die OCXe. Die zusätzlichen Funktionen von Exchange (Folder, Forms) können nur per OLE Automation angesprochen werden.
Die OCX Controls können nur auf Masken eingesetzt werden. Um Messages auch in anderen Teilen der Anwendung nutzen zu können, müssen die Objekte der Maske referenziert werden.
Fazit: Die Verwaltung von normalen Messages ist mit den beiden OCX Controls sicher einfacher, während die OLE Automation mehr Möglichkeiten bietet.