MAPI und CDO

Exchange 2016 und CDO

Die Nutzung von MAPI/CDO in Verbindung mit Exchange 2016 und neuer ist nicht mehr unterstützt. Seit Exchange 2007 bietet Microsoft mit den Exchange Web Services (EWS) eine vergleichbare Schnittstelle an, die aber nicht mehr auf COM-Objekte sondern eben WebServices setzt. Das Transport-Protokoll ist HTTP/HTTPS und damit ist der Weg zu Exchange Daten nicht mehr nur für Windows Clients offen. Mac-Clients nutzen schon länger EWS und auch Implementationen für UNIX auf Basis von Perl und PHP sind mittlerweile verfügbar.

MAPI CDO will not be supported for Exchange 2016
https://blogs.msdn.microsoft.com/dvespa/2015/06/18/mapi-cdo-will-not-be-supported-for-exchange-2016/
Exchange’s MAPI has been out of main stream support for some time now (as it’s tied to the lifecycle of Exchange 2003), so it isn’t a surprise that Exchange 2016 will no longer allow it

Exchange Server 2016 does not support connectivity via the MAPI/CDO library.
https://blogs.technet.microsoft.com/exchange/2015/05/05/exchange-server-2016-architecture/
Third-party products (and custom in-house developed solutions) need to move to Exchange Web Services (EWS) or the REST APIs to access Exchange data.

Neu mit Exchange 2016 ist nun auch eine REST-API (Exchange REST) für noch einfacheren Zugriff auf Postfächer.

Download und Versionen

6.5.8353.0 (March 2014)
http://www.microsoft.com/en-us/download/details.aspx?id=42040

Achtung:
CDO-Update am Okt 2010 löst u.a. Probleme mit Blackberry, Cisco unite, Event 9646, und einige andere.
http://blogs.msdn.com/b/stephen_griffin/archive/2010/11/01/mapi-download-6-5-8190.aspx

FYI: Why are MAPI and CDO 1.21 not supported in managed (.NET) code? http://blogs.msdn.com/b/mstehle/archive/2007/10/03/fyi-why-are-mapi-and-cdo-1-21-not-supported-in-managed-net-code.aspx

Exchange 2013 ist die letzte Version, die CDO unterstützt. EWS ist die Zukunft
Siehe auch http://blogs.technet.com/b/exchange/archive/2013/01/25/exchange-2013-client-access-server-role.aspx

CDO nutzt "alte APIs", die aber auch auf öffentliche Ordner aufsetzen. Ich habe von Problemen gehört, das CDO nicht funktioniert, wenn es keinen Public Folder Store mehr gibt. Vorsicht also beim Entfernen der öffentlichen Ordner.
Oder Sie passen das MAPI-Profil an (Setzen von PR_PROFILE_CONNECT_FLAGS auf 0x8000 (CONNECT_IGNORE_NO_PF)
http://blogs.msdn.com/b/dvespa/archive/2009/09/02/how-to-configure-a-mapi-profile-to-connect-to-exchange-2010.aspx
http://www.open-a-socket.com/index.php/2011/03/27/microsoft-exchange-mapi-and-cdo-121-with-no-public-folders/
Die Fehlermeldung ist etwas "seltsam":

Der Microsoft Exchange Server-Computer steht nicht zur Verfügung. Das Netzwerk antwortet nicht, oder der Server wurde für Wartungsarbeiten herunter gefahren. [Microsoft Exchange Server-Informationsspeicher - [MAPI_E_FAILONEPROVIDER(8004011D)]]

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/2010/2013

Nein. Kann als separater Download installiert werden.

Microsoft Exchange Server MAPI Client and Collaboration Data Objects 1.2.1 May 2013 Update
http://www.microsoft.com/en-us/download/details.aspx?id=39045

Nein

Outlook 97-2003

Optional, Per Default nicht

Ja

Outlook 2007

Nein, aber als Download verfügbar

Ja

Outlook 2010

Installation von CDO nicht mehr parallel möglich und nicht Supportet

Siehe auch
http://msdn.microsoft.com/de-de/library/ee692174.aspx

Outlook 2010 : Why CDO 1.2.1 not supported with Outlook 2010
http://blogs.msdn.com/b/deva/archive/2010/01/19/outlook-2010-why-cdo-1-2-1-not-supported-with-outlook-2010.aspx

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
Microsoft Exchange Server MAPI Client and Collaboration Data Objects 1.2.1 (ExchangeMapiCdo.EXE 2,4 MB)
http://www.microsoft.com/downloads/details.aspx?FamilyID=e17e7f31-079a-43a9-bff2-0a110307611e&DisplayLang=en
Achtung: Es handelt sich dabei um 32bit Komponenten, die also auch nur von 32bit Programmen genutzt werden können.

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

Microsoft Exchange Server MAPI Client and Collaboration Data Objects 1.2.1 (ExchangeMapiCdo.EXE  2,4 MB)
http://www.microsoft.com/downloads/details.aspx?FamilyID=e17e7f31-079a-43a9-bff2-0a110307611e&DisplayLang=en

Achtung: Es handelt sich dabei um 32bit Komponenten, die also auch nur von 32bit Programmen genutzt werden können. VBScript Programme müssen auf 64bit Systemen die 32bit Version C:\Windows\SysWOW64\cscript.exe verwenden. Zudem darf Outlook nicht ebenfalls auf dem Server installiert sein.

Beachten Sie dazu auch:

 

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

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.

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

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 gewändert 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
Microsoft Exchange Server MAPI Client and Collaboration Data Objects 1.2.1 Release Notes
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=4825F157-5816-4802-850D-67A0C5423770

Microsoft Exchange Server MAPI Client and Collaboration Data Objects 1.2.1 May 2013 Update
http://www.microsoft.com/en-us/download/details.aspx?id=39045
Kann nicht installiert werden,. wenn Outlook oder Exchange 2003 installiert ist.

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® für Each statement or the Get methods

The recommended procedures für traversing a large collection are, in decreasing order of preference:
Global selection, such as the Visual Basic für Each statement.
The Get methods, particularly GetFirst and GetNext.
An indexed loop, such as the Visual Basic für ... 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 für 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:

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.

Exchange 2007/2010

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 für Microsoft(r) Windows(r) server operating systems documentation.

Transport event sinks implemented with CDO für 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 für Exchange 2000 COM component has been designed to install cleanly over the CDO für 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 für applications written using CDO für Windows server, it is recommended that you Update any references to the CDOSYS component, and replace them with references to the CDO für Exchange 2000 Server (CDOEX) component.

http://msdn2.microsoft.com/en-us/library/ms875957(EXCHG.65).aspx

CDO ohne Public Folder

Mit Outlook 2007 und höher werden öffentliche Ordner nicht mehr für die Bereitstellung von Frei/Belegt-Zeiten oder Offline-Adressbücher benötigt. Wenn die sonst keine öffentlichen Ordner mehr als zentrale Ablage benötigen, z.B.: weil sie Sharepoint stattdessen einsetzen oder bei der Neuinstallation von Exchange 2007/2010 die Unterstützung von "Downlevel"-Clients nicht angewählt haben, dann haben Sie in ihrer Exchange Organisation gar keine öffentlichen Ordner mehr. für Outlook 2007 und höher ist das kein Problem, wohl aber für ältere Programme, die auf CDO aufsetzen wie z.B. viele meiner VB-Skripte, Blackberry-Server und andere Tools.

Exchange 2010 loggt solche Zugriffe sogar sauber in der Datei C:\Program Files\Microsoft\Exchange Server\V14\Logging\RPC Client Access\RCA_*..LOG mit:

2013207-18T14:02:28.101Z,427944,0,/o=ORG/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)
/cn=Recipients/cn=User1,,,6.0.8320.0,Classic,192.168.2.98,fe80::8192:70e8:36bc:a522%16,
ncacn_ip_tcp,,Connect,1247 (rpc::ClientVerDisallowed),00:00:00.0312514,
"SID=S-1-5-21-1231231233-1231231233-1231231233-1219, Flags=None",
RpcDispatch: [RpcServerException] Legacy client isn't allowed to connect because there 
are no public folders. (StoreError=ClientVerDisallowed)

