Session D-MAPI
Workgrouping mit Visual Foxpro
Friedhelm Budnick
Microsoft GmbH
EINLEITUNG
Der Austausch von Nachrichten und Dokumenten gewinnt im Zuge fortschreitender Vernetzung der Arbeitsrechner immer größere Bedeutung. Das MAPI-Subsystem bietet hierzu eine einfach zu bedienende Benutzerschnittstelle. Mit Visual Foxpro haben Sie auf drei Windows-Plattformen jeweils bis zu drei Möglichkeiten auf diese Schnittstelle zuzugreifen. Dieser Vortrag macht Sie mit den Grundprinzipien des MAPI-Subsystems vertraut, stellt die Zugriffsmethoden unter Visual Foxpro vor und diskutiert deren FÜR und WIDER.
DER REDNER
Friedhelm Budnick (1959) ist Diplombiologe mit Zusatzausbildung zum Softwareentwickler für naturwissenschaftlich/technische Anwendungen; Zwischen 1987 und 1992 entwickelt er mit verschiedenen xBase-Dialekten Anwendungen zur Datenerfassung und seriellen Gerätesteuerung. Seit 1993 ist er Mitarbeiter der Microsoft GmbH in München. Hier ist er tätig im Kundensupport für FOXPRO und ACCESS.
INHALT
Modern Times: Was bringt Ihnen diese Session?
Der Austausch von Nachrichten und Dokumenten gewinnt im Zuge fortschreitender Vernetzung der Arbeitsrechner immer größere Bedeutung. In Zeiten größer werdender Konkurrenz im Geschäftsleben ist der Erfolg eines Unternehmens immer stärker davon abhängig wie schnell und problemlos die Menschen innerhalb des Unternehmens miteinander zusammenarbeiten und kommunizieren.
Das Simple MAPI des MAPI-Subsystems bietet eine einfach zu bedienende Benutzerschnittstelle die die Kommunikation im Netz und damit das Arbeiten im Team effizienter macht.
MAPI = Messaging Application Programming Interface |
Denkbare Anwendungsmöglichkeiten sind z.B.:
Mit Microsoft VISUAL FOXPRO 3.0 für WINDOWS haben Sie unterschiedliche Möglichkeiten auf diese Schnittstelle zuzugreifen. Diese Session macht Sie mit den Grundprinzipien des MAPI - Subsystems vertraut, stellt die Zugriffsmethoden unter VISUAL FOXPRO vor und diskutiert deren FÜR und WIDER.
Nach der Teilnahme an dieser Session kennen Sie
Sie sind nach Ende der Session in der Lage von Microsoft VISUAL FOXPRO 3.0 für WINDOWS aus Simple MAPI anzusprechen, sofern Ihre lokale Hard- und Software dies erlaubt.
Architektur: Die MAPI-Architektur im Überblick
Elektronische Messaging-Systeme helfen Nachrichten und Dokumente über ein Netzwerk auszutauschen. Sie speichern, filtern und verwalten diese Daten, lokalisieren Sender und Empfänger und regeln den eigentlichen Austausch über das Netzwerk. Ihre Leistungsfähigkeit geht in der Regel weit über das hier Beschriebene hinaus. Sie bilden das backbone der Kommunikation im Netzwerk.
Das MAPI-Subsystem wurde von Microsoft in Zusammenarbeit mit anderen Unternehmen entwickelt um beliebigen Client-Applikationen in einer Windows-Umgebung den Zugriff auf unterschiedliche Messaging-Systeme zu erlauben. Hierzu gehören Microsoft Mail, Novell MHS, X.400 und IBM PROFS .
Wie aus Abbildung 1 zu ersehen ist, stellt MAPI zwei Schnittstellen zur Verfügung.
Damit funktioniert das MAPI Subsystem vergleichbar zum Windows Printing System. Auch hier muß der Client keine Kenntnis von der tatsächlichen Natur des angeschlossenen Druckers haben, solange ein geeigneter Treiber vorliegt. |
Das MAPI Subsystem besteht aus einem Set von DLLs, von denen die MAPI.DLL die Client Schnittstelle bereitstellt. Sie exportiert alle vom Client benötigten Funktionen. Diese Funktionen sind u.a. in [1] und [2] dokumentiert
Ist in einer 32bit-Umgebung ein 32bit MAPI Subsystem installiert, wird die Client Schnittstelle von MAPI32.DLL bereitstellt. |
Abbildung 1: Das MAPI-Subsystem im schematischen Überblick
Gegenstand dieser Session ist die von der MAPI Client Schnittstelle angebotene Simple MAPI. Hierzu gehören Senden und Empfangen von Mails mit/ohne Attachements, das Prüfen von Adressen und das Verwalten der Inbox (Löschen, Suchen, Zwischenspeichern)
Die Service Provider Schnittstelle ist nicht Gegenstand dieser Session.
Simple MAPI: Wichtige Funktionen und Datentypen
MAPILogon( | |
UIParam ByVal as Long, | Handle des Parent Fensters. Kann 0 sein. |
User as String, | Der Benutzername. Maximal 255 Zeichen lang. Kann leer sein, dann wird ein Einlog-Dialog angezeigt, wenn Flags entsprechend gesetzt ist. |
Password as String, | s. User |
Flags as Long, | Bitmaske die die
Anmeldung konfiguriert. Beispiele für Flags, die gesetzt
werden können: &H1 = Einlog-Dialog erzwingen &H2 = Neue Session öffnen, auch wenn bereits eine Mail-Session aktiv ist |
Reserved as Long, | Reserviert, muß 0 sein. |
Session as Long) | Pointer auf eine Variable, in die das Sessionhandle eingetragen wird, wenn das Logon erfolgreich war |
as Long | 0, wenn ein gültiges Sessionhandle erstellt werden konnte, sonst unterschiedliche Werte. Kann zum Fehlerhandling benutzt werden. |
MAPILogoff( | |
Session as Long, | das von MAPILogon zurückgegebene Sessionhandle |
UIParam as Long, | Handle des Parent Fensters. Kann 0 sein. |
Flags as Long, | Reserviert, muß 0 sein. |
Reserved as Long) | Reserviert, muß 0 sein. |
as Long | 0, wenn die Session beendet werden konnte, sonst unterschiedliche Werte abhängig vom Fehler. |
MAPISendMail( | |
Session as Long,. | das von MAPILogon zurückgegebene Sessionhandle |
UIParam as Long, | Handle des Parent Fensters. Kann 0 sein |
Message as MAPIMessage, | MAPIMessage ist eine Struktur, die den Aufbau der Nachricht näher spezifiziert |
Recips as MAPIRecip, | MAPIRecip ist eine Struktur, die Anzahl und Art der Empfänger näher spezifiziert |
Files as MAPIFile, | MAPIFile ist eine Struktur, die eventuelle Attachements näher spezifiziert |
Flags as Long, | s. MAPILogon |
Reserved as Long) | Reserviert, muß 0 sein |
as Long | 0, wenn das Mail gesendet werden konnte, sonst unterschiedliche Werte abhängig vom Fehler. |
Type MAPIFile | |
Reserved as Long | Reserviert, muß 0 sein. |
Flags as Long | Bitmaske die den OLE-Status des Attachements beschreibt |
Position as Long | Position desAttachements im Text |
PathName as String | Pfad des Attachements |
FileName as String | Name des Attachements |
FileType as String | Dateityp (muß derzeit " sein) |
End Type |
Type MAPIRecip | |
Reserved as Long | Reserviert, muß 0 sein. |
RecipClass as Long | beschreibt z.B., ob der Empfänger ein Alias ist |
Name as String | Name des Empfängers, wie es das Messaging System anzeigen soll |
Address as String | Adresse des Empfängers |
EIDSize as Long | Größe der Nachfolgend beschriebenen ID (abhängig vom Messaging System ) |
EntryID as String | ID zur eindeutigen Kennzeichnung des Empfängers |
End Type |
VFP ruft Simple MAPI: Die Methoden
Direkter Zugriff mit FOXTOOLS.FLL oder DECLARE - DLL
Da die MAPI-Funktionen von einer DLL exportiert werden, ist es naheliegend sie von VISUAL FOXPRO aus unter Verwendung von FOXTOOLS.FLL (16bit) oder direkt nach einem DECLARE-DLL aufrufen zu wollen.
Dies ist möglich, jedoch nur unter Verwendung einer ganzen Reihe weiterer Windows API-Funktionen, die nicht von MAPI.DLL exportiert werden. Tatsächlich sind es so viele Funktionen, daß sich (wenn möglich) die Erstellung einer eigenen FLL empfiehlt. Ein direkter Zugriff wäre damit schon nicht mehr gegeben.
Die Ursache liegt in einer Produktbeschränkung der FOXPRO API-Schnittstelle, die bereits von Microsoft FOXPRO 2.6 für WINDOWS bekannt ist:
FOXPRO bietet keine Möglichkeit API-Funktionen aufzurufen, die C-Strukturen benötigen. |
Zwar gibt es dokumentierte work arounds [3] diese greifen jedoch nicht bei komplexeren Strukturen, die z.B. Pointer auf andere Objekte enthalten.
Wie bereits weiter oben beschrieben wurde, werden genau solche Strukturen von einigen wichtigen Funktionen der MAPI.DLL benötigt.
Das Wesentliche an den weiter unten besprochenen Methoden ist, daß sie die hier beschriebene Beschränkung ausgleichen. |
FOXMAPI.FLL unter WIN32s, Windows NT und WIN95
Bereits für Microsoft FOXPRO 2.6 für WINDOWS standen die sogenannten Workgroup Extensions zur Verfügung. Das Herzstück dieser Erweiterung ist die Library FOXMAPI.FLL. Sie fungiert als Schnittstelle zu MAPI. Die Hauptaufgabe der FOXMAPI.FLL liegt in der Erstellung der Strukturen, die von MAPI.DLL benutzt werden und deren Umsetzung in eine von FOXPRO verwertbare Form.
FOXMAPI.FLL exportiert hierzu die Funktion mpCursor(). Sie erstellt je nach Aufrufparameter eine von drei Cursor-Dateien MAPIFile, MAPIMesg oder MAPIRecip. Diese Cursor sind Abbildungen der oben beschriebenen gleichnamigen Strukturen. Der Anwender füllt sie mit den benötigten Daten.
Die übrigen von FOXMAPI.FLL exportierten Funktionen sind durchweg Abbildungen von Funktionen die durch MAPI.DLL exportiert werden. Ihre Namen sind analog vergeben:
MAPI.DLL | FOXMAPI.FLL |
MAPILogon | MPLogon |
MAPILogoff | MPLogoff |
MAPISendMail | MPSendMail |
... | ... |
Wird eine dieser Funktionen aufgerufen, so reicht sie den Aufruf an die namensverwandte Funktion in der MAPI.DLL weiter. Werden als Parameter eine oder mehrere der o.a. Strukturen benötigt holt FOXMAPI.FLL sich die Inhalte aus den mit mpCursor() erstellten Cursor-Dateien und erstellt damit die benötigten Strukturen.
Beispiele:
FUNCTION MAPILOGON
PARAMETERS EMAILNAME, PASSWORD
PUBLIC SESSION
SESSION = 0
FLAGS = 1 && Einlog-Dialog erzwingen
SET LIBRARY TO LOCFILE( HOME() + "FOXMAPI.FLL","fll",;
"Wo ist FOXMAPI") ADDITIVE
RETURN MPLOGON(0, EMAILNAME, PASSWORD, FLAGS, 0, @SESSION)
FUNCTION MAPILOGOFF
PARAMETERS SESSION
SET LIBRARY TO LOCFILE( HOME() + "FOXMAPI.FLL","fll",;
"Wo ist FOXMAPI") ADDITIVE
RETURN MPLOGOFF(SESSION,0,0,0)
FUNCTION SENDMAIL
PARAMETERS EMPFäNGER, SESSION
IF EMPTY(EMPFäNGER)
RETURN -1 && Abbruch
ENDIF
FLAGS = 1
* Einlog-Dialog anzeigen, wenn
* kein gültiger Handle vorhanden
MAILSUBJECT = "Hallo DevCon"
MAILNOTE = "Schöne Grüsse vom Fuchs"
SET LIBRARY TO LOCFILE( HOME() + "FOXMAPI.FLL","fll",;
"Wo ist FOXMAPI") ADDITIVE
= MPCURSOR("MAPIfile")
= MPCURSOR("MAPIMesg")
= MPCURSOR("MAPIRecip")
INSERT INTO MAPIRECIP VALUES ;
(0, 1, EMPFäNGER, "", 0, "")
INSERT INTO MAPIMESG VALUES ;
(0, MAILSUBJECT, MAILNOTE, 'IPM.', "", "", 0, ;
RECCOUNT('MAPIRecip'), 0)
RETVAL = MPSENDMAIL( ;
SESSION, 0, 'MAPIMESG', 'MAPIRECIP', 'MAPIFILE', ;
FLAGS, 0)
USE IN MAPIMESG
USE IN MAPIFILE
USE IN MAPIRECIP
RETURN RETVAL
Die mit Microsoft VISUAL FOXPRO 3.0b für WINDOWS ausgelieferte FOXMAPI.FLL ist eine 32bit Version.
Kommt sie auf einer 16bit-Plattform zum Einsatz, so führt sie ein thunking durch.
FOXMAPI.FLL ist von der Plattform unabhängig - es kann sowohl MAPI32.DLL als auch MAPI.DLL angesprochen werden. |
Plus: Die Workgroup Extensions bieten Zugriff auf Schedule+.
FOXMAPI.FLL darf mit eigenen Anwendungen weitergegeben werde. Zum Lieferumfang von Microsoft FOXPRO 2.6 für WINDOWS gehört eine Anleitung, wie der Setup Assistent angepaßt werden kann, wenn FoxMAPI mitgeliefert werden soll.
Das Besprochene gilt für die Nutzung auf allen drei Windows-Plattformen. Auf Windows NT bzw. Win95 wird allerdings das Vorhandensein eines 32bit MAPI Subsystems vorausgesetzt. Ein eventuell installiertes 16bit Mail wird ignoriert. Dieses Verhalten traf bereits auf Microsoft FOXPRO 2.6 für WINDOWS zu, kann aber bei Bedarf durch Anpassung der WIN.INI geändert werden.
MAPI-OCX
Mit der Professional Edition von Microsoft VISUAL FOXPRO 3.0 für WINDOWS wird ein OCX-Control ausgeliefert, daß einen schnellen und einfachen Mailzugriff ermöglichen soll: MSMAPI32.OCX
Die Benutzung dieses Controls ist in zweierlei Hinsicht sehr konsequent.
Beispiel:
PUBLIC FRMMAPI
FRMMAPI = CREATEOBJECT("form")
FRMMAPI.WIDTH = 320
FRMMAPI.HEIGHT = 70
FRMMAPI.ADDOBJECT("MAPIMESSAGES","MAPIMESSAGES")
FRMMAPI.ADDOBJECT("MAPISession","MAPISession")
FRMMAPI.ADDOBJECT("btnLogOnOff","btnLogOnOff")
FRMMAPI.BTNLOGONOFF.VISIBLE = .T.
FRMMAPI.SHOW
DEFINE CLASS BTNLOGONOFF AS COMMANDBUTTON
TOP = 10
LEFT = 10
HEIGHT = 49
WIDTH = 300
CAPTION = "Drück mich, ich bin ein Prinz..."
PROCEDURE CLICK
THISFORM.MAPISESSION.SIGNON && führt MAPILogon durch
THISFORM.MAPIMESSAGES.SessionID =;
THISFORM.MAPISESSION.SessionID
THISFORM.MAPIMESSAGES.MsgIndex = -1
&& neues Mail verfassen
THISFORM.MAPIMESSAGES.MsgSubject = "Hallo DevCon"
THISFORM.MAPIMESSAGES.MsgNoteText ;
= "Schöne Grüsse vom Fuchs"
THISFORM.MAPIMESSAGES.RecipDisplayName = ""
&& Hier gehört ein Name rein
THISFORM.MAPIMESSAGES.RecipType = 1 && Hauptempfänger
THISFORM.MAPIMESSAGES.ResolveName
THISFORM.MAPIMESSAGES.Send
THISFORM.MAPISESSION.SIGNOFF && führt MAPILogoff durch
ENDPROC
ENDDEFINE
DEFINE CLASS MAPIMESSAGES AS OLECONTROL
OLECLASS = "MSMAPI.MAPIMessages"
ENDDEFINE
DEFINE CLASS MAPISESSION AS OLECONTROL
OLECLASS = "MSMAPI.MAPISession"
ENDDEFINE
DATEI-SENDEN (Menü)
Dies ist die wohl einfachste Methode von Microsoft VISUAL FOXPRO 3.0 für WINDOWS Mails zu versenden. Sie funktioniert auf allen Plattformen. Wenn Mail nicht installiert ist, steht der Menüpunkt nicht zur Verfügung.
Die von diesem Menüpunkt aufgerufene Funktion wird von MAPI.DLL exportiert und ist auch programmiertechnisch äußerst einfach zu benutzen
MAPISendDocuments( | . |
UIParam as Long, | Handle des Parent Fensters. Kann 0 sein |
DelimChar as String, | Das Zeichen, das für FullPaths und FileNames als Feldtrenner verwendet wird |
FullPaths as String, | Textstring der eine durch DelimChar getrennte Liste von Pfadnamen enthält |
FileNames as String, | Textstring der eine durch DelimChar getrennte Liste von Dateinamen enthält die als Attachement gesendet werden sollen |
Reserved as Long) | Reserviert, muß 0 sein |
as Long | 0, wenn das Mail gesendet werden konnte, sonst unterschiedliche Werte abhängig vom Fehler. |
Diese Funktion setzt nicht eine gültige Mail-Session voraus. Strukturen zur Angabe von Empfängern werden nicht benötigt.
Andererseits kann das Mail nur interaktiv erstellt werden.
Besteht keine Mail-Session, wird ein Einlog-Dialog gezeigt, besteht eine Session wird immer die bereits gestartete verwendet.
Fazit: Was macht wann Sinn?
Hilfe: weiterführende Hilfe und Programmcode
weiterführende Hilfe:
[1] MAPI SDK (als Beta auf MSDN)
[2] technical reference zu MS MAIL
[3] KB-Artikel D26641 Für API-Aufrufe benötigte Strukturen durch Textvariablen ersetzen"
[4] FOXMAPI.HLP aus dem Lieferumfang von Microsoft VISUAL FOXPRO 3.0b für WINDOWS
[5] FOXHELP.HLP
[6] Microsoft Hotline zu FOXPRO
Beispiel-Applikationen
[1] Compuserve FOXFORUM
Exchange: Ein Ausblick