Получение MAPI_E_COMPUTED при изменении PidTagBlockStatus в OutlookSpy

У меня есть файл .MSG, для которого я не могу изменить PR_BLOCK_STATUS (PidTagBlockStatus). Если я изменю его с помощью OutlookSpy или MFCMapi, я получаю MAPI_E_COMPUTED.

Outlook также отображает ошибку при сохранении этого сообщения (это происходит после того, как пользователь нажимает кнопку «Показать внешние изображения», затем закрывает сообщение, Outlook отображает диалоговое окно «Сохранить изменения?», И пользователь соглашается).

Однако PidTagBlockStatus не является вычислимым свойством. Я не могу понять, почему это происходит. У меня есть другой файл .MSG, который является почти копией первого (OutlookSpy и MFCMapi показывают, что оба файла .MSG имеют одинаковые поля / значения), но для этого файла я могу установить PR_BLOCK_STATUS. Однако эти файлы имеют разную длину, и низкоуровневые утилиты, такие как SSView, показывают, что в более крупном (и «рабочем») файле больше полей. Однако эти загадочные поля не отображаются в OutlookSpy или MFCMapi.

Проблема не связана с неправильной настройкой PidTagMessageDeliveryTime, поскольку оба сообщения (рабочее и нерабочее) имеют одинаковый PidTagMessageDeliveryTime (а также другие поля). Сам Outlook (который знает, как правильно установить PR_BLOCK_STATUS из PidTagMessageDeliveryTime) не может завершить операцию сохранения сообщения.

«Рабочий» файл был сохранен прямо из Outlook, «нерабочий» - с помощью стороннего ПО. Мне нужно найти способ «исправить» нерабочий файл, чтобы Outlook мог без проблем сохранять PR_BLOCK_STATUS.

Еще кое-что. Можно вообще просто удалить PR_BLOCK_STATUS из .MSG. Это, однако, приводит к тому, что после того, как пользователь нажимает кнопку «Показать внешние изображения», Outlook правильно устанавливает PR_BLOCK_STATUS, но сообщение становится пустым в Outlook до тех пор, пока оно не откроется в следующий раз. Так что и у меня этот метод не работает. Для этого я добавляю PR_BLOCK_STATUS в сообщение и устанавливаю его равным нулю (позволяя Outlook вычислять правильное значение, если пользователь решил отображать внешние изображения). При значении по умолчанию, равном нулю, Outlook обычно показывает сообщение после нажатия кнопки «Показать внешние изображения», но не может обновить файл .MSG при закрытии сообщения.

Другой метод - заранее вычислить PR_BLOCK_STATUS в состоянии «показать внешние изображения» (как описано в html email Outlook просит загрузить изображения тема), но я не могу этого понять, так как это должно быть решение пользователя для каждого конкретного сообщения, а не мое.

Ссылки на файлы .MSG (хорошие / рабочие и плохие / нерабочие) https://dl.dropboxusercontent.com/u/18102725/msgs.zip

Использование 64-разрядной версии Outlook 2010, 64-разрядной версии Windows 7 Ultimate, OutlookSpy 3.7.


person Alex    schedule 08.12.2015    source источник


Ответы (1)


Файлы MSG позволяют установить любое свойство, включая PR_LAST_MODIFICATION_TIME или PR_ENTRYID. Как стороннее программное обеспечение создает файлы MSG? Просматривали ли вы файлы MSG с помощью средств просмотра хранилища OLE, например средства просмотра структурированного хранилища (http://www.mitec.cz/ssv.html)?

person Dmitry Streblechenko    schedule 08.12.2015
comment
Спасибо за ответ. Программное обеспечение создает их, не полагаясь на MAPI, генерируемый код самодостаточен. И да, я смотрел с SSView (как упоминалось в моем исходном сообщении), и я видел разницу (но я не вижу никакой разницы в OutlookSpy или MFCMapi). И, как я сказал ранее, SSView просто позволяет мне увидеть разницу, но он слишком низкоуровневый, чтобы я мог понять что-либо из отображаемой структуры. Если вы откроете bad.msg из прикрепленного zip-архива в OutlookSpy и попытаетесь отредактировать и сохранить PR_BLOCK_STATUS, вы получите сообщение об ошибке. - person Alex; 09.12.2015
comment
Думаю, я сразу вижу, что ни один из файлов не имеет CLSID, установленного на корневом узле. Для файлов MSG и OFT он отличается. В вашем случае это CLSID_NULL. - person Dmitry Streblechenko; 10.12.2015
comment
Тем не менее, good.msg был сохранен непосредственно из Outlook, и у Outlook нет проблем с обновлением PR_BLOCK_STATUS в этом файле. Так что отсутствие CLSID не должно быть причиной проблемы. Если бы CLSID отсутствовал только в bad.msg, это объяснило бы проблему. - person Alex; 10.12.2015
comment
Я никогда не видел файла MSG с отсутствующим CLSID. Какую версию Outlook вы использовали для создания файла MSG? - person Dmitry Streblechenko; 11.12.2015
comment
На самом деле файл был сохранен из Outlook клиентом (по крайней мере, что там написано), поэтому я не могу точно сказать, как они это сделали. В любом случае, этот файл good.msg, даже без CLSID, отлично подходит для Outlook (он правильно показывает внешние картинки и сохраняет PR_BLOCK_STATUS). Кроме того, как найти CLSID в OutlookSpy? Я открыл несколько различных файлов .MSG, но нигде не увидел это свойство .. - person Alex; 11.12.2015
comment
OutlookSpy работает с сообщением, возвращаемым OpenIMsgOnIStg. Если вы хотите увидеть свойства уровня хранилища COM файла MSG (они не отображаются на уровне MAPI), используйте средство просмотра хранилища OLE. - person Dmitry Streblechenko; 11.12.2015