Aber auch hier gibt es Abhilfe z.B. über einen Registrierungsschlüssel bzw. getrennt nach 32bit und 64bit Windows.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows Messaging Subsystem\CDO]
"Ignore No PF"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Messaging Subsystem\CDO]
"Ignore No Pf"=dword:00000001

Danach sollte sich CDO auch mit Postfächern verbinden, wenn es keinen Public Folder Store mehr in der Organisation gibt.

CDO/MAPI und Archiv Mailboxen

Bislang musste ich selbst noch nicht per CDO direkt in eine Archivmailbox zugreifen. Aber auch das ist relativ einfach. Das Programm muss sich dazu aber mit dem Postfach über den LegacyExchangeDN verbinden und eine GUID addieren. Das könnte dann wie folgt aussehen.

/O=<Orgname>/OU=EXCHANGE ADMINISTRATIVE GROUP (FYDIBOHF23SPDLT)/CN=RECIPIENTS/CN=User1/guid=4b905445-8692-4945-ac3b-b84f2bc432f5

Der CAS-Server von Exchange 2010 kann mit solchen GUIDs umgehen und sich dann mit dem Archiv verbinden. Wer schon mal den Outlook Audidiscover-Test gemacht hat, kann dies gut dort sehen:

In der XML-Struktur werden neben Stellvertreterpostfächer auch das Archiv mit einem vollständigen LegacyExchangeDN angegeben. Die GUID ermittelt sich dabei aus dem Feld msExchArchiveGUID am Benutzerobjekt:

Allerdings muss ein Programm aus dem HEX-Wert erst eine als String formatierte GUID umsetzen. für geübte Programmierer sind solche Umsetzungen aber nichts ungewöhnlich.

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
CDO für Outlook 2007
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.

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:

Windows Registry Editor Version 5.00

[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

  • Ordnerstruktur sofort sichtbar
  • Inhalt sofort sichtbar
  • Keine Replikation zu berücksichtigen

Outlook Offline (ohne CachedMode)

  • Ordnerstruktur wird bei F9 repliziert
  • Ordner sichtbar aber kein Inhalt
  • Inhaltsreplikation wird auf dem Client nicht vom "Mutterordner" übernommen
  • Benutzer muss selbst die Replikation einschalten

Outlook Cached Mode:

  • Ordner wird nach kurzer Zeit möglich
  • Inhalt mit sichtbar
  • Inhalt wird auch repliziert
  • Auch "offline" verfügbar

Outlook Cached Mode aber "offline":

  • Ordner wird auch mit F9 nicht repliziert !
  • Erst wenn wieder "online/Cached" wird Ordern mit Inhalt sichtbar und repliziert
  • Und dann "offline" verfügbar

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.

Links zu MAPI Programmierung