MHTMLファイルとは
MHTMLファイル(またはMHTファイル)とは、MIME HTML の略で、Webページを構成するHTMLファイルや画像、スタイルシートなどの関連ファイルを、1つのファイルにまとめて保存するための形式です。
これにより、オフライン環境でもWebページの内容をそのまま表示したり、共有したりすることが容易になります。
用途としては、以下あたりに使われます。
- Webページの保存・アーカイブ(魚拓)
- Webページのオフラインでの閲覧
- Webページの共有
- 電子メールの添付ファイルに利用
- Windows Vistaから搭載されている「ステップ記録ツール」の実行結果の保存
Chomeでの、mhtmlの保存
保存したいWebページを表示して、右クリック->名前を付けて保存を選択します。
(Ctrl+Sでも、名前を付けて保存を呼び出せます。)

すると、「名前を付けて保存」のダイアログが表示されるので、
mhtml形式で保存するには「ウェブページ、1つのファイル(*.mhtml)」を選択すればOKです。

なお、選択肢は以下のような形で保存する形式になります。
- ウェブページ、1つのファイル(*.html,*.htm)
画像やスタイルシートなどのファイルを含まない、htmlファイルを保存します。 - ウェブページ、1つのファイル(*.mhtml)
Webページを構成するHTMLファイルや画像、スタイルシートなどの関連ファイルを、1つのファイルにまとめて保存します - ウェブページ、完全(*.html,*.htm)
htmlファイルを保存するとともに、<htmlのファイル名_files>というフォルダを作成して、そこに画像、スタイルシートなどの関連ファイルを保存します。
「ウェブページ、完全(*.html,*.htm)」の利点と欠点
「ウェブページ、完全(*.html,*.htm)」も関連ファイルを含めて保存してくれます。
ではウェブページ、完全(*.html,*.htm)でよいではないか意見もありますが、
保存や、単純に画僧ファイル等を取り出すには便利なのですが、Windowsのエクスプローラ的にはhtmlと対応フォルダが1セットの認識となり、片方のファイルをコピーや移動、削除すると、フォルダも併せてコピー、移動、削除されてしまったりするので、扱いが少し難しいです。
これは、フォルダ側を操作しても同じです。
しかもこの1セットは、Zipファイルに圧縮などをした後に別の場所に展開しても引き継がれます。

なので、このページの画像ファイルだけ、抽出して保存したいといった場合は、保存用のフォルダを別に作成して、そこに画像ファイルだけをコピーして取り出すみたいな運用が主になります。
一応htmlファイルだけのファイル名を変更すると、以下のような警告が出て、
htmlと対応フォルダが1セットで扱われることを解除することも可能ですが、
元データはそのままにしたい場合には注意が必要になります。

