Freigeben über


Erstellen eines einfachen E-Mail-Elements

Gilt für: Outlook 2013 | Outlook 2016

MAPI kann verwendet werden, um eine Nachricht zu erstellen und zu senden, die eine Lesebestätigung anfordert. Wenn eine Lesebestätigung angefordert wird, generiert das Messagingsystem einen Lesebericht und gibt diesen an den Absender zurück, wenn der Empfänger die Nachricht öffnet.

Informationen zum Herunterladen, Anzeigen und Ausführen des Codes aus der MFCMAPI-Anwendung und dem CreateOutlookItemsAddin-Projekt, auf das in diesem Thema verwiesen wird, finden Sie unter Installieren der in diesem Abschnitt verwendeten Beispiele.

So erstellen und senden Sie eine Nachricht, die eine Lesebestätigung anfordert

  1. Erstellen Sie eine ausgehende Nachricht. Informationen zum Erstellen einer ausgehenden Nachricht finden Sie unter Behandeln einer ausgehenden Nachricht.

  2. Fügen Sie die eigenschaft PR_READ_RECEIPT_REQUESTED (PidTagReadReceiptRequested) hinzu, und legen Sie sie auf true fest.

  3. Fügen Sie die eigenschaft PR_CONVERSATION_INDEX (PidTagConversationIndex) hinzu.

  4. Fügen Sie die eigenschaft PR_REPORT_TAG (PidTagReportTag) hinzu.

  5. Senden Sie die Nachricht, indem Sie die IMessage::SubmitMessage-Methode aufrufen.

Die AddMail Funktion in der Mails.cpp Quelldatei des CreateOutlookItemsAddin-Projekts veranschaulicht diese Schritte. Die AddMail Funktion verwendet Parameter aus dem Dialogfeld E-Mail hinzufügen, das angezeigt wird, wenn Sie in der MFCMAPI-Beispielanwendung im Menü Addins auf den Befehl E-Mail hinzufügen klicken. Die DisplayAddMailDialog Funktion in Mails.cpp zeigt das Dialogfeld an und übergibt die Werte aus dem Dialogfeld an die AddMail Funktion. Die DisplayAddMailDialog Funktion bezieht sich nicht direkt auf das Erstellen eines E-Mail-Elements mithilfe von MAPI, daher ist sie hier nicht aufgeführt. Die AddMail Funktion ist unten aufgeführt.

Beachten Sie, dass der lpFolder-Parameter , der an die AddMail -Methode übergeben wird, ein Zeiger auf eine IMAPIFolder-Schnittstelle ist, die den Ordner darstellt, in dem die neue Nachricht erstellt wird. Mit dem lpFolder-Parameter , der eine IMAPIFolder-Schnittstelle darstellt, ruft der Code die IMAPIFolder::CreateMessage-Methode auf. Die CreateMessage-Methode gibt einen Erfolgscode und einen Zeiger auf eine IMessage : IMAPIProp-Schnittstelle zurück.

Der Großteil des AddMail Funktionscodes übernimmt das Festlegen von Eigenschaften in Vorbereitung auf den Aufruf der IMAPIProp::SetProps-Methode . Wenn der Aufruf der SetProps-Methode erfolgreich ist, committet ein Aufruf der IMAPIProp::SaveChanges-Methode die Änderungen an den Speicher und erstellt ein neues E-Mail-Element. Wenn dies angefordert wird, wird die IMessage::SubmitMessage-Methode aufgerufen, um die Nachricht zu senden.

Die AddMail Funktion verwendet zwei Hilfsfunktionen, um Werte für die eigenschaften PR_CONVERSATION_INDEX und PR_REPORT_TAG zu erstellen: die BuildConversationIndex Funktionen und AddReportTag . Die BuildConversationIndex Funktion, die sich in CreateOutlookItemsAddin.cpp befindet, führt die gleiche Arbeit wie die integrierte MAPI-Funktion ScCreateConversationIndex aus, wenn kein übergeordneter Unterhaltungsindex an sie übergeben wird. Das Format des Konversationsindexpuffers, den diese Funktionen generieren, ist in der kanonischen PidTagConversationIndex-Eigenschaft dokumentiert.

Die AddReportTag Funktion, die sich in Mails.cpp befindet, ruft wiederum die BuildReportTag Funktion auf, um eine Struktur für die PR_REPORT_TAG-Eigenschaft zu erstellen. Informationen zur Struktur, die die BuildReportTag Funktion erstellt, finden Sie unter Kanonische PidTagReportTag-Eigenschaft.

Im Folgenden finden Sie die vollständige Auflistung der AddMail Funktion.

