アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

XPathでメール処理する「Mail_mime_XPath」を作ってみました。

こんにちは、亀本です。

相変わらずPerlわからないのにCPANのライブラリ群にお熱です。
以前、tomi-ruさんの日記で、Email::MIME::XPathというのがちょろっと紹介されていたんですが、これがとても便利そうだなーと思って垂涎たらしていました。

PHPでも、もちろんEmail::MIMEみたいなことができるPEAR::Mail_mimeというライブラリ群があるのですが、やはりforeachなどを使ってぐるぐる回して目的のデータを探す、という処理を毎回記述することになります。
これはやはり不便だし、いちいちmultipartの階層を気にしたりせず、もっとサクッとデータを取得したいな、と思いますよね。


ということで、PHPでも似たような感じでXPath式によってメールのデータを取得できるライブラリ「Mail_mime_XPath」を作成してみました。

ソースコードCodeReposに突っ込んでおいたので、適当に使ってあげてください。ちっちゃなライブラリです。
なお、使用する際にはPEARのMail_mimeパッケージもインストールしておく必要があります。

使い方ですが、



<?php 
require_once 'Mail/mime/XPath.php';

$doc = file_get_contents('hoge.eml');

$email = new Mail_mime_XPath($doc);
$part = $email->xpath('//*[@ctype_primary="text"]');

var_dump($part);


上記のように、メール本文からインスタンスを生成し、XPathで検索をかけるだけです。
上記の処理だけで、メールからtextパートのヘッダとデータの配列を取得することができます。


内部的には、PEARのMail_mimeDecodeでパースしたデータをもとに、SimpleXMLを使ってデータをXMLに直したうえで、XPathで検索、取得という処理をしています。

XPathで検索できる対象ですが、検索対象のデータ自体がMail_mimeに依存している関係から、Mail_mimeで配列のキーになっているものがXPathのノード名として使えます。
また、
・content-type
・ctype_primary
・ctype_secondary
・filename
という4つのデータだけは、各パートのプロパティとしても保持されているので、上記の例のようにこれらのプロパティで検索することによって、textパートの一覧とそのデータを抜き出すことが可能です。
PerlのEmail::MIME::XPathと違って正規表現的な方法は使えませんが、元々content-typeが分割されているので必要な処理はわりと柔軟に行うことができます。


勢いで作ったのでまだまだ荒削りですが、もっと洗練させることでもっとがっつり便利になるんじゃないかなと思っています。
ぜひぜひ使ってみたり修正してCodeReposにコミットしてみたりしてください。