また、画像ファイルのファイル名は、htmlで保存された
ウェブページ、1つのファイル(*.mhtml)の利点と欠点
「ウェブページ、1つのファイル(*.mhtml)」は
Webページを構成するHTMLファイルや画像、スタイルシートなどの関連ファイルを、1つのファイルにまとめて保存しますので、完全に1ファイルでの取り扱いになります。
ですので、Webページを完全な形で保存(魚拓)したり、
このファイルをローカル環境内で共有したりするには最適な形式になります。
メール送付も簡単です。
Mhtmlのファイルの中身は、MIME形式で変換・保存されています。
イメージ的には、メールの添付ファイルと同じ形式です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
From: <Saved by Blink> Snapshot-Content-Location: https://nsb.homeip.net/wp/?p=2750 Subject: =?utf-8?Q?Nintendo=20Switch=202=20=E9=96=8B=E5=B0=81=E3=81=AE=E5=84=80=20?= =?utf-8?Q?=E2=80=A2=20=E5=A5=88=E9=85=A2=E7=BE=8E=E3=81=AE=E9=83=A8=E5=B1?= =?utf-8?Q?=8B=20=E5=88=A5=E9=A4=A8?= Date: Sun, 22 Jun 2025 14:23:34 +0900 MIME-Version: 1.0 Content-Type: multipart/related; type="text/html"; boundary="----MultipartBoundary--o83pD5AY2pggMB145lCbhA16EunEAjpxoO90tUpJEh----" ------MultipartBoundary--o83pD5AY2pggMB145lCbhA16EunEAjpxoO90tUpJEh---- Content-Type: text/css Content-Transfer-Encoding: quoted-printable Content-Location: https://nsb.homeip.net/wp/wp-content/plugins/yet-another-related-posts-plugin/style/related.css?ver=5.30.11 @charset "utf-8"; .yarpp-related { margin-bottom: 1em; margin-top: 1em; } .yarpp-related a { font-weight: 700; text-decoration: none; } .yarpp-related .yarpp-thumbnail-title { font-size: 96%; font-weight: 700; t= ext-align: left; text-decoration: none; } .yarpp-related h3 { font-size: 125%; font-weight: 700; margin: 0px; padding= : 0px 0px 5px; text-transform: capitalize; } ------MultipartBoundary--o83pD5AY2pggMB145lCbhA16EunEAjpxoO90tUpJEh---- Content-Type: image/jpeg Content-Transfer-Encoding: base64 Content-Location: https://nsb.homeip.net/wp/wp-content/uploads/2025/06/20250613_225047_HDR-1024x768.jpg /9j/4AAQSkZJRgABAQEASABIAAD/4UQRRXhpZgAATU0AKgAAAAgADAEAAAMAAAABD8AAAAEQAAIA AAAGAAAAngEBAAMAAAABC9AAAAESAAMAAAABAAEAAAEyAAIAAAAUAAAApAITAAMAAAABAAEAAIdp AAQAAAABAAAAyAEoAAMAAAABAAIAAIglAAQAAAABAAADzAEaAAUAAAABAAAAuAEbAAUAAAABAAAA wAEPAAIAAAAETEdFAAAAA9I5MDFMRwAyMDI1OjA2OjEzIDIyOjUwOjQ3AAAAAEgAAAABAAAASAAA AAEAIIgnAAMAAAABAcIAAIgiAAMAAAABAAIAAIKdAAUAAAABAAACToKaAAUAAAABAAACVqIXAAMA AAABAAEAAJKSAAIAAAAHAAACXpKRAAIAAAAHAAACZZKQAAIAAAAHAAACbJIKAAUAAAABAAACc5IJ AAMAAAABABAAAJIIAAMAAAABABQAAJIHAAMAAAABAAIAAKQGAAMAAAABAAAAAJKGAAcAAADjAAAC |
1 |
このため、mhtmlファイルのhtmlの関連のファイルを取り出そうとすると、直接はできません。
mhtmlファイルを1つづつ、ブラウザを使って画像ファイルを一個づつ保存するか、
「ウェブページ、完全(*.html,*.htm)」で保存しなおしてファイルを取り出すことが必要になります。
また、Windows Vistaから標準搭載されている「ステップ記憶ツール」という、
操作内容を記録して、その様子をまとめたレポートを作成する機能
(Windowsの画面操作推移を操作内容とスクリーンショットを自動的に保存してくれるツール)
の保存形式もmhtmlをzip変換となります。仕事で使われてい方もいるかもしれません。

