Поделиться через


Создание текста сообщения

Область применения: Outlook 2013 | Outlook 2016

Хотя некоторые сообщения состоят не более чем из списка получателей и строки темы, содержимое большинства сообщений, в частности IPM. Обратите внимание на сообщения, включая текст. Текст сообщения может быть простым или форматированным и хранится в трех свойствах: PR_BODY (PidTagBody), PR_HTML (PidTagHtml) и PR_RTF_COMPRESSED (PidTagRtfCompressed).

Если клиент работает на основе обычного текста, задайте PR_BODY. Если вы поддерживаете форматированный текст в формате RTF, задайте только PR_RTF_COMPRESSED или оба PR_RTF_COMPRESSED и PR_BODY в зависимости от используемого поставщика хранилища сообщений. Если клиент с поддержкой RTF использует хранилище сообщений, поддерживающего RTF, он задает только PR_RTF_COMPRESSED . Когда клиент с поддержкой RTF использует хранилище сообщений, не поддерживающего RTF, он задает оба свойства. Если клиент поддерживает HTML, задайте свойство PR_HTML .

Определение того, поддерживает ли хранилище сообщений формат форматированного текста

  1. Вызовите метод IMAPIProp::GetProps хранилища сообщений, чтобы получить свойство PR_STORE_SUPPORT_MASK (PidTagStoreSupportMask).

  2. Проверьте бит STORE_RTF_OK. Если задано STORE_RTF_OK, поставщик хранилища сообщений поддерживает текст RTF. Если он не задан, поставщик хранилища сообщений поддерживает только обычный текст.

Определение поддержки HTML в хранилище сообщений

  1. Вызовите метод IMAPIProp::GetProps хранилища сообщений, чтобы получить свойство PR_STORE_SUPPORT_MASK .

  2. Проверьте бит STORE_HTML_OK. Если задано STORE_HTML_OK, поставщик хранилища сообщений поддерживает текст HTML.

Настройка PR_RTF_COMPRESSED

  1. Вызовите метод IMAPIProp::OpenProperty сообщения, чтобы открыть свойство PR_RTF_COMPRESSED , указав IID_IStream в качестве идентификатора интерфейса и задав флаг MAPI_CREATE.

  2. Вызовите функцию WrapCompressedRTFStream , передав флаг STORE_UNCOMPRESSED_RTF, если бит STORE_UNCOMPRESSED_RTF задан в свойстве PR_STORE_SUPPORT_MASK хранилища сообщений.

  3. Отпустите исходный поток, вызвав его метод IUnknown::Release .

  4. Вызовите IStream::Write или IStream::CopyTo , чтобы записать текст сообщения в поток, возвращенный из WrapCompressedRTFStream.

  5. Вызовите методы Commit и Release в потоке, возвращенном методом OpenProperty .

На этом этапе, если поставщик хранилища сообщений поддерживает RTF, вы выполнили все необходимые действия. Вы можете зависеть от поставщика хранилища сообщений для синхронизации содержимого сообщения и форматирования, а также для создания свойства PR_BODY при необходимости. Хранилища сообщений с поддержкой RTF вызывают RTFSync для обработки синхронизации. Если для флага RTF_SYNC_BODY_CHANGED задано значение TRUE, поставщик повторно выполнит вычисление свойства PR_BODY .

Если поставщик хранилища сообщений не поддерживает RTF, необходимо также добавить содержимое сообщения, отличное от RTF, задав свойство PR_BODY .

Настройка PR_HTML

  1. Вызовите метод IMAPIProp::OpenProperty , чтобы открыть свойство PR_HTML с интерфейсом IStream .

  2. Вызовите IStream::Write , чтобы записать текстовые данные сообщения в поток, возвращенный из OpenProperty.

  3. Вызовите IStream::Commit и IUnknown::Release в потоке, чтобы зафиксировать изменения и освободить память.

Настройка PR_BODY

  1. Вызовите метод IMAPIProp::OpenProperty , чтобы открыть свойство PR_BODY с интерфейсом IStream .

  2. Вызовите IStream::Write , чтобы записать текстовые данные сообщения в поток, возвращенный из OpenProperty.

  3. Вызовите функцию RTFSync , чтобы синхронизировать текст с форматированием. Так как это новое сообщение, задайте флаги RTF_SYNC_RTF_CHANGED и RTF_SYNC_BODY_CHANGED, чтобы указать, что rtf и обычный текст изменились. RTFSync задаст несколько связанных свойств, необходимых поставщику хранилища сообщений, например PR_RTF_IN_SYNC (PidTagRtfInSync), и запишет их в сообщение.

  4. Вызовите IStream::Commit и IUnknown::Release в потоке, чтобы зафиксировать изменения и освободить память.