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