ByteScope

MSG Viewer

收到 .msg 檔卻打不開?不用裝 Outlook:寄件資訊、兩種內文、每一個附件都能直接看、直接下載,檔案從頭到尾不離開你的瀏覽器。

.msg 檔案會在你的裝置上直接開啟。郵件標頭、內文與附件皆在頁面內解析,絕不會傳送至任何地方 — 無需上傳、無需帳號,也不需要 Outlook。

將 Outlook 的 .msg 檔案拖曳至此

從 Outlook 儲存或拖曳出的郵件 — 或點擊選擇檔案。

再拖一個檔案進來會直接換掉畫面上的內容,所以就算開失敗,也不會留著上一封信讓你誤會。

關於這個工具

.msg 是 Outlook 把郵件拖到桌面或另存時產生的檔案,也是最難搞的一種附件:沒裝 Outlook 幾乎沒有東西能開它,預覽不了,點兩下只剩一個打不開的圖示。把它拖進這一頁,郵件會當場被拆開——寄件者、收件者、寄出日期、主旨、純文字和 HTML 兩種內文,每個附件旁邊都有下載按鈕。

檔案不會離開你的電腦。一封存下來的郵件寫明了誰寫信給你、收件人還有誰、附了什麼——這種東西不該只為了讀一下就交給陌生的伺服器。所以容器的解析、屬性的解碼、附件的還原,全部在你的瀏覽器裡完成;這裡根本沒有上傳端點,就算手滑也傳不出去。

HTML 內文的本質是「寄件者寫的標記」,我們就照這個本質對待它:內文畫在一個沙箱化的 frame 裡,不能執行 script、碰不到這個頁面,預設也完全不能連網——那顆用來通知寄件者「信被打開了」的追蹤像素,在你勾選允許之前永遠載入不了。連結不做成可點擊的樣子,而是把真正的目的地印在文字旁邊,因為在一封你沒預期會收到的郵件裡,最值得細看的就是那個目的地。

檔案底層是一個 CFB 容器:由 storage 和 stream 組成的小型檔案系統,郵件的 MAPI 屬性就寫在裡面。這個結構是對照 MS-CFB 與 MS-OXMSG 規格逐位元組解析出來的,不是用猜的。檔案哪裡壞了——stream 被截斷、sector 鏈繞成迴圈、瀏覽器解不出的 code page——頁面會另起一行明講,而不是把殘缺的郵件當成完整的給你看。

常見問題

沒有 Outlook 要怎麼開 .msg 檔?

拖進這一頁就好。.msg 容器直接在瀏覽器裡解析,寄件者、收件者、日期、主旨、內文、附件全部看得到——不用 Outlook、不用匯入郵件軟體、也不用帳號。

我的郵件會被上傳到哪裡嗎?

不會。瀏覽器直接從你的磁碟讀檔,所有處理都在頁面裡完成。整個過程沒有伺服器參與,關掉分頁就什麼都不留。

寄件者會知道我打開這封郵件嗎?

除非你自己允許,否則不會。遠端圖片——包括一像素的追蹤圖——預設全部封鎖:HTML 內文是在完全禁止網路請求的政策下渲染的。頁面會告訴你找到幾個遠端參照;要載入得自己勾一個明確的核取方塊,而且每開一個新檔案就會重設。

HTML 內文裡的 script 會執行嗎?

不會。內文渲染在一個 sandbox 既不給 script、也不給 same-origin 存取的 iframe 裡,所以郵件裡的 script 跑不起來,郵件內容也讀不到這個頁面。預設先顯示純文字內文。

附件可以下載嗎?

可以——每個附件都有自己的下載按鈕,位元組直接取自你手上的 .msg。不會抓任何東西,也不會送出任何東西。

為什麼附件存下來的檔名跟原本有點不一樣?

因為檔案裡的名字是寄件者寫的,可能夾帶目錄分隔符、.. 片段、控制字元,或那種讓 invoice.exe 看起來像 invoice.txt 的隱形字元。這些都會在檔名進到你的下載資料夾之前被剝掉;只要清理後的名字和原本不同,頁面就會顯示出來。

為什麼時間都用 UTC 顯示?

因為郵件本來就是這樣存的。Outlook 記錄的是 UTC 的 FILETIME,如果順手換算成你電腦目前的時區,就會出現「這封信明天才寄出」這種怪事。所以數值照記錄原樣顯示,並標明 UTC

如果檔案壞了,或根本不是 .msg 呢?

頁面會明確說出問題在哪。完全不是 Compound File Binary 容器、stream 比宣告的長度短、sector 鏈繞成迴圈、瀏覽器解不出的 code page——每一種都有自己的一行訊息,而已經解析成功的部分照樣顯示,不會跟著一起丟掉。