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 |
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 Outlook 2010 : Why CDO 1.2.1 not supported with Outlook 2010 |
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. |
|
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. |
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 Microsoft Exchange Server MAPI Client and Collaboration Data
Objects 1.2.1 (ExchangeMapiCdo.EXE 2,4 MB) 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:
|
|
- 200018 INFO: Differences Between CDO, Simple MAPI, and Extended MAPI
-
understanding how Outlook, CDO, MAPI, and Providers work together
http://blogs.technet.com/b/exchange/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 |
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 Add-on 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 - MAPI Definitionen
http://sourceforge.net/projects/libpff/files/documentation/MAPI definitions/MAPI definitions.pdf
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 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.
- Weitere Release Informationen
http://blogs.msdn.com/b/stephen_griffin/archive/2011/02/28/mapi-download-8211.aspx
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:
- 178508 HOWTO: Write a VB MessageFilter für 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 für Windows Library in Visual Basic .NET
- 310558 How to create a new recurring meeting that has exceptions by using CDOEX in Visual C#
- 195656 BUG: Accessing Custom Properties with CDO (1.x)
- Exporting Mailboxes Larger Than 2 GB On An Exchange Server
http://theessentialexchange.com/blogs/michael/archive/2009/10/16/exporting-mailboxes-larger-than-2-gb-on-an-exchange-server.aspx - 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 Add-on 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 für using Exchange system management features through a Web interface that uses CDO für Exchange Management
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
- How to use MFCMAPI to create a MAPI profile to
connect to Exchange 2010
http://blogs.msdn.com/b/dvespa/archive/2009/09/02/how-to-configure-a-mapi-profile-to-connect-to-exchange-2010.aspx - http://blogs.msdn.com/stephen_griffin/archive/2008/07/14/getting-a-referral-from-exchange-2007.aspx
- http://blogs.msdn.com/stephen_griffin/archive/2007/03/19/mapi-and-exchange-2007.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)
- Microsoft Exchange MAPI and CDO 1.2.1 with no Public
Folders
http://www.open-a-socket.com/index.php/2011/03/27/microsoft-exchange-mapi-and-cdo-121-with-no-public-folders/ - 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 - Blackberry Enterprise Services with Exchange 2010
Sp1
http://blogs.technet.com/b/ronyyasmine/archive/2011/01/19/blackberry-enterprise-services-with-exchange-2010-sp1.aspx - Configure the BlackBerry Enterprise Server Express
to run without public folders
http://docs.blackberry.com/en/admin/deliverables/14347/Config_Exchange_10_run_wo_public_folders_963029_11.jsp
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.
- 2.2.3.2.5 AlternativeMailbox
of [MS-OXDSCLI]
http://msdn.microsoft.com/en-us/library/ee237925.aspx - 2.2.3.2.3 Retention and
Archive Settings of [MS-OXOCFG]
http://msdn.microsoft.com/en-us/library/ee203830.aspx - 2.2.1.22 Retention and
Archive of [MS-OXCMSG]
http://msdn.microsoft.com/en-us/library/ee158272.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:
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 |
|
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
- MAPICDO 6.5.8244
http://blogs.msdn.com/b/stephen_griffin/archive/2011/10/27/mapicdo-6-5-8244.aspx - 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
-
Exporting Mailboxes Larger Than 2 GB On An Exchange Server
http://theessentialexchange.com/blogs/michael/archive/2009/10/16/exporting-mailboxes-larger-than-2-gb-on-an-exchange-server.aspx -
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 für 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://blogs.technet.com/b/exchange/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 -
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 - 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 - How to use MFCMAPI to create a MAPI profile to connect to Exchange
2010
http://blogs.msdn.com/b/dvespa/archive/2009/09/02/how-to-configure-a-mapi-profile-to-connect-to-exchange-2010.aspx - Preparing your Existing Solutions to Run on Outlook 2010
http://blogs.msdn.com/b/officedevdocs/archive/2009/12/11/preparing-your-existing-solutions-to-run-on-outlook-2010.aspx