HRESULT AddMail(LPMAPISESSION lpMAPISession,
            LPMAPIFOLDER lpFolder,
            LPWSTR szSubject, // PR_SUBJECT_W, PR_CONVERSATION_TOPIC
            LPWSTR szBody, // PR_BODY_W
            LPWSTR szRecipientName, // Recipient table
            BOOL bHighImportance, // PR_IMPORTANCE
            BOOL bReadReceipt, // PR_READ_RECEIPT_REQUESTED
            BOOL bSubmit,
            BOOL bDeleteAfterSubmit)
{
   if (!lpFolder) return MAPI_E_INVALID_PARAMETER;
   HRESULT hRes = S_OK;
   LPMESSAGE lpMessage = 0;
   // Create a message and set its properties
   hRes = lpFolder->CreateMessage(0,
      0,
      &lpMessage);
   if (SUCCEEDED(hRes))
   {
      // Because the properties to be set are known in advance, 
      // most of the structures involved can be statically declared 
      // to minimize expensive MAPIAllocateBuffer calls.
      SPropValue spvProps[NUM_PROPS] = {0};
      spvProps[p_PR_MESSAGE_CLASS_W].ulPropTag          = PR_MESSAGE_CLASS_W;
      spvProps[p_PR_ICON_INDEX].ulPropTag                 = PR_ICON_INDEX;
      spvProps[p_PR_SUBJECT_W].ulPropTag                = PR_SUBJECT_W;
      spvProps[p_PR_CONVERSATION_TOPIC_W].ulPropTag     = PR_CONVERSATION_TOPIC_W;
      spvProps[p_PR_BODY_W].ulPropTag                   = PR_BODY_W;
      spvProps[p_PR_IMPORTANCE].ulPropTag               = PR_IMPORTANCE;
      spvProps[p_PR_READ_RECEIPT_REQUESTED].ulPropTag   = PR_READ_RECEIPT_REQUESTED;
      spvProps[p_PR_MESSAGE_FLAGS].ulPropTag             = PR_MESSAGE_FLAGS;
      spvProps[p_PR_MSG_EDITOR_FORMAT].ulPropTag         = PR_MSG_EDITOR_FORMAT;
      spvProps[p_PR_MESSAGE_LOCALE_ID].ulPropTag         = PR_MESSAGE_LOCALE_ID;
      spvProps[p_PR_INETMAIL_OVERRIDE_FORMAT].ulPropTag = PR_INETMAIL_OVERRIDE_FORMAT;
      spvProps[p_PR_DELETE_AFTER_SUBMIT].ulPropTag      = PR_DELETE_AFTER_SUBMIT;
      spvProps[p_PR_INTERNET_CPID].ulPropTag            = PR_INTERNET_CPID;
      spvProps[p_PR_CONVERSATION_INDEX].ulPropTag         = PR_CONVERSATION_INDEX;
      spvProps[p_PR_MESSAGE_CLASS_W].Value.lpszW = L"IPM.Note";
      spvProps[p_PR_ICON_INDEX].Value.l = 0x103; // Unsent Mail
      spvProps[p_PR_SUBJECT_W].Value.lpszW = szSubject;
      spvProps[p_PR_CONVERSATION_TOPIC_W].Value.lpszW = szSubject;
      spvProps[p_PR_BODY_W].Value.lpszW = szBody;
      spvProps[p_PR_IMPORTANCE].Value.l = bHighImportance?IMPORTANCE_HIGH:IMPORTANCE_NORMAL;
      spvProps[p_PR_READ_RECEIPT_REQUESTED].Value.b = bReadReceipt?true:false;
      spvProps[p_PR_MESSAGE_FLAGS].Value.l = MSGFLAG_UNSENT;
      spvProps[p_PR_MSG_EDITOR_FORMAT].Value.l = EDITOR_FORMAT_PLAINTEXT;
      spvProps[p_PR_MESSAGE_LOCALE_ID].Value.l = 1033; // (en-us)
      spvProps[p_PR_INETMAIL_OVERRIDE_FORMAT].Value.l = NULL; // Mail system chooses default encoding scheme
      spvProps[p_PR_DELETE_AFTER_SUBMIT].Value.b = bDeleteAfterSubmit?true:false;
      spvProps[p_PR_INTERNET_CPID].Value.l = cpidASCII;
      hRes = BuildConversationIndex(
         &spvProps[p_PR_CONVERSATION_INDEX].Value.bin.cb,
         &spvProps[p_PR_CONVERSATION_INDEX].Value.bin.lpb);
      if (SUCCEEDED(hRes))
      {
         hRes = lpMessage->SetProps(NUM_PROPS, spvProps, NULL);
         if (SUCCEEDED(hRes))
         {
            hRes = AddRecipient(lpMAPISession,
               lpMessage,
               MAPI_TO,
               szRecipientName);
            AddInLog(true,L"CallMenu: AddRecipient - returned hRes = 0x%08X\n",hRes);
            if (SUCCEEDED(hRes))
            {
               if (bReadReceipt)
               {
                  hRes = AddReportTag(lpMessage);
               }
               if (SUCCEEDED(hRes))
               {
                  hRes = lpMessage->SaveChanges(KEEP_OPEN_READWRITE);
                  if (SUCCEEDED(hRes) && bSubmit)
                  {
                     hRes = lpMessage->SubmitMessage(NULL);
                  }
               }
            }
         }
      }
      if (spvProps[p_PR_CONVERSATION_INDEX].Value.bin.lpb)
         delete[] spvProps[p_PR_CONVERSATION_INDEX].Value.bin.lpb;
   }
   if (lpMessage) lpMessage->Release();
   return hRes;
}

Siehe auch