(参考)
Windows ステップ記録ツール(psr)のススメhttps://qiita.com/gzock/items/1c934d6577eec3b7f7ff
なので、mhtmlファイルは、保存や共有には便利ですが、
加工は難しいというのが特徴になります。
mhtmファイルの展開ツールを作る
ブラウザを経由すると、mhtmlごとに操作が必要なため、試しにWindows2000から標準利用できる標準スクリプト言語であるVBScript(Windows Script Host)を利用して、展開ツールを作ってみます。
VBScriptは非常に高機能で、Win32APIや、COMコンポーネントも操作できるため、システムの自動化やWebサイトの構築に使われていました。
が、現在では「PowerShell」や「JavaScript」といった、より強力で汎用性の高いスクリプト言語にとって代わられているのが実情ではあり、
2023年には非推奨、2027年にはフォルト無効(追加インストール可能)、その後完全な廃止が予定されているとのことです。
しかし、Windowsのライセンス操作や確認等の多くの内部コマンド(slmgr.vbs)もVBScriptで書かれており、完全な廃止には、かなりの困難が見込まれます。
今回作成したスクリプトは以下のようなものです。
(ご利用は自己責任でお願いします。)
(なお、エンコードは「ANSI」にして保存してください。)
(_99_ExpandMHTML.vbs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
Option Explicit Dim fso Dim Path Dim FolderName dim k Set fso=CreateObject("Scripting.FileSystemObject") For Each Path In WScript.Arguments FolderName=fso.BuildPath(fso.GetParentFolderName(Path),fso.GetBaseName(Path)) If fso.FolderExists(FolderName) Then For k=2 To 9 If Not fso.FolderExists(FolderName & " " & k) Then Exit For Next FolderName=FolderName & " " & k End If if instr (1,FolderName,"?",0) Then FolderName = Replace(FolderName, "?", "_[?]_") & "_●●●●●Use_Unicode●●●●●" 'MsgBox FolderName,vbOKOnly fso.CreateFolder FolderName else fso.CreateFolder FolderName Call Expand(Path,FolderName) end if Next Sub Expand(Path,Folder) Dim Stm Dim Msg Dim File Dim RenBatFile Set Stm=CreateObject("ADODB.Stream") Stm.Open Stm.LoadFromFile Path set Msg=createobject("CDO.Message") Msg.DataSource.OpenObject Stm, "_Stream" Set File=fso.CreateTextFile(Folder & "\index.html") File.WriteLine "<table border><thead><td>File</td><td>Content-Type</td><td>Content-Location</td></thead><tbody>" Set RenBatFile=fso.CreateTextFile(Folder & "\_rename.bat") Call SaveToFile(Msg.BodyPart,"1",Folder,File,RenBatFile) File.WriteLine "</tbody></table>" File.Close RenBatFile.WriteLine "ren _rename.bat rename.bat" RenBatFile.Close 'MsgBox "変換完了",vbOKOnly End Sub Sub SaveToFile(BodyPart,BaseName,Folder,File,RenBatFile) Dim k Dim memfnamenum Dim memfnameorg If BodyPart.BodyParts.Count Then For k=1 To BodyPart.BodyParts.Count Call SaveToFile(BodyPart.BodyParts.Item(k),BaseName & "." & right("00000" & Cstr(k) , 5),Folder,File,RenBatFile) Next Else File.WriteLine "<tr><td>" & BaseName & "</td><td>" & BodyPart.Fields.Item("urn:schemas:mailheader:content-type") & "</td><td>" & fso.GetFileName(BodyPart.Fields.Item("urn:schemas:mailheader:content-location")) & "</td><td>" & BodyPart.Fields.Item("urn:schemas:mailheader:content-location") & "</td></tr>" BodyPart.SaveToFile Folder & "\" & BaseName & ".txt" memfnamenum=BaseName memfnameorg=fso.GetFileName(BodyPart.Fields.Item("urn:schemas:mailheader:content-location")) memfnameorg = Replace(memfnameorg, "\", "¥") memfnameorg = Replace(memfnameorg, "/", "/") memfnameorg = Replace(memfnameorg, ":", ":") memfnameorg = Replace(memfnameorg, "*", "*") memfnameorg = Replace(memfnameorg, "?", "?") memfnameorg = Replace(memfnameorg, """", Chr(&H8168)) ' VBAでは全角のダブルクォーテーションが打てない memfnameorg = Replace(memfnameorg, "<", "<") memfnameorg = Replace(memfnameorg, ">", ">") memfnameorg = Replace(memfnameorg, "|", "|") memfnameorg = Replace(memfnameorg, "=", "=") memfnameorg = Replace(memfnameorg, "&", "&") memfnameorg = left(memfnameorg,100) RenBatFile.WriteLine "ren " & memfnamenum & ".txt " & memfnameorg End If End Sub |
使い方は、上記スクリプトを「(_99_ExpandMHTML.vbs」という名前で保存して、
mhtmlファイルを選択して、(_99_ExpandMHTML.vbsにドラックします。
複数mhtmlファイルを選択して、まとめてドラックこともできます。

mhtmlファイルごとにフォルダができ、そこに連番のtxtファイルが展開されます。



ここで、
index.mtmlファイルが、連番ファイルとmhtmlファイル内のファイル名の対応表になります。

_rename.batが、上記対応表にリネームするバッチファイルです。
通常はこのファイルを実行してリネーム処理を行えばOKです。
_rename.bat実行後は「_rename.bat」ファイルは「 rename.bat」に自動でリネームされます。
(一部ファイル名で使えない文字がある場合は、2バイト文字に変更しています。またファイル名が長い場合も、強制的に短くしています。)

なんで、リネーム処理を分けているのかというと、保存されているファイル名が、
htmlで参照されている順番にソールされているとは限らないからです。
連番の状態では、参照順になっているようで、場合によっては、連番状態ファイルの拡張子をren *.txt *.jpegのようにリネーム化したほうが良い場合もあるので意図的に分けています。
(あと、セキュリティ的に、バッチファイルを自動実行させるのも怖かったので)
VBScriptですので、
状況によっては、_rename.batの作成るルールを変えることで、リネームするファイルを選別したり、リネームルールを変更もできます。
VBScriptから_rename.batを自動呼出しもできますので、ご自由にカスタマイズしてみてください。
VBScript利用時による注意点(ファイル名内Unicode文字)
VBScriptが古いツールであるため、Unicodeを含んだファイル名の操作に失敗することがあります。
その場合、フォルダ名を以下のように変えて、フォルダ作成時して、変換はスキップします。
- Unicode文字は、「ユニコード文字1文字」ー>「_[?]_」
- フォルダの最後に「_●●●●●Use_Unicode●●●●●」を追加

ユニコード文字は一部記号や外国で使われている文字に多く使われています。
「〜」「•」
ただし、すべての使用できない文字をうまく検知できないため、
フォルダは普通にできていても、VBScriptがエラーになって、処理が途中で終了してしまう場合があります。
複数のmhtmlファイルを処理する場合は、用途外のツールの利用ですが、以下のツールを利用すると、使用できるファイル名かどうかをチェックをすることが可能なようです。
WinExChange
https://www.vector.co.jp/soft/win95/util/se139464.html?srsltid=AfmBOoopZav_RnSgZrj4Wbilc_Q4qUFGV820PTHqrmsjVLymYTHUP0FF
本来は「1300種類以上の拡張子判別に対応した拡張子判別変換ツール」なんですが、
複数ファイルをドラックしたときに「次へ」で拡張子を変換せずに、確認だけすることができます。「Ant+N」でどんどん次に進めるので、エラーが出ないかチェックだけならすぐに終わります。
VBSで利用できないようなファイルがあった場合、「読み込みに失敗しました」
のように表示されます。
表示されているファイルの前後のファイルが処理できないものです。
このチェックをすれば、ほぼ、「(_99_ExpandMHTML.vbs」による展開処理は成功します。

以下の例ですと、
「_Nintendo Switch 2 開封の儀 • 奈酢美の部屋 別館.mhtml」の「 • 」が引っかかっているので、これを「 ・ 」に変更すると、ファイル名チェックが通るようになります。

mhtmlファイルの出元にもよりますが、「 」(スペース2つ連続)とかもひっかかることがあるので、この辺は試行錯誤になります。
(参考)
複数のフォルダを、一括でフォルダ事にZip圧縮処理する方法
以下のバッチファイルで、同じフォルダにあるフォルダを、フォルダ毎のZipファイルに圧縮・変換できます。
以下は、64bit版の7-zipを導入されていることが前提です。
(09_圧縮.bat
1 |
@echo off<br />set ZIP_PATH="C:\Program Files\7-Zip\7z.exe"<br />for /d %%f in (*) do (<br /> %ZIP_PATH% a -tzip "%%f.zip" "%%f"<br />)<br /> <br />pause |