Freigeben über


Senden von Nachrichten durch Nachrichtenspeicheranbieter

Gilt für: Outlook 2013 | Outlook 2016

Nachrichtenspeicheranbieter sind nicht erforderlich, um ausgehende Nachrichtenübermittlungen zu unterstützen (d. h. die Möglichkeit für Clientanwendungen, den Nachrichtenspeicheranbieter zum Senden von Nachrichten zu verwenden). Clientanwendungen müssen beim Senden von Nachrichten einen Nachrichtenspeicher verwenden, da die Daten der Nachricht zwischen dem Zeitpunkt, zu dem der Benutzer sie verfasst hat, und dem Zeitpunkt, zu dem der MAPI-Spooler die Nachricht an einen Transportanbieter zur Übermittlung an das zugrunde liegende Messagingsystem übergibt, gespeichert werden müssen. Wenn Ihr Nachrichtenspeicheranbieter ausgehende Nachrichtenübermittlungen nicht unterstützt, kann er nicht als Standardnachrichtenspeicher verwendet werden.

Um das Senden von Nachrichten zu unterstützen, muss Ihr Nachrichtenspeicheranbieter die folgenden Schritte ausführen:

Die SetLockState-Methode ist wichtig für eine ordnungsgemäße Interoperabilität zwischen dem MAPI-Spooler und Clients. Wenn der MAPI-Spooler SetLockState für eine ausgehende Nachricht aufruft, darf der Nachrichtenspeicheranbieter Clients nicht erlauben, die Nachricht zu öffnen. Wenn ein Client versucht, eine Nachricht zu öffnen, die vom MAPI-Spooler gesperrt ist, sollte der Nachrichtenspeicheranbieter MAPI_E_NO_ACCESS zurückgeben. Der gesperrte Status einer Nachricht muss nicht persistent sein, falls der Speicher heruntergefahren wird, während die Nachricht vom MAPI-Spooler gesperrt wird.

Unabhängig davon, ob der MAPI-Spooler eine ausgehende Nachricht gesperrt hat, sollte der Nachrichtenspeicheranbieter nicht zulassen, dass eine Nachricht in der Warteschlange für ausgehende Nachrichten zum Schreiben geöffnet wird. Wenn ein Client die IMSgStore::OpenEntry-Methode für eine ausgehende Nachricht mit dem Flag MAPI_MODIFY aufruft, sollte der Aufruf fehlschlagen und MAPI_E_SUBMITTED zurückgeben. Wenn eine Clientanwendung OpenEntry für eine ausgehende Nachricht mit dem Flag MAPI_BEST_ACCESS aufruft, sollte der Nachrichtenspeicheranbieter schreibgeschützten Zugriff auf die Nachricht zulassen.

Wenn eine Nachricht vom MAPI-Spooler verarbeitet werden soll, legt der Nachrichtenspeicheranbieter die PR_SUBMIT_FLAGS (PidTagSubmitFlags)-Eigenschaft der Nachricht auf SUBMITFLAG_LOCKED fest. Der SUBMITFLAG_LOCKED-Wert gibt an, dass der MAPI-Spooler die Nachricht für die exklusive Verwendung gesperrt hat. Der andere Wert für PR_SUBMIT_FLAGS, SUBMITFLAG_PREPROCESS, wird festgelegt, wenn die Nachricht eine Vorverarbeitung durch eine oder mehrere von einem Transportanbieter registrierte Präprozessorfunktionen erfordert.

In den folgenden Verfahren wird beschrieben, wie der Nachrichtenspeicher, der Transport und der MAPI-Spooler interagieren, um eine Nachricht von einem Client an einen oder mehrere Empfänger zu senden.

Die Clientanwendung ruft die IMessage::SubmitMessage--Methode auf. In SubmitMessage führt der Nachrichtenspeicheranbieter folgende Aktionen aus:

  1. Ruft IMAPISupport::PrepareSubmit auf. Wenn MAPI einen Fehler zurückgibt, gibt der Nachrichtenspeicheranbieter diesen Fehler an den Client zurück.

  2. Legt das MSGFLAG_SUBMIT Bit in der PR_MESSAGE_FLAGS (PidTagMessageFlags)-Eigenschaft der Nachricht fest.

  3. Stellt sicher, dass eine Spalte für die Eigenschaft PR_RESPONSIBILITY (PidTagResponsibility) in der Empfängertabelle vorhanden ist, und legt sie auf FALSE fest, um anzugeben, dass noch kein Transport die Verantwortung für die Übertragung der Nachricht übernommen hat.

  4. Legt Datum und Uhrzeit der Erstellung in der Eigenschaft PR_CLIENT_SUBMIT_TIME (PidTagClientSubmitTime) fest.

  5. Ruft IMAPISupport::ExpandRecips auf, um Folgendes auszuführen:

    1. Erweitern Sie alle persönlichen Verteilerlisten und benutzerdefinierte Empfänger, und Ersetzen Sie alle geänderten Anzeigenamen durch ihren Originalnamen.

    2. Entfernen von Duplikaten.

    3. Überprüfen Sie, ob eine erforderliche Vorverarbeitung erforderlich ist, und legen Sie bei Bedarf das Flag NEEDS_PREPROCESSING und die Eigenschaft PR_PREPROCESS (PidTagPreprocess) fest, die für MAPI reserviert ist.

    4. Legen Sie das Flag NEEDS_SPOOLER, wenn der Nachrichtenspeicher eng mit einer Transport verknüpft ist und nicht behandelt alle Empfänger werden kann.

  6. Führt die folgenden Aufgaben aus, wenn der Nachrichtenkennzeichnung NEEDS_PREPROCESSING festgelegt ist:

    1. Fügt die Nachricht in die ausgehende Warteschlange ein, wobei das SUBMITFLAG_PREPROCESS Bit in der PR_SUBMIT_FLAGS-Eigenschaft festgelegt ist.

    2. Benachrichtigt die MAPI-Warteschlange, die die Warteschlange geändert wurde.

    3. Gibt die Steuerung an den Client, und Nachrichtenfluss wird in die Warteschlange MAPI fortgesetzt. Die MAPI-Warteschlange führt die folgenden Aufgaben:

      1. Sperrt die Nachricht durch Aufrufen von IMsgStore::SetLockState.

      2. Führt die erforderliche Vorverarbeitung durch, indem alle Vorverarbeitungsfunktionen in der Reihenfolge ihrer Registrierung aufgerufen werden. Transportanbieter rufen IMAPISupport::RegisterPreprocessor auf, um Vorverarbeitungsfunktionen zu registrieren.

      3. Ruft IMessage::SubmitMessage für die geöffnete Nachricht auf, um dem Nachrichtenspeicher anzugeben, dass die Vorverarbeitung abgeschlossen ist.

