それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

MHTMLの実際

Yahoo!JapanをMHTMLにしてみた

WSH使ったスクリプト、mht.js

///////////JSからCDOを使って、MHTMLを作成する
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すれば?

CDO.Messageはなにするもの?

@IT:Windows TIPS -- Tips:Windows標準機能とWSHを使ってメールを送信する
http://www.atmarkit.co.jp/fwin2k/win2ktips/428wshmail/wshmail.html

Windowsシステムに含まれるCDOコンポーネントを利用することで、WSHスクリプトからメールを送信することができる。

どうやらメール送信ライブラリらしい。

じゃぁ、ほかのHTMLメール送信ライブラリでも?

ここは仮定。明日から調べる

  1. CPANMIMEメール関連のライブラリ
  2. PHPMIMEライブラリ
  3. PythonMIMEライブラリ

などを使えばMHTMLの読み書きが出来る?

ただ、HTMLに必要なJSやCSSを抽出したり、パスを解決するのが面倒。
LWPもfile_get_content()もHTMLファイルだけで、そのほかのファイルの読み込みをサポートしてくれない


逆に言うと、リンクパスを解決するライブラリを持つ言語は、MHTMLパッケージを簡単に作れるってこと

ならばどうする?

いまのところCDO.MessageやOfficeをWSHで呼び出すのが安定。
IE/Operaを操作し、URLを保存するもOK。(IEは非表示で起動できるし)

ただし、FireFoxは未対応(これ重要、拡張パッケージで解決するはず)

Perlならライブラリ多いよ?

パス解決するライブラリが一番多そう。だけどCPANLinuxがメイン
WindowsだとWSHIronPythonが候補。
PHPはバッチ処理に向かない。

LinuxでMHTML形式を使うなら、Perlか?しかしパッケージがない。

作れと?こんな感じ?

use MHTML;
my $mhtml = get_mht "http://yahoo.co.jp" ;

id:miyagawaサンが作ってくれないかと期待しとく。