MAPI und CDO
MAPI und CDO sind zwei Programmierschnittstellen, die oft in einem Atemzug genannt werden, aber doch Unterschiede aufweisen. Zum einen über den Weg, den Sie auf den PC finden als auch über die Methoden, die zur Verfügung gestellt werden. Oft sind Sie ähnlich aber heißen anders.
| Installationsquelle | CDO | MAPI |
|---|---|---|
| Exchange 200/2003 System Manager | 1.21 wird immer installiert | |
| Exchange 2007 System Manager | Nein | Nein |
| Outlook 97-2003 | Optional, Per Default nicht | Ja |
| Outlook 2007 | Nein, aber als Download verfügbar | Ja |
| Outlook 2010 | Nein | Ja |
Insofern eröffnen sich folgende Wege, um CDO und das Outlook Objektmodell nutzen zu können.
| System | Schnittstelle | Schritte |
|---|---|---|
| Desktop Outlook 97-2003 | Outlook Objektmodell | Die Schnittstelle ist per Default installiert. Beachten Sie aber die Einschränkungen der Outlook Sicherheitswarnung. |
| CDO | Starten Sie einfach das Outlook Setup und installieren Sie die optionale Komponente "CDO" nach. Alternativ können Sie auch "nur" den Exchange System Manager installieren. | |
| Outlook 2007 Desktop | Outlook Objektmodell | Die Schnittstelle ist per Default installiert. Beachten Sie aber die Einschränkungen der Outlook Sicherheitswarnung. |
| CDO | CDO ist nicht mehr Bestandteil der Outlook 2007
Installationsmedien. CDO für Outlook ist aber als separater
Download verfügbar, damit sie CDO auch auf einem Outlook 2007
Desktop verwenden können. Collaboration Data Objects, Version 1.2.1 (ExchangeCDO.MSI) 1,3 MB http://www.microsoft.com/downloads/details.aspx?FamilyID=2714320d-c997-4de1-986f-24f081725d36&DisplayLang=en |
|
| Exchange 2000/2003 | Outlook Objektmodell | Nicht möglich, da Outlook nicht auf einem Exchange Server "supported" ist. Es gibt wohl Kombinationen, die eine Zeit lang funktionieren, aber das Risiko durch gleichnamige DLLs unterschiedlicher Version ist für den produktiven Betrieb zu hoch. Jedes Office Update oder Exchange Server Pack kann die Funktion und den Server stören. |
| CDO | Die CDO-Schnittstelle ist per Default installiert und wird durch Exchange Service Packs aktualisiert.. | |
| Exchange 2007 | Outlook Objektmodell | Eine Installation von Outlook 2007 ist auf einem Exchange
2007 problemlos möglich, da Exchange 2007 selbst nicht mehr
damit in Konflikt steht. Damit können Sie auch auf dem Exchange
Server per Outlook Objektmodell umfangreiche Änderungen
durchführen. Beachten Sie aber die Einschränkungen der
Outlook
Sicherheitswarnung. Zukunftssicherer ist der Weg über WebDAV und Webservice. |
| CDO |
Exchange 2007 liefert wie Outlook 2007 keine
CDO-Schnittstelle mehr mit. Sie ist aber über einen separaten
Download wieder installierbar Beachten Sie dazu auch
|
|
| Exchange 2010 | Outlook Objektmodell | Sie können Outlook 2010 x64bit auf dem Server parallel installieren und nutzen |
| CDO |
Exchange 2010 keine
CDO-Schnittstelle mehr mit. CDO ist sogar abgekündigt. Dennoch
ist sie aber über einen separaten
Download wieder installierbar Beachten Sie dazu auch
|
- 200018 INFO: Differences Between CDO, Simple MAPI, and Extended MAPI
-
Understanding how Outlook, CDO, MAPI, and Providers work together
http://msexchangeteam.com/archive/2005/04/08/403512.aspx -
Event 9646
Wenn ein Programm zu viele MAPI-Handles belegt
Wenn Sie auf dem Exchange Server Outlook installiert und deinstalliert hatten, dann kann es sein, dass die CDO-DLL nicht registriert ist. Suchen Sie dann nach der CDO.DLL und registrieren Sie diese einfach mit "regsvr32 c:\Programme\Exchsrvr\bin\cdo.dll"
CDO und Powershell
Mir ist es bislang nur gelungen rudimentäre CDO Funktionen per
Powershell zu nutzen. Speziell die "LOGON"- Methode mit Angabe des
Servers und Usernamens konnte ich nicht nutzen.
Laut Powershell Handbuch ist diese Einschränkung aber bekannt. Schade.
Outlook vs. CDO
Hier ein paar Unterschiede der Funktionen, Methode, Bezeichnungen
| Funktion | Outlook VBA | CDO |
|---|---|---|
| Anmeldung mit LOGON | LOGON-Methode mit Servername | |
| Sicherheitswarnungen | Outlook | Keine |
| GetDefaultFolder - Methode http://msdn.microsoft.com/en-us/library/ms526181.aspx |
olPublicFoldersAllPublicFolders = 18 | Kein Support für "olPublicFoldersAllPublicFolders = 18" |
| Aufzählung der Speicher | .Stores | .InfoStores |
| FolderID | .EntryID | .ID |
| Messages-Aufzählung | .Messages | .Items |
| Message Empfangszeit | Propertyname = ReceivedTime | Propertyname = TimeReceived |
| Objekte Verschieben | Methodename = .move | Methodename = .MoveTo |
Fragen Sie mich bitte nicht, warum zwei sehr ähnliche Klassen unterschiedliche Namen für die gleichen Methoden haben und einige Funktionen nur in einer der beiden Klassen vorhanden sind.
MAPI/Simple MAPI
MAPI ist schon seit den ersten Windows Versionen von Microsoft Mail verfügbar und wurde immer wieder Tod gesagt. Trotzdem ist es eine einfache und sehr oft genutzte Schnittstelle, um mit eigenen Programmen z.B. eine Mail zu versenden.
Natürlich muss Outlook installiert und mit einem Profil konfiguriert sein. Beim Einsatz von Outlook Express können sie über Simple MAPI auf die Nachrichten zugreifen, aber keine Kontakte oder Newsgroups programmatisch erreichen
- 105964 PC MAPI: Simple MAPI Common Technical Questions and Answer
- 237913 INFO: Outlook Object Model Unsuitable to Run in Windows Service
- 320071 How to programmatically get the size of mailboxes in Exchange
Beispiel für Extended MAPI, CDO 1.21, ActiveX Data Objects (ADO) und WebDAV - Outlook 2010: MAPI Reference
http://www.microsoft.com/downloads/details.aspx?FamilyID=5F61A276-9C09-4C82-9B80-20DCCAD17A2A&displaylang=en - Alles rund um MAPI
http://msdn.Microsoft.com/library/default.asp?url=/library/en-us/mapi/html/_mapi1book_finding_what_you_need.asp - Outlook Programmierungsmodell
http://msdn.Microsoft.com/library/default.asp?url=/library/en-us/vbaol10/html/olobjApplication.asp - Beispiele von OutlookCode
http://www.outlookcode.com/d/mapi.htm
http://www.outlookcode.com/d/sec.htm - Newsgroup zur Diskussion
Microsoft.public.platformsdk.mapi newsgroup at msnews.Microsoft.com
Microsoft.public.platformsdk.messaging newsgroup at msnews.Microsoft.com - Microsoft Office 2000/Visual Basic Programmer's Guide: Signing a VBA
Project
http://msdn.Microsoft.com/library/default.asp?url=/library/en-us/odeopg/html/deovrsigningvbaproject.asp - MAPI Tutorial von ActiveVB
http://www.activevb.de/tutorials/tut_mapi/mapi.html - http://www.insidemapi.com
- Outlook Spy
http://www.dimastr.com/outspy/ - MAPIProp - Kostenfreies AddOn um MAPI-Eigenschaften zu lesen
http://www.mapilab.com/dev/mapiprop/ - 192435 How To Render a Folder To an ASP Page with CDO
- 288836 INFO: Supported MAPI Configurations
- 239576 INFO: Developer Support Limitations with Outlook Express
MAPI nur Zugriff auf Messages in OE - 252720 INFO: MAPI and CDO Are Not Supported in Outlook IMO Mode
- http://www.darkweb.com/~beng/exchange/mdevfaq.htm
- 830829 Your Exchange Server 2003 computer may stop responding after a MAPI client opens more than the default value of certain server objects
- API Beschreibung mit Beispielen
http://www.pinvoke.net/default.aspx/mapi32.MAPILogon - Versenden einer Mail in allen Varianten
http://www.paulsadowski.com/WSH/cdo.htm - CORBA-Service über MAPI
http://www.omesc.com/modules/main_module/ - Komponenten für Delphi
EasyMapi von www.rapware.nl - MAPI Wrapper für .NET
http://www.mapi33.adexsolutions.com/
200€ Entwicklerlizenz
Extended MAPI
MAPI ist zwar einfach aber bietet nicht alle Möglichkeiten. Das ist sicherlich auch ein Tribut an die Geschichte und Kompatibilität von MAPI. Daher gibt es mit "Extended MAPI" eine neue erweiterte Schnittstelle, die all die neuen Funktionen von Outlook unterstützt. Allerdings ist Extended MAPI nicht mehr so einfach per VBScript anzusteuern. Ohne Hilfsmitteln müssen Sie eine Hochsprache wie Visual Basic oder C++ verwenden.
Da Extended MAPI per Default nicht per Skriptsprachen erreichbar ist, wirkt auf Extended MAPI auch nicht der Outlook Security Patch. Über Extended MAPI können Sie daher weiterhin automatisiert Mails versenden ohne die Sicherheitswarnung.
Allerdings gibt es unter http://www.dimastr.com/redemption/ einen COM-Wrapper, um auch unter VBScript auf Extended MAPI zugreifen zu können.
- 200174 How To Create a Message with an Attachment and Send It Using MAPI/VC++
- c't 21/2004 Seite 200ff
E-Mail ohne Blockade von Ralf Nebelo - COM-Addin um per VBScript auf Extended MAPI zugreifen zu können
http://www.dimastr.com/redemption/ - .NET Wrapper um Extended MAPI herum
http://www.mapi33.adexsolutions.com/ - http://www.outlookcode.com/d/index.htm
MAPI und Rechte
Über die MAPI-Schnittstelle können sogar Berechtigungen von Benutzern auf Ordnern ausgelesen und gesetzt werden. Allerdings ist das zumindest aus VBScript nicht so einfach möglich, da die Security Descriptoren korrekt gefüllt werden müssen. Allerdings gibt es mittlerweile ein ACL.DLL, die man auf einem PC registrieren kann und welche die Arbeit übernimmt. Hier ein paar Links zum Thema
- Delegate Rights To Exchange Mailbox Objects
http://cwashington.netreach.net/depo/view.asp?Index=1062 - MS Exchange Blog : Setting calendar permissions centrally
http://hellomate.typepad.com/exchange/2003/07/setting_calenda.html - Reverse Permissions Audit Scripts Part 2
http://gsexdev.blogspot.com/2005/06/reverse-permissions-audit-scripts-part.html - Setting Exchange Folder Permissions Remotely
http://mytechsky.com/html/10/article_52.html - 240911 How To Use ACL Object and CDO (1.21) to List Folder Permissions
CDO
CDO steht für "Collaboration Data Objects" und ist eine weitere API zur Entwicklung von Programmen. CDO wird nicht standardmäßig mit Outlook oder Office installieren. Sie müssen bei der Installation von Office die Komponenten mit auswählen. Sie ist auch beim Exchange 2000/2003 System Manager per Default mit installiert und kann bei Exchange 2007 nachinstalliert werden.

