Yahoo!JapanをMHTMLにしてみた
WSH使ったスクリプト、mht.js
var obj = WScript.CreateObject("CDO.Message");
var filename = "test.mht";
var url = "http://www.yahoo.co.jp/";
obj.MimeFormatted = true;
obj.CreateMHTMLBody( url, 0, "", "" );
obj.GetStream().SaveToFile( filename, 1 );
出来上がったMHTMLの中身
thread-index: AcgKhmRFFkspMVI3QSeZX/AcFCZgwg==
MIME-Version: 1.0
Content-Type: multipart/related;
boundary="----=_NextPart_000_0001_01C80AD1.D4E21C90"
Content-Location: http://www.yahoo.co.jp/
Content-Class: urn:content-classes:message
Importance: normal
Priority: normal
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3138
This is a multi-part message in MIME format.
------=_NextPart_000_0001_01C80AD1.D4E21C90
Content-Type: multipart/alternative;
boundary="----=_NextPart_001_0002_01C80AD1.D4E21C90"
------=_NextPart_001_0002_01C80AD1.D4E21C90
Content-Type: text/plain;
charset="euc-jp"
Content-Transfer-Encoding: base64
pLOkzqXaobyluKTypbmlv6G8pcil2qG8pbiky8DfxOqkuaTrpLOkzqXaobyluKTypbmlv6G8pcil
2qG8pbiky8DfxOqkuaTrDQqkqsbApMfK2M34pMqltaG8pdOluaSspKSkw6TRpKQJIA0KCSANCgkg
DQoJIA0KWWFob28hIEpBUEFOIA0KCSANCg0KDQoNCltuZXddy9zG/KXJpeml3qTis6u7z6GqocjG
r6Stpd6l86HJpL+kwaSszLTD5qTLpMqk67DCzO6l4qXopbOkzsCks6YgLSBbbmV3XcG0ufGkzsDk
t8q5yM3Vpbml3aXDpci+8MrzIAkNCgkgDQoJDQoJICAgICAJpaalp6XWuKG69yAJILihuvelqqXX
pbel56XzCSANCgkgDQoJIMXQz7+ltaWkpcgJIAkgsujB/AkgCSDGsLLoCSAJIKXWpe2lsA0KvK29
8QkgCSDDzrfDwt4JIAkgw8+/3gkgCSC+psnKCSAJIA0KpcShvKXrpdChvKTLv7e1oce9xeu63KGi
..(以下略
HTTPのHEADERと何ら変わらない。
もしかしてHTTP通信内容をそのまま保存するだけでMHTMLになる?
わざわざ、CDOオブジェクト作らなくても良いかも?
HTTPのMultipart/Formにソックリ
HTTPでフォームのファイル送受信の内容にソックリ。当たり前か。
メソッドがCDO.GetStream().SaveToFile()なのでStreamを直接保存してるだけだな
IEのオートパイロット中にTCP/IPをDUMPすれば?
じゃぁ、ほかのHTMLメール送信ライブラリでも?
ここは仮定。明日から調べる
- CPANのMIMEメール関連のライブラリ
- PHPのMIMEライブラリ
- PythonのMIMEライブラリ
などを使えばMHTMLの読み書きが出来る?
ただ、HTMLに必要なJSやCSSを抽出したり、パスを解決するのが面倒。
LWPもfile_get_content()もHTMLファイルだけで、そのほかのファイルの読み込みをサポートしてくれない
逆に言うと、リンクパスを解決するライブラリを持つ言語は、MHTMLパッケージを簡単に作れるってこと
ならばどうする?
いまのところCDO.MessageやOfficeをWSHで呼び出すのが安定。
IE/Operaを操作し、URLを保存するもOK。(IEは非表示で起動できるし)
ただし、FireFoxは未対応(これ重要、拡張パッケージで解決するはず)