Создание текста сообщения
Область применения: 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 .
Определение того, поддерживает ли хранилище сообщений формат форматированного текста
Вызовите метод IMAPIProp::GetProps хранилища сообщений, чтобы получить свойство PR_STORE_SUPPORT_MASK (PidTagStoreSupportMask).
Проверьте бит STORE_RTF_OK. Если задано STORE_RTF_OK, поставщик хранилища сообщений поддерживает текст RTF. Если он не задан, поставщик хранилища сообщений поддерживает только обычный текст.
Определение поддержки HTML в хранилище сообщений
Вызовите метод IMAPIProp::GetProps хранилища сообщений, чтобы получить свойство PR_STORE_SUPPORT_MASK .
Проверьте бит STORE_HTML_OK. Если задано STORE_HTML_OK, поставщик хранилища сообщений поддерживает текст HTML.
Настройка PR_RTF_COMPRESSED
Вызовите метод IMAPIProp::OpenProperty сообщения, чтобы открыть свойство PR_RTF_COMPRESSED , указав IID_IStream в качестве идентификатора интерфейса и задав флаг MAPI_CREATE.
Вызовите функцию WrapCompressedRTFStream , передав флаг STORE_UNCOMPRESSED_RTF, если бит STORE_UNCOMPRESSED_RTF задан в свойстве PR_STORE_SUPPORT_MASK хранилища сообщений.
Отпустите исходный поток, вызвав его метод IUnknown::Release .
Вызовите IStream::Write или IStream::CopyTo , чтобы записать текст сообщения в поток, возвращенный из WrapCompressedRTFStream.
Вызовите методы Commit и Release в потоке, возвращенном методом OpenProperty .
На этом этапе, если поставщик хранилища сообщений поддерживает RTF, вы выполнили все необходимые действия. Вы можете зависеть от поставщика хранилища сообщений для синхронизации содержимого сообщения и форматирования, а также для создания свойства PR_BODY при необходимости. Хранилища сообщений с поддержкой RTF вызывают RTFSync для обработки синхронизации. Если для флага RTF_SYNC_BODY_CHANGED задано значение TRUE, поставщик повторно выполнит вычисление свойства PR_BODY .
Если поставщик хранилища сообщений не поддерживает RTF, необходимо также добавить содержимое сообщения, отличное от RTF, задав свойство PR_BODY .
Настройка PR_HTML
Вызовите метод IMAPIProp::OpenProperty , чтобы открыть свойство PR_HTML с интерфейсом IStream .
Вызовите IStream::Write , чтобы записать текстовые данные сообщения в поток, возвращенный из OpenProperty.
Вызовите IStream::Commit и IUnknown::Release в потоке, чтобы зафиксировать изменения и освободить память.
Настройка PR_BODY
Вызовите метод IMAPIProp::OpenProperty , чтобы открыть свойство PR_BODY с интерфейсом IStream .
Вызовите IStream::Write , чтобы записать текстовые данные сообщения в поток, возвращенный из OpenProperty.
Вызовите функцию RTFSync , чтобы синхронизировать текст с форматированием. Так как это новое сообщение, задайте флаги RTF_SYNC_RTF_CHANGED и RTF_SYNC_BODY_CHANGED, чтобы указать, что rtf и обычный текст изменились. RTFSync задаст несколько связанных свойств, необходимых поставщику хранилища сообщений, например PR_RTF_IN_SYNC (PidTagRtfInSync), и запишет их в сообщение.
Вызовите IStream::Commit и IUnknown::Release в потоке, чтобы зафиксировать изменения и освободить память.