Auch mit CDO gibt es die Sicherheitsabfrage beim automatischen Senden. Allerdings nur, wenn das Programm interaktiv gestartet wird. Wenn Sie einen Dienst entwickeln, dann erkennt CDO, dass es von einem Dienst aufgerufen wird und die Sicherheitswarnung unterbleibt. (Siehe auch KB268462)
Welche CDO-Version auf ihrem Computer installiert ist, finden Sie am einfachsten, indem Sie die CDO.DLL suchen. Dazu reicht der Windows Explorer oder ein einfaches
dir c:\cdo.dll /s
Meist finden Sie die DLL auf "C:\Programme\Gemeinsame Dateien\System\MSMAPI\1031". Die Eigenschaften verraten dann die Version:

Die hier abgebildete CDO.DLL stammt von einer Exchange 2003 CD, die bei der Installation der Admintools auf den PC gewandert ist. In der Beschreibung können Sie sehen, dass es sich dabei um die Version 1.21s (s = Server) handelt.
Mit Outlook 2007 wird CDO gar nicht mehr installiert. Unter folgender Adresse erhalten Sie aber CDO als Download zur Nachinstallation.
Collaboration Data Objects, version 1.2.1
http://www.microsoft.com/downloads/details.aspx?FamilyID=2714320d-c997-4de1-986f-24f081725d36&displaylang=en
Das Schöne bei CDO ist, dass Sie recht einfach per VBScript damit Exchange Inhalte erreichen können. Hier zwei Beispielskripts, die das demonstrieren.
cdosample-mb.vbs
cdosample-mb.vbs zeigt, wie man ein beliebiges Postfach auf einem Server
öffnet (Rechte vorausgesetzt) ohne erst ein MAPI-Profil anzulegen. In dem
Skript
Feiertage finden Sie
dann, wie man eine Liste der User aus dem Active Directory enthält und alle
Mailboxen abklappert.
cdosample-pf.vbs
cdosample.pf.vbs zeigt, wie man unter Nutzung eines bestehenden Profils eine
Verbindung zu einem öffentlichen Ordner herstellt
Diese Beispiele sind absichtlich "einfach" gehalten und enthalten nur wenig Fehlerbehandlungen, damit diese lesbar bleiben. Die Skripte arbeiten auch nur "Read Only", d.h. geben nur ein paar Informationen aus. Natürlich können Sie aber diese Skripte weiter entwickeln, um auch Einträge zu ändern.
Achtung:
Änderungen an Ordner auf dem Server mit CDO erhalten nicht alle
Eigenschaften des darüber liegenden Ordners. Besonders die Einstellungen
bezüglich einer Replikation (Outlook im Offline/Cached Mode) werden
nicht übernommen und können nur auf dem Client gesetzt werden.
man kann z.B. sehr große Ordner einfach mit einem Filter versehen und jeweils das nächste Element abrufen, anstatt per MAPI gleich alle Elemente aufzuzählen.
Set oMsgColl = objFolder.Messages Set oMsgFilter = oMsgColl.Filter oMsgFilter.fields.Add CdoPR_START_DATE, "12/1/99" oMsgFilter.fields.Add CdoPR_END_DATE, "11/1/99" Set objItem = oMsgColl.GetFirst Do While (Not oAppt Is Nothing) MsgBox objItem.subject Set objItem = oMsgColl.GetNext Loop
Etwas aufpassen muss man beim Löschen oder Verschieben von Elementen, weil sich damit die Collection verändert. Wenn Sie also eine Auflistung von vielleicht 100 Ordnern oder Mails haben und nacheinander diese Liste abarbeiten und ein Element löschen, dann schließen sich die Löcher nach einiger Zeit. Ihr Schleife "verzählt" sich dann und ein GetNext überspringt Elemente. Microsoft dokumentiert das in der MSDN
Exchange Server 2003 - Count Property (Messages
Collection)
http://msdn.microsoft.com/en-us/library/ms527799(EXCHG.10).aspx
A large collection cannot always maintain an accurate count of its
members, and the Count property cannot be used as the collections size
Programmers needing to access individual objects in a large collection
are strongly advised to use the Microsoft® Visual Basic® For Each
statement or the Get methods
The recommended procedures for traversing a large collection are, in
decreasing order of preference:
Global selection, such as the Visual Basic For Each statement.
The Get methods, particularly GetFirst and GetNext.
An indexed loop, such as the Visual Basic For ... Next construction.
Ich würde nur das zweite Verfahren in umgekehrter Reihenfolge mit einem GetLast und GetPrevious anwenden.
Set colFolders = omapifolder.Folders
Set Folder = colFolders.Getlast
Do While Not Folder Is Nothing
wscript.eche Folder.Name
Set Folder = colFolders.Getprevious()
Loop
Damit wird die Aufzählung von unten nach oben abgearbeitet und ein "GetPrevious" überspringt zumindest keine Elemente.
Ein weiteres Problem kann die MAPI-Beschränkung auf 250 Einträge sein. Es kann daher notwendig werden, ein Objekte nach der Verwendung wieder aktiv auf "nothing" zu setzen:
It has to do with how VB Scrpt engine is releasing
implicit COM objects. Instead of using the "for each" loop, use a "for
i= 1 to..." loop retrieving each message explicitly and resetting it to
Nothing inside the loop.
There is a limit of about 255 RPC channels, which in practice works out
usually to around 249 or 250, that you are most likely running into. The
problem mostly manifests itself when using the COM Interop and one of
the .NET languages. If that's the case for you the only thing you can do
is set the objects to Nothing within your loop and if that doesn't work
you'd have to release them using Marshall.ReleaseCOMObject and maybe
also explicitly call the garbage collector in your loop, maybe at a 245
items count or something like that.
Quelle: Newsgroup nicht mehr öffentlich verfügbar.
Wer nicht durch alle Ordner rekursiv durchlaufen will, sondern die Hauptordner sucht, kann auch mit "GetDefaultFolder" direkt darauf zugreifen. Einige der Konstanten funktionieren aber nur mit Outlook:
const olAppointmentItem = 1 const olFolderDeletedItems = 3 const olFolderOutbox = 4 const olFolderSentMail = 5 const olFolderInbox = 6 const olFolderCalendar = 9 const olFolderContacts = 10 const olFolderJournal = 11 const olFolderNotes = 12 const olFolderTasks = 13 const olFolderDrafts = 16 const olPublicFoldersAllPublicFolders = 18 const olFolderConflicts = 19 const olFolderSyncIssues = 20 const olFolderLocalFailures = 21 const olFolderServerFailures = 22 const olFolderJunk = 23
Hier noch ein paar weitere Links:
- 178508 HOWTO: Write a VB MessageFilter for Your Appointment Collection
- 192404 PRB: CDO Filter on AppoinmentItems has Unexpected Behavior
- 320071 How to programmatically get the size of mailboxes in Exchange
Beispiel für Extended MAPI, CDO 1.21, ActiveX Data Objects (ADO) und WebDAV - 238119 INFO: List of Extended MAPI Numeric Result Codes
- 274357 OL98: General Information About CDO
- 268279 OL2000: Information About the CDO E-mail Security Update
- 268462 OL98: Information About the CDO E-mail Security Update
- 263296 OL98: Administrator Information About the Outlook E-mail Security Update
- 263175 OL2000: How to Programmatically Set a Public Folder Offline
- 273882 OL98: Developer Information About the CDO E-mail Security Update
- 291169 OL2002: General Information About CDO 1.21s
- 287530 OL2002: Questions About Custom Forms and Outlook Solutions
- 313776 HOW TO: Send Mail with Configuration by Using Collaboration Data Objects for Windows Library in Visual Basic .NET
- 310558 How to create a new recurring meeting that has exceptions by using CDOEX in Visual C#
- Exchange Server 2003 MAPI Property Tags
http://msdn.microsoft.com/en-us/library/ms526356(EXCHG.10).aspx -
http://msexchangeteam.com//archive/2005/04/08/403512.aspx
Understanding how Outlook, CDO, MAPI, and Providers work together -
Count Property (CDONTS Messages Collection)
http://msdn.microsoft.com/en-us/library/ms526678(EXCHG.10).aspx - Informationen für Entwickler
http://msdn.Microsoft.com/library/default.asp?URL=/library/psdk/cdo/_olemsg_overview_of_cdo.htm - MAPIProp - Kostenfreies AddOn um MAPI/CDO-Eigenschaften zu lesen
http://www.mapilab.com/dev/mapiprop/ - Finding appointments within a specific time frame
http://blogs.msdn.com/waltwa/archive/2007/03/14/finding-appointments-within-a-specific-timeframe.aspx
Beispielcode für OutlookVBA, CDO, WebDav - CDO 1.2.1 Technical Articles Collaboration Data Objects: Using
E-Mail in Your Application
http://msdn.microsoft.com/en-us/library/ms978636.aspx - HOWTO: Dump out Contacts using CDOEX and ADO
http://blogs.msdn.com/akashb/archive/2008/11/14/howto-dump-out-contacts-using-cdoex-and-ado.aspx -
Blackberry verschiebt Termine um eine Stunde
http://www.blackberry.com/btsc/microsites/search.do?cmd=displayKC&docType=kc&externalId=KB15058&sliceId=1&docTypeID=DT_SUPPORTISSUE_1_1&dialogID=67080940&stateId=0 0 67084553 - 969665 Outlook: Meetings are off by 1 hour during DST delta with BlackBerry Enterprise Server in the environment
CDOSYS
Mit der Installation des Windows SMTP-Servers wird auf jedem Windows 2000/2003 Server auch CDOSYS installiert. Auch hier mit kann recht einfach eine Mail versendet werden. So könnte ein Muster mit C# aussehen:
// language -- C#
using System.Web.Mail
private void SendCDOSYSMail()
{
MailMessage oMail = new System.Web.Mail.MailMessage()
oMail.From = "userpart@ihrefirma.tld"
oMail.To = "userpart@zielfirma.tld"
oMail.Subject = "Dies ist der Betreff"
oMail.BodyFormat = MailFormat.Html // Format ist HTML
oMail.Priority = MailPriority.High // Prioritaet ist hoch
oMail.Body = "Sendedatum des Systems: " + DateTime.Now //
Datum in den Body
SmtpMail.SmtpServer = "relayserver.provider.tld" //
Ausgehender Mailserver
SmtpMail.Send(oMail)
oMail = null // ressoucen wieder frei geben
}
Das ist besonders interessant, da sehr viele "Hosting Services" diese Schnittstelle anbieten und Sie damit einfach per ASPX.NET eine Mail von ihrem Webserver versenden können.
CDOEXM
CDOEXM ist die Schnittstelle für den Zugriff auf Exchange Management Funktionen. CDOEXM ist nicht mit CDO selbst zu verwechseln, welches einen Zugriff auf die Inhalte von Postfächern etc. erlaubt. CDOEXM ist für den administrativen Teil zuständig, z.B. für
- Speichergruppen anlegen, löschen, runterfahren, starten
- Benutzer Exchange "enabled und disablen
und vieles mehr. Hier ein kleines Beispiel aus ausgeben aller Speichergruppen auf dem Server SRV01
strServerName = SRV01
Set objExSrv = CreateObject ("CDOEXM.ExchangeServer")
Set objExSG = CreateObject ("CDOEXM.StorageGroup")
objExSrv.DataSource.Open strServerName
WScript.Echo "Exchange Servername : " & objExSrv.Name
WScript.Echo "Exchange Version : " &
objExSrv.ExchangeVersion
For Each storegroup In objExSrv.StorageGroups
objExSG.DataSource.Open storegroup
WScript.Echo "SG Name = " & objExSG.Name
Next 'storage group
Set objExSrv = Nothing
Set objExSG = Nothing
Wenn Sie sich in der MSDN natürlich die weiteren Methoden zu CDOEXM anschauen, dann werden Sie noch viele weitere interessante Werte finden. So könnten Sie per Script abfragen, wann das letzte Backup gelaufen ist oder auch wie groß Datenbanken oder Postfächer sind.
- http://msdn.Microsoft.com/library/default.asp?url=/library/en-us/e2k3/e2k3/_e2k3_reference_cdoexm.asp
- 900230 Recommendations for using Exchange system management features through a Web interface that uses CDO for Exchange Management
Exchange 2007
CDO und MAPI sind auf einem Exchange 2007 Server per Default nicht mehr vorhanden. Diese Aussage bedeutet nur, dass diese Schnittstellen AUF dem Exchange 2007 Server selbst per Default nicht mehr vorliegen. Man kann natürlich weiterhin über das Netzwerk auf Exchange 2007 per MAPI/RPC und RPC/HTTP zugreifen und sogar die CDO-Library kann separat herunter geladen und installiert werden. Damit sind Anwendungen, die diese Schnittstelle für den Zugriff nutzen weiterhin mit Exchange 2007 nutzbar.
Microsoft Exchange Server MAPI Client and
Collaboration Data Objects 1.2.1
http://www.microsoft.com/downloads/details.aspx?FamilyID=e17e7f31-079a-43a9-bff2-0a110307611e&DisplayLang=en
2,4 MB
zur Nachinstallation auf Exchange 2007 Servern.
CDO wurde bei Exchange 2000/2003 auch bei den EventSinks genutzt.
Exchange Server 2007
SMTP/NNTP Transport Event Sinks with CDO
Implementing and managing SMTP/ Network News Transfer Protocol (NNTP)
service transport event sinks using Collaboration Data Objects (CDO) is
covered in the CDO for Microsoft(r) Windows(r) server operating systems
documentation.
Transport event sinks implemented with CDO for Windows server will continue
to function without alteration after the installation of Microsoft Exchange
Server 2007 . No recompilation or re-implementation of the sink is required.
The CDO for Exchange 2000 COM component has been designed to install cleanly
over the CDO for Windows server COM component, and all applications,
including transport event sinks, will continue to function after the
installation.
If you need to update or revise the code for applications written using CDO
for Windows server, it is recommended that you update any references to the
CDOSYS component, and replace them with references to the CDO for Exchange
2000 Server (CDOEX) component.
http://msdn2.microsoft.com/en-us/library/ms875957(EXCHG.65).aspx
Outlook 2007
Wie weiter oben schon beschrieben, können Sie mit dem optionalen Download auch auf einem PC mit Outlook 2007 die CDO-Schnittstelle nachinstallieren.
Collaboration Data Objects, Version 1.2.1 für Outlook
2007 Nachinstallation
Enthält nur CDO zur Nachinstallation auf PCs mit Outlook 2007
http://www.microsoft.com/downloads/details.aspx?FamilyID=2714320d-c997-4de1-986f-24f081725d36&DisplayLang=en

