Есть ли разница между Outlook .MSG и .Форматы файлов OFT?

#email #outlook #file-format #oft

#Адрес электронной почты #outlook #file-format #oft

Вопрос:

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

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

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

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

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

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

Обновить:

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

Ответ №1:

Прежде всего, чтобы найти больше информации по этому и смежным темам, отойдите от необработанных номеров подпотоков и найдите в 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. Или Outlook fancy html-wrapped-in-rtf, если вы чувствуете себя смелым.

Все это не для слабонервных, но, видя, как вы уже передаете подпоток raw .MSG, я предполагаю, что это было бы осуществимо.

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

1. Спасибо! Похоже, найти этот бит было бы моим лучшим выбором.. На самом деле мне вообще не нужен поток RTF, я просто хочу использовать поток HTML и изменять его. И вы правы, использование зависимости MAPI от веб-сервера было бы плохой идеей — мне, вероятно, пришлось бы выкапывать всевозможные непонятные библиотеки DLL из установки Outlook иличто-нибудь и напишите управляемые обертки вокруг них.

Ответ №2:

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