Messageclass

Das Gespann aus Exchange und Outlook hat eine Besonderheit, die klassische Internet Mail Systeme so nicht haben. Outlook kennt nicht nur "Mails", sondern auch Aufgaben, Termine, Journaleinträge o.ä. Und stellt dafür auch ein entsprechendes Feld im Objekt Modell bereit.

Nachrichtenklasse anzeigen

Die Nachrichtenklasse können Sie sich in Outlook übrigens ganz einfach anzeigen lassen. Klicken Sie dazu mit der rechten Maustaste auf die Überschriftenzeile und wählen Sie im Kontextmenü "Feldauswahl" an. In der dann sichtbaren Liste finden Sie die Nachrichtenklasse, wenn Sie im oberen Teil "Alle E-Mail-Felder" auswählen. Ziehen Sie dann einfach das Feld Nachrichtenklasse in die Überschriftenzeile

Natürlich können Sie dann nach diesem Feld auch gruppieren etc. Diese Funktion ist z.B.: sehr hilfreich, wenn eine Mail mit einem besonderen Format erhalten und Outlook dennoch nur das Standardformular zur Anzeige verwendet. Denn die Nachrichtenklasse ist auch der Schlüssel zu eigenen Formularen.

Bekannte Klassen

Die ist nur eine Auswahl von Nachrichten, die ich so bei einem Blick durch meine Mailbox gefunden haben. Das sind sicher nicht alle Klassen, die Outlook so verwendet. Die

Klasse Icons Quelle Verwendung
IPM.Post Outlook Standard Outlook "Notizen"
IPM.Note Outlook Standard Normale Outlook Mails
IPM.Note.SMIME.MultipartSigned Outlook Standard digital signierte Mails. Meist aus dem Internet per MIME Empfangen
REPORT.IPM.Note.DR Outlook Standard "Zugestellt"-Quittung für normale Nachrichten
REPORT.IPM.Note.IPNRN Outlook Standard "Gelesen" Quittung für interne und externe Nachrichten
IPM.Note.SMIME Outlook Standard Per SMIME codierte Mitteilung. Üblich bei Übertagungen per SMTP, auch intern.
IPM.Schedule.Meeting.Request Outlook Standard Einladung zu einem Termin
IPM.Note.Fax Outlook Standard Häufig verwendete Klasse für eingehende Faxnachrichten.
IPM.Note.Fax.Report Outlook Standard Quittung für ein ausgegangenes Fax
IPM.Sticky.Note Outlook Standard Outlook Standard für Notizen
IPM.Contact Outlook Standard Formular für Kontakte und abhängige Kontakte
IPM.DistList Outlook Standard Private Verteiler im Kontaktordner
IPM.Activity
Outlook Standard z.B. eingehende Telefonanrufe, die über einen Voice Server oder TAPI und Journalfunktion eingetragen werden. Man sieht hier jede Menge Icons, die für die verschiedenen unterarten vergeben werden.
IPM.Schedule.Meeting.Resp.Neg Outlook Standard Absage auf eine Terminanfrage
IPM.Schedule.Meeting.Resp.Pos Outlook Standard Terminzusage
IPM.Schedule.Meeting.Resp.Tent Outlook Standard Terminzusage mit Vorbehalt
IPM.Schedule.Meeting.Cancelled Outlook Standard  
IPM.Schedule.Meeting.Request Outlook Standard  
IPM.TastRequest.Update Outlook Standard  
IPM.Notes.Oof.Template.Microsoft Outlook Standard Format  für eine Abwesenheitsnotiz, die ich intern erhalten habe.
IPM.Post.RSS Outlook 2007 Standard Format für per RSS-Feed herunter geladene Inhalte
IPM.Note.Microsoft.Conversation
IPM.Note.Microsoft.Conversation.Voice
IPM.Note.Microsoft.Missed.Voice

http://communicatorteam.com/archive/2008/03/18/130.aspx
http://download.microsoft.com/download/5/D/D/5DD33FDF-91F5-496D-9884-0A0B0EE698BB/%5BMS-OXCMAIL%5D.pdf
  OCS Office Communications Server
IPM.Appointment.Live Meeting Request   Livemeeting Livemeeting

Microsoft nutzt selbst auch noch weitere Nachrichtenkassen, die von Outlook gar nicht angezeigt werden. Teils sind sie aber auch "versteckte" Nachrichten oder im "Associated Content" hintelegt, z.B.