http://blogs.msdn.com/stephen_griffin/archive/2008/06/02/this-just-in-mapi-and-windows-server-2008-now-get-along.aspx
Eine Besonderheit gibt es aktuell noch mit Outlook 2007 und CDO, wenn man über die CDO-Schnittstelle die öffentlichen Ordner erreichen will. MAPI scheint per Default erst mal nicht die öffentlichen Ordner mit zu laden, sondern erst beim ersten zugriff zu erkennen, ob die Exchange Server überhaupt noch eine öffentliche Ordner Struktur haben (Bei Exchange 2007 nicht mehr zwingend erforderlich !) und dann erst die Tabelle mit den Informationsspeichern zu aktualisieren.
- SGriffin's MAPI Internals - Outlook 2007, Public Folders, MAPI
and You
http://blogs.msdn.com/stephen_griffin/archive/2007/05/30/outlook-2007-public-folders-mapi-and-you.aspx
Mehrere MAPI auf einem System
Eigentlich kann es immer nur "eine MAPI.DLL" pro System geben und die DLL, die zuerst im Speicher ist, wird auch von alle folgenden Programmen genutzt. Daher ist die Existenz mehrerer MAPI.DLLs auf einem System eine häufige Problemquelle. Daher sollte "EINE" MAPI ihr Ziel sein. Nun ist es aber so, dass z.B. die MAPI-Schnitstelle von Outlook leistungsfähiger ist (Kontakte, Termine etc., aber mit Outlook 2003 und 2007 auch programmatische Zugriffe mit "Warnungen" und Bestätigungen quittiert. Das ist durchaus ratsam, damit Viren nicht einfach per MAPI unbemerkt Mails versenden oder Kontakte auslesen können. Entwickler hingegen möchten einen schnellen und vor allem "unblockierten" Zugriff auf die Elemente in Exchange.
Daher gibt es mit der MAPI32.DLL einen Wrapper, welcher von Anwendungen gestartet werden kann und anhand der aufgerufenen Funktionen entscheidet, ob es ein "SimpleMAPI" oder "ExtendedMapi"-Aufruf ist und dann die passende Anwendung startet. Dazu wird folgender Key ausgelesen:
HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail
Dort findet sich ein Eintrag zu den verschiedenen Anwendungen, die auf dem PC installiert sind und Verweise auf den "Default Client". Siehe auch "315458 PRB: Simple MAPI BMAPI Functions May Not Work from Visual Basic Code"
Interessanter ist aber die Funktion, dass man in einem anderen Schlüssel abhängig vom Programm eine andere MAPI-Software vorschreiben kann. Importieren Sie z.B. folgende Registrierungsdatei:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Messaging Subsystem\MSMapiApps] "mapitest1.exe"="Microsoft Outlook" [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows Messaging Subsystem\MSMapiApps] "mapitest1.exe"="Microsoft Outlook"
Immer wenn nun das Programm "mapitext1.exe" eine MAPI-Funktion aufruft, wird immer Outlook genutzt.
Änderungen auf dem Server und "Cached/Offline"-Clients:
CDO, MAPI und andere Prozesse erlauben auch das Anlegen von Ordner auf dem Server. Dies nutzt sowohl Exchange selbst (Stichwort: Managed folders) als auch diverse Virenschutzprogramme oder Spamfilter. Dabei wird gerne übersehen, dass da Verhalten auf dem Client bezüglich neuer Ordner unterschiedlich ist, wenn die Ordner auf dem Server angelegt werden.
Legt ein Anwender selbst einen Ordner an, so vererben sich im Moment der Anlage auch die Eigenschaften bezüglich Berechtigungen und Replikation. Wird der Ordner aber auf dem Server angelegt, dann gibt es hier keine Informationen zur Vererbung. Diese sind nur auf dem Client verfügbar. Folgendes Verhalten ist zu beobachten:
| Outlook | Verhalten |
|---|---|
| Outlook Online |
|
| Outlook Offline (ohne CachedMode) |
|
| Outlook Cached Mode: |
|
| Outlook Cached Mode aber "offline": |
|
Insofern ist besonders beim Offline Mode zu beachten, dass die neu angelegten Ordner zwar sichtbar werden, aber der Anwender schon manuell dafür sorgen muss, dass diese Ordner bei Bedarf auch repliziert werden. Leider "sieht" er ansonsten nur den Ordner aber weder, dass er nicht repliziert ist oder dass dort vielleicht Elemente enthalten sind. Insofern ist Outlook im Cached Mode dem Offline-Mode immer vorzuziehen.
Redemption
Für ca. 200 US-$ bietet Dmitry Streblechenko seine "Redemption"-DLL an, die nur einmal durch den Entwickler zu kaufen ist und die er dann mit seiner Software unbeschränkt weitergeben darf. Sie umgeht nicht nur die Outlook Beschränkungen sondern erlaubt sehr umfangreiche Modifikationen an MAPI-Objekten. Als Entwickler kann man mit der Version 4.6 oder neuer sogar komplett auf CDO und Outlook verzichten, muss es aber nicht. Man kann auch bestehenden Outlook Code nutzen und die Objekte an Redemption zur weiteren Verarbeitung übergeben. So kann man z.B. Mails auch als EML-Datei exportieren und importieren. Wer also umfangreichere Projekte mit Outlook nutzt, sollte einen Blick hieraus werfen.
Es gibt auch eine "Developer Version", die voll funktionsfähig ist, aber einen Hinweisdialog einblendet. Aus der gleichen Quelle kommt mit OutlookSpy ein fast unersetzbares Werkzeug für die Diagnose von Besonderheiten im MAPI-Store.
- Redemption
http://www.dimastr.com/redemption/
Links zu MAPI Programmierung
- WSH - Mail per CDO Senden
-
Event 9646
Wenn ein Programm zu viele MAPI-Handles belegt - 310558 How to create a new recurring meeting that has exceptions by using CDOEX in Visual C#
- 310200 HOW TO: Use the CDOEX Library to create a contact by using an Item object in Visual C# .NET
- 314367 HOW TO: Use the CDOEX Library to create a recurring meeting that has exceptions in Visual Basic .NET
- 314372 HOW TO: Use the CDOEX Library to create an Outlook Calendar folder in Visual Basic .NET
- 313775 HOW TO: Use the CDOSYS Library to send an e-mail message by using the SMTP port in Visual Basic .NET
- CDO and MAPI Programming with Visual Basic - Developing Mail and
Messaging Applications Chapter 7 Sample
http://oreilly.com/catalog/cdomapi/chapter/ch07.html - 263175 OL2000: How to Programmatically Set a Public Folder Offline
- 171638 How To Use CDO (1.x) to Work with Public/Personal Folders
-
Outlook 2010: MAPI Reference
http://www.microsoft.com/downloads/details.aspx?FamilyID=5F61A276-9C09-4C82-9B80-20DCCAD17A2A&displaylang=en -
MAPI mit Win2008 und Vista
http://blogs.msdn.com/stephen_griffin/archive/2008/06/02/this-just-in-mapi-and-windows-server-2008-now-get-along.aspx -
Howto: Get Free/Busy information using CDO 1.21 and vbs
http://blogs.msdn.com/webdav_101/archive/2007/05/04/get-free-busy-information-using-cdo-1-21-and-vbs.aspx -
Exporting the OOF (Out of Office) Setting for every user on a server
using CDO 1.2 and VBS
http://gsexdev.blogspot.com/2008/01/exporting-oof-out-of-office-setting-for.html -
mstehle: The CDOs and CDONTS of Messaging Development
http://blogs.msdn.com/mstehle/default.aspx -
Understanding how Outlook, CDO, MAPI, and Providers work together
http://msexchangeteam.com/archive/2005/04/08/403512.aspx - http://www.insidemapi.com
- Outlook Spy
http://www.dimastr.com/outspy/ -
mstehle: The CDOs and CDONTS of Messaging Development Dedicated to
supporting developers writing code against Outlook and Exchange. We'll
explore the API's, debunk myths, and get a better understanding of
Product Support in general.
http://blogs.msdn.com/mstehle/default.aspx -
Hinzufügen von zusätzlichen Postfächern zu einem MAPI-Profil
http://blogs.technet.com/dmelanchthon/archive/2006/04/19/425653.aspx -
Programming Microsoft Outlook and Collaboration Data Objects
http://www.microeye.com/resources/res_outlkb.htm -
SGriffin's MAPI Internals
http://blogs.msdn.com/stephen_griffin/archive/2008/06/02/this-just-in-mapi-and-windows-server-2008-now-get-along.aspx - CORBA-Service über MAPI
http://www.omesc.com/modules/main_module/ - Java-Klassen zum Zugriff auf Exchange
http://j-integra.intrinsyc.com/support/exchange/doc/#examples/folders.htm#list_mailbox