Wenn keine Vorverarbeitung oder vorverarbeitet wurde und der MAPI-Spooler SubmitMessageaufgerufen hat, führt der Nachrichtenspeicheranbieter im Clientprozess Folgendes aus:

  • Performs the following tasks if the message store is tightly coupled to a transport and the NEEDS_SPOOLER flag was returned from IMAPISupport::ExpandRecips:

    • Verarbeitet Empfänger, die es verarbeiten kann.

    • Legt die PR_RESPONSIBILITY -Eigenschaft auf TRUE fest, für alle Empfänger, die sie behandelt.

    • Führt die folgenden Aufgaben aus, wenn alle Empfänger zu diesem eng gekoppelten Store und Transport bekannt sind:

      • Ruft IMAPISupport::CompleteMsg auf, wenn die Nachricht vorverarbeitet wurde oder der Nachrichtenspeicheranbieter möchte, dass der MAPI-Spooler die Nachrichtenverarbeitung abschließen soll. Der Nachrichtenfluss wird mit dem MAPI-Spooler fortgesetzt.

      • Führt die folgenden Aufgaben aus, wenn die Nachricht nicht vorverarbeitet wurde oder der Nachrichtenspeicheranbieter nicht möchte, dass der MAPI-Spooler die Nachrichtenverarbeitung abschließt:

        1. Kopiert die Nachricht in den Ordner, der durch den Eintragsbezeichner in der Eigenschaft PR_SENTMAIL_ENTRYID (PidTagSentMailEntryId) identifiziert wird, sofern festgelegt.

        2. Löscht die Nachricht, wenn die Eigenschaft PR_DELETE_AFTER_SUBMIT (PidTagDeleteAfterSubmit) auf TRUE festgelegt wurde.

        3. Entsperrt die Nachricht, wenn sie gesperrt ist.

        4. Kehrt zum Client zurück. Der Nachrichtenfluss ist abgeschlossen.

    • Führt die folgenden Aufgaben aus, wenn die Nachricht vorverarbeitet wurde oder der Anbieter möchte, dass der MAPI-Spooler die Nachrichtenverarbeitung abschließen soll:

      1. Ruft IMAPISupport::CompleteMsg auf.

      2. Setzt den Nachrichtenfluss mit dem MAPI-Spooler fort. Weitere Informationen finden Sie unter Senden von Nachrichten: MAPI-Spooleraufgaben.

    • Führt die folgenden Aufgaben aus, wenn die Nachricht nicht vorverarbeitet wurde oder der Anbieter nicht möchte, dass der Spooler die Nachrichtenverarbeitung abschließt:

      1. Kopiert die Nachricht in den Ordner, der durch den Eintragsbezeichner in der Eigenschaft PR_SENTMAIL_ENTRYID identifiziert wird, sofern festgelegt.

      2. Löscht die Nachricht, wenn die PR_DELETE_AFTER_SUBMIT-Eigenschaft auf TRUE festgelegt wurde.

      3. Entsperrt die Nachricht, wenn sie gesperrt ist.

      4. Kehrt zum Anrufer zurück. Der Nachrichtenfluss ist abgeschlossen.

  • Führt die folgenden Aufgaben aus, wenn der Nachrichtenspeicher nicht eng um einen Transport verknüpft, nicht alle Empfänger mit dem Nachrichtenspeicher bezeichnet wurden oder das Flag NEEDS_SPOOLER festgelegt ist:

    1. Versetzt die Nachricht in der ausgehenden Warteschlange ohne das SUBMITFLAG_PREPROCESS Bit in der PR_SUBMIT_FLAGS -Eigenschaft festlegen.

    2. Benachrichtigt die MAPI-Warteschlange, die die ausgehende Warteschlange geändert wurde, indem eine Benachrichtigung über eine Tabelle zu generieren.

    3. Gibt für den Client und Nachrichtenfluss weiterhin mit einem Satz von Aufgaben, die MAPI-Warteschlange.

Siehe auch