Klasse Ordner Verwendung
IPM.MessageManager /Top/Posteingang (Associated)
IPM.Sharing.Index.In /Top/Posteingang (Associated)
IPM.Microsoft.Migrationstatus /Top/Posteingang (Associated) Eventuell speichern Migrationsprozesse hier Verwaltungsinformationen ?
IPM.RuleOrganizer /Top/Posteingang (Associated)
IPM.RuleMessage /Top/Posteingang (Associated) Vermutlich die Vorlage zur selbst erstellten automatischen Antwort
IPM.Configuration.RssRule /Top//Posteingang (Associated) möglicherweise die zentrale Konfiguration der abzurufenden RSS-Feeds
IPM.Rule.Message /Top/Posteingang (Associated)
IPM.ExtendedRule.Message /Top/Posteingang (Associated)
IPM.Configuration.WorkHours /Top/Kalender (Associated)
IPM.Configuration.HomeTimeZone /Top/Kalender (Associated)
IPM.Configuration.Calendar /Top/Kalender (Associated)
IPM.Configuration.AvailabilityOptions /Top/Kalender (Associated)
IPM.Microsoft.WunderBar.SFInfo /Common Views
IPM.Microsoft.WunderBar.Persistence /Common Views
IPM.Microsoft.SniffData /FreeBusy Data (content) Siehe auch Outlook Sniffer
IPM.Microsoft.ScheduleData.FreeBusy /FreeBusy Data (content)
IPM.Microsoft.RssLock /FreeBusy Data (content) Anscheinend steuern so Outlooks, welcher Client die RSS-Feeds abfragt. Im Property 0x6002001E steht der PC-Name
IPM.Microsoft.FolderDesign.FormDescription  
IPM.Microsoft.FolderDesign.NamedView  

Daneben steht es natürlich auch anderen Herstellern frei, eigene Nachrichtenklassen zu definieren und mit eigenen Formularen zu verwenden. Hier eine kleine Auswahl.

MRS.Fax
MRS.Voice
MRS.SMS
REPORT.IPM.MRS.FAX
  MRS Eigene Klassen des MRS-Systems (Fax, SMS, Voice).
IPM.Note.PamMessage Exchange@PAM Eigene Klasse für Archivierte Elemente von Exchange@PAM

Die Bedeutung von PR_ICON_INDEX

Auf den ersten Blick scheint es so zu sein, dass das Formular auch zugleich das Icon in Outlook bestimmt. Wenn Sie aber mal genauer hinschauen, dann ist das nur die halbe Wahrheit. Einige Formularklassen haben mehrere Icons und wenn Sie z.B. auf eine Mail antworten, dann wird aus dem Brief-Icon (Brief) z.B. ein Brief mit rotem Pfeil nach Links oder bei einer Weiterleitung ein blauer Pfeil nach rechts. Sobald eine Mail gelesen wird, wird nicht nur der Status auf "unread=false" gesetzt, sondern auch wieder das Icon geändert ().

Ich habe mich dann auf die Suche gemacht, weil ich im Rahmen eines Skripts zum analysieren von Mails auch erkennen musste, ob diese schon beantwortet oder weiter geleitet wurden. Leider kann man am Icon nur den letzten Vorgang erkennen.

Mit MFCMAPI bin ich dann auf die Pirsch gegangen und haben tatsächlich ein Feld gefunden, welches das Icon repräsentiert.

PropertyName: PR_ICON_INDEX
PropertyTag: : 0x10800003
PropertyTyp PTLong
DASL: http://schemas.microsoft.com/mapi/proptag/0x10800003

Mit MFCMAPI kann man das Feld sogar wunderbar ändern und damit alle Icons durch probieren. Ich habe nur bislang keine vollständige Auflistung gesehen und daher möge diese Liste ein Anfang sein, zumal das Feld als "Long" sehr viele Werte annehmen kann

Wert Icon
Nicht belegt Standard Mail
-1 Icon des Formulars (PR_MESSAGE_CLASS ) wird angewendet.
0 geschlossene Mail
1 Notiz
2 Konflikt
261 Mail wurde beantwortet
262 Mail wurde weiter geleitet
276 signierte Mail wurde beantwortet
277 verschlüsselte Mail wurde weiter geleitet
278 signierte Mail wurde weiter geleitet
306 Mail mit Verbotsschild
514 Gruppensymbol (kennen ich so nur von CRM)
1021 Termineinladung
1024 Termin
1026 Termin: Livemeeting Request

Aus anderen Quellen habe ich erfahren, dass Outlook zuerst dieses Feld liest und wenn es vorhanden und nicht -1 ist, dann das in Outlook fest hinterlegte Icon verwendet.

Achtung:
Das Icon hat nichts mit dem "gelesen Status" zu tun. Sie können per Skript auch eine gelesene Mail mit dem Icon 0 (geschlossene Mail) versehen etc. Outlook setzt das Feld PR_ICON_INDEX nach eigenen Regeln, die ich nicht kenne. Daher beschränke ich mich auf das Auslesen.

Messageclass beim Senden setzen

Folgendes VBScript ist ein kleines Beispiel, wie sie eine Nachricht mit ihrer ganz persönlichen Nachrichtenklasse versenden. Das Script sendet eine Mail der gewünschten Nachrichtenklasse an den angegebenen Empfänger. Sie müssen dazu ein paar Werte eintragen:

  • Mailserver und Mailboxname des Senders
  • SMTP-Adresse des Empfängers
  • Gewünschte Nachrichtenklasse

Die Nachricht wird per Einschreiben mit Rückschein versendet, d.h. Sie erhalten nach dem Versand auch eine Quittung bei der Zustellung und beim Lesen der Mail.

'~ option explicit
'~ On Error Resume Next
Dim objSession, objMessage, objFields, objOneRecip, objField

