2011-10-31 443 views
4

這個問題有點長遠,但我花了幾個小時無濟於事。我有一些代碼可以在網絡服務器上生成一個電子郵件文件,並允許用戶下載該電子郵件並在Outlook中打開它。從這裏開始,他們可以在將電子郵件發送給一羣人之前對電子郵件進行各種手動更改。Outlook .MSG和.OFT文件格式有區別嗎?

現在,我生成一個.OFT文件,它基本上是一個電子郵件模板。我想要做的是生成一個.MSG文件,這是一個真正的電子郵件。從二進制角度看,這些文件格式似乎是相同的。他們有相同的流ID和屬性和東西。

我的方法是首先在Outlook中創建一個空白電子郵件,然後將其保存到名爲Base.oft的文件中。在我的代碼中,我打開文檔並修改流ID爲__substg1.0_1013001E,這是HTML電子郵件正文的ID。然後保存文件並將其寫入靜音。這工作完美。

我嘗試了與MSG格式相同的方法。我創建了一封空白電子郵件消息,將其保存爲Base.msg,並修改相同的流ID。如果我查看生成的文件,新機構實際上就在那裏並保存。但是,如果我打開電子郵件,身體仍然是空白的。

什麼是更奇怪的是,如果我在Outlook中鍵入一個正文並將其保存到基本文件,我可以看到流0_1013001E下的正文。如果我然後用不同的主體修改這個流,我可以驗證新的主體是否確實保存在文件中,但是如果我在Outlook中打開郵件,則會看到舊的原始主體。就好像電子郵件正文存儲在.MSG格式的文件中的不同位置,但是我瀏覽過每個流,並且找不到其他任何看起來可能是電子郵件正文的其他內容。

也許.MSG文件被加密,或者他們的身體以不同於.OFT文件的專有二進制格式存儲?希望有人對此有所瞭解,因爲我搜索了互聯網,並且幾乎找不到這些格式。

更新:

看來.MSG格式存儲身體流ID __substg1.0_10090102 - 這是一些二進制形式編碼(不知道)。如果我刪除流(或將其設置爲單\0,該文件已經損壞。

回答

3

首先,找到就這個問題和相關主題的更多信息,從原材料子號搬走和谷歌相應的MAPI屬性。例如,1013 PR_HTML和1009是PR_RTF_COMPRESSED 。MAPI可以將身體從一種格式同步到另一種格式。

請參閱this有關所有與內容相關的MAPI屬性的完整概述的MSDN文章。 .MSG文件中的不同「流」)。

要編寫PR_RTF_COMPRESSED,請將該流封裝到WrapCompressedStream之內。另一方面,在特定情況下,您可能希望避免代碼中的MAPI依賴性,因此最好找到PR_STORE_SUPPORT_MASK並設置STORE_UNCOMPRESSED_RTF位。這將允許您在PR_RTF_COMPRESSED子流中使用直RTF。或者如果你感覺勇敢的話,Outlook可能會喜歡html-wrapped-in-rtf。

這些東西都不是爲了心臟,但看到你是如何處理原始.MSG子流寫作,我猜這是可行的。

+0

謝謝!看起來像是發現那一點是我最好的選擇..我其實根本不需要RTF流,我只是想使用HTML流並對其進行修改。而你說得對,MAPI依賴於Web服務器將是一個壞主意 - 我可能不得不從Outlook安裝或類似的東西挖掘各種隱藏的DLL,並在它們周圍編寫託管包裝器。 –

0

說到格式,沒有什麼區別。 唯一的區別是OFT文件具有CLSID_TemplateMessage({0006F046-0000-0000-C000-000000000046})作爲存儲類(WriteClassStg),而MSG文件使用CLSID_MailMessage({00020D0B-0000-0000-C000-000000000046})

相關問題