Есть ли разница между форматами файлов Outlook .MSG и .OFT? - PullRequest
4 голосов
/ 31 октября 2011

Этот вопрос несколько длинен, но я потратил на него часы безрезультатно. У меня есть некоторый код, который генерирует файл электронной почты на веб-сервере и позволяет пользователю загрузить это письмо и открыть его в Outlook. Отсюда они могут вносить различные изменения в электронное письмо, прежде чем отправлять его нескольким людям.

Прямо сейчас я создаю файл .OFT, который по сути является шаблоном электронной почты. То, что я хочу сделать, это создать файл .MSG, который является реальным электронным письмом. С двоичной точки зрения кажется, что эти форматы файлов идентичны. Они имеют одинаковые идентификаторы потока, свойства и прочее.

Мой подход состоял в том, чтобы сначала создать пустое сообщение электронной почты в Outlook, а затем просто сохранить его в файле с именем Base.oft. В своем коде я открываю документ и изменяю идентификатор потока __substg1.0_1013001E, который является идентификатором тела письма в формате HTML. Затем я сохраняю файл и записываю его в cilent. Это отлично работает.

Я попробовал тот же подход с форматом MSG. Я создал пустое сообщение электронной почты, сохранил его как Base.msg и изменил тот же идентификатор потока. Если я посмотрю на полученный файл, то новое тело будет там и сохранено. Однако, если я открою письмо, тело останется пустым.

Что еще более странно, если я наберу тело в Outlook и сохраню его в базовом файле, я вижу это тело в потоке 0_1013001E. Если затем я изменю этот поток с другим телом, я смогу убедиться, что новое тело действительно сохранено в файле, но если я открою сообщение в Outlook, я увижу старое, оригинальное тело. Это похоже на то, как если бы тело письма сохранялось в другом месте в файле для формата .MSG, однако я просмотрел каждый поток и не могу найти ничего другого, похожего на тело письма.

Возможно, файлы .MSG зашифрованы или их тела хранятся в каком-то проприетарном двоичном формате, в отличие от файлов .OFT? Надеюсь, у кого-то есть понимание этого, так как я изучил Интернет и практически ничего не нашел в этих форматах.

Обновление:

Похоже, что формат .MSG хранит тело в идентификаторе потока. __substg1.0_10090102 - который закодирован в некоторой двоичной форме (не уверен, что.) Если я удаляю поток (или устанавливаю его в один \0, файл становится испорченным.

Ответы [ 2 ]

3 голосов
/ 02 ноября 2011

Прежде всего, чтобы найти больше информации по этой и смежным темам, отойдите от необработанных номеров подпотоков и Google для соответствующих свойств MAPI.Например, 1013 - это PR_HTML, а 1009 - PR_RTF_COMPRESSED.MAPI имеет способы синхронизации тела из одного формата в другой.

См. эту статью о MSDN для хорошего обзора всех свойств MAPI, связанных с контентом (т. Е. Различных «потоков» внутри файла .MSG).

Чтобы написать PR_RTF_COMPRESSED, оберните поток внутрь WrapCompressedStream .С другой стороны, в вашей конкретной ситуации вы можете избегать MAPI-зависимостей в своем коде, поэтому, возможно, вам лучше найти PR_STORE_SUPPORT_MASK и установить бит STORE_UNCOMPRESSED_RTF.Это позволит вам использовать прямой RTF в подпотоке PR_RTF_COMPRESSED.Или Outlooks, если вы чувствуете себя смелым. Если вы чувствуете себя смелым, то вам не нужен ни один из этих материалов для слабонервных.предполагаю, что это было бы возможно.

0 голосов
/ 27 февраля 2014

Когда дело доходит до формата, разницы нет. единственное отличие состоит в том, что файлы OFT имеют класс CLSID_TemplateMessage ({0006F046-0000-0000-C000-000000000046}) в качестве класса хранения (WriteClassStg), а файлы MSG используют CLSID_MailMessage ({00020D0B-0000-0000-C000-000000000046})

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...