const ExServer = "SERVERNAME" 
const logonuser = "ALIAS DES SENDERS"
const CreatorDN = "SMTPADRESSE DES EMPFAENGERS"
const MessageClass = "MSXFAQ.Test"

const CdoPR_MESSAGE_CLASS = &H001A001E

' MAPI Sitzung initialisieren und dynamisch ein Profil anlegen
Set objSession = CreateObject("MAPI.Session")
objSession.Logon ,,False,True,0,True,ExServer & vbLf & LogonUser

' MAPI Nachricht mittels Outlook Object erstellen und Eigenschaften setzen
Set objMessage = objSession.Outbox.Messages.Add 
objMessage.Subject = "Dies ist der Betreff"
objMessage.Text = "Dies ist die eigentliche Mitteilung" 
objMessage.ReadReceipt = true 
objMessage.DeliveryReceipt = true 

Set objFields = objMessage.Fields 
objFields.SetNamespace ""
Set objField = objFields.Add (CdoPR_MESSAGE_CLASS, MessageClass) 
Set objField = objFields.Add ("MS_EXCHANGE_01", vbBoolean , True )
Set objOneRecip = objMessage.Recipients.Add 
objOneRecip.Type = 1         'CdoTo 
objOneRecip.Name = CreatorDN 
objOneRecip.Resolve 

' Nachricht ohne weiteren Dialog versenden
objMessage.Send showDialog = False 

'MAPI Sitzung wieder sauber schließen 
objSession.Logoff

Mit diesem kleinen Script können Sie Nachrichten beliebiger Nachrichtenklassen versenden. Dies kann z.B. erforderlich sein, um die Funktion eines Formulars oder einen Connectors zu prüfen.

Achtung: Das Script legt dynamisch ein MAPI-Profil an. Das  bedeutet aber auch, dass Outlook nicht gestartet sein darf bzw. die Verbindung nicht RPCover HTTP sein kann, da dies beim automatischen Profil nicht genutzt wird. Sie können aber die Zeile mit dem "objSession.Logon" ändern und ein bestehendes Profil angeben, z.B.

objSession.Logon "Profilename",Kennwort,False,False,0,True

Details zur Bedeutung der Parameter finden Sie z.B.: auf http://msdn.Microsoft.com/library/en-us/cdo/html/2e5e5030-9478-46e8-8271-27266ac44ec6.asp?frame=true.

Wenn Sie aber damit die Mail versenden, dann wird ihr bestehendes Outlook verwendet und wird sich mit folgenden Warnungen melden:

Wenn Sie so eine Mail mit einer für Outlook nicht bekannten Nachrichtenklasse senden, dann können die Empfänger eventuell folgende Meldung beim öffnen erhalten.

Sie sehen damit, dass die Nachrichtenklasse tatsächlich geändert wurde. Nun liegt es an ihnen ein Outlook Formular für diesen eigenen Nachrichtentyp anzulegen.

Nachrichtenklassen und das Internet

Im Internet wurden früher einfache Textnachrichten verwendet, die von Empfänger und Sender problemlos zu lesen und zu verarbeiten waren. Mehrwertfunktionen werden oft über Anlagen (z.B. VCS für Visitenkarten) realisiert. Auch über die MIME-Deklaration können auch über das Internet unterschiedliche Nachrichtenklassen genutzt werden. Allerdings gibt es hier nur wenig Standards, so dass es nicht immer sichergestellt ist, dass die Empfängerseite mit der Mail auch etwas anfangen kann.

Wenn Sie eine Internet Mail sich mal genauer anschauen, dann finden Sie bei der Betrachtung der Rohdaten oft Zeilen wie folgende:

Content-class: urn:content-classes:message

--9B095B5ADSN=_01C663B8AF3C0E5E00000300server01.de
Content-Type: text/plain; charset=unicode-1-1-utf-7

--9B095B5ADSN=_01C663B8AF3C0E5E00000300server01.de
Content-Type: message/delivery-status

--9B095B5ADSN=_01C663B8AF3C0E5E00000300server01.de
Content-Type: message/rfc822

Content-Type: multipart/report; report-type=delivery-status;
boundary="9B095B5ADSN=_01C65ED7614039A7000019D4gate.netatwork.d"
Subject: Benachrichtigung =?unicode-1-1-utf-7?Q?+APw-ber Zustellstatus (Erfolg)?=

--9B095B5ADSN=_01C65ED7614039A7000019D4gate.netatwork.d
Content-Type: text/plain; charset=unicode-1-1-utf-7

--9B095B5ADSN=_01C65ED7614039A7000019D4gate.netatwork.d
Content-Type: message/delivery-status

--9B095B5ADSN=_01C65ED7614039A7000019D4gate.netatwork.d
Content-Type: text/rfc822-headers


--9B095B5ADSN=_01C65ED7614039A7000019D4gate.netatwork.d--
 

Sie sehen, dass auch eine SMTP-Mail bei der Nutzung von MIME diverse unterscheidungen erlaubt.  Exchange und Outlook setzen die MIME-Informationen meist sogar korrekt um, d.h. aus einem multipart/report; report-type=delivery-status; wird dann ein REPORT.IPM.POST

Weitere Links