Расширенный MAPI -чтение тела письма добавляет пробел после каждого символа

#c #outlook #exchangewebservices #mapi

#c #outlook #exchangewebservices #mapi

Вопрос:

Я пытаюсь проанализировать электронное письмо с помощью расширенного MAPI.

Чтобы получить указатель потока, я использую LPMAPIPROP::OpenProperty() с PR_BODY тегом для возврата a IStream* , и я использую IStream::Read() метод для чтения данных в буфер.

По какой-то причине, когда я открываю электронное письмо с помощью MFCMAPI, с телом все в порядке. Например, "ABC" . Но, когда я пытаюсь программно прочитать в буфер, я получаю символы пробела после каждого символа, например "A B C" .

Ответ №1:

Это пробел ( 0x20 ) или нет 0x00 ? Если вы открываете PR_BODY_W (в отличие от PR_BODY_A ), вы получите строку Unicode (два байта на символ), а не однобайтовую строку.

Комментарии:

1. Нет, это пробел 0x20, а не нулевой ограничитель 0x0. Я открываю PR_BODY_W вместо 0x65 0x00 0x66 0x00 значение 0x65 0x00 0x20 0x00 0x66 0x00…

2. Это то, что вы видите в MFCMAPI или OutlookSpy (нажмите iMessage, выберите свойство PR_BODY, нажмите «…» рядом с полем редактирования «Значение»)?

3. Вы также можете попробовать открыть PR_BODY_W в OutlookSpy — щелкните правой кнопкой мыши на свойстве, выберите IMAPIProp::OpernProperty, выберите IID_IStream.

4. Я тоже пробовал с OutlookSpy, к сожалению, результат тот же.

5. Тогда вы ничего не видите — у вас действительно есть лишние пробелы. Вы видите то же самое в PR_RTF_COMPRESSED (это то, что на самом деле отображает Outlook)?

Ответ №2:

По какой-то причине файл PR_RTF_COMPRESSED был поврежден, и вместо отображения RTF он просто показывал PR_BODY с пробелами между каждым символом. Я думаю, это было вызвано тем, что я пытался вручную установить PR_RTF_COMPRESSED вместо того, чтобы позволить Outlook установить его для меня.

Комментарии:

1. Вам нужно только установить PR_RTF_COMPRESSED (или вызвать RtfSync ), если хранилище изначально не поддерживает RTF ( STORE_RTF_OK бит в PR_STORE_SUPPORT_MASK)