リッチテキスト形式のメール(TNEF)をPHPで解読

| コメント(0)

Outlook(Outlook Expressも?)で添付ファイルをつけてメール送信すると、なんとも不思議なことに勝手にリッチテキスト形式になるようで。

E-Mailの形式としては、リッチテキストは、SMTPのプロトコルとしては扱えませんので、添付ファイル扱いとなります。リッチテキスト部分だけ添付ファイルとなればいいのですが、なんと添付ファイル込みでのリッチテキストとなります。設定によっては、テキスト形式としているのにも関わらず、リッチテキスト化されてしまう現象も確認しております。

また、社内のネットワークで、メール環境をMS Exchangeで構築されている場合、MS Exchangeの設定でメールデータをリッチテキストに変換することそ推奨しているようです。添付ファイルがあった場合。

そうすると、どんなことをしても、添付ファイルは勝手にリッチテキスト内にあることになり、さらにbase64で暗号化されてしまいます。

このとき、リッチテキスト形式をメール内で扱うための形式をTNEFTransport Neutral Encapsulation Format)といいます。

 この形式については、日本語の記事がなかなか見つからず、以下見つけたのが、squirrelmailのt-nefプラグイン。これは、phpで書かれていますので、解析できるかなと思ってダウンロードしてみました。

いくつか修正ポイントはありましたが、わりと修正は簡単でした。修正したのち、includeでライブラリを読み込んでなんとか、t-nef形式を解読できるようになりました。

このプラグインのライセンスについては、まだちゃんと理解していませんが、問題なければ、ここ?どこ?かで公開したいと思います。

使い方は、以下。

http://www.squirrelmail.org/plugin_view.php?id=62

$params['include_bodies'] = true;
$params['decode_bodies']  = true;
$params['decode_headers'] = true;
$params['input']          = $mail_source;	// メールをセット
$params['crlf']           = '\r\n';
// PEAR Mail_mimeDecode
$structure = Mail_mimeDecode::decode($params);
// 添付ファイルがms-tnefか判定
$tnef_body = '';
$csv_file = '';
if($structure->ctype_primary === 'multipart' ){
// マルチパート(添付があるとマルチパート)
for($p=0;$p<count($structure->parts);$p++){
if($structure->parts[$p]->ctype_secondary == 'ms-tnef'){
// found it!
$tnef_body = $structure->parts[$p]->body;
break; 				}
} 		}
if($structure->parts[$p]->ctype_parameters['name'] == '目的のファイル名'){
// 通常の添付
$csv_file = $structure->parts[$p]->body;
break;
}
if($tnef_body != ''){
include_once('attachment_tnef/tnef_attachment.php');
include_once('attachment_tnef/debug_functions.php');
include_once('attachment_tnef/functions.php');
include_once('attachment_tnef/tnef_file_base.php');
include_once('attachment_tnef/tnef_consts.php');
include_once('attachment_tnef/tnef_file.php');
include_once('attachment_tnef/tnef_mailinfo.php');
include_once('attachment_tnef/tnef_file_rtf.php');
include_once('attachment_tnef/tnef_vcard.php');
include_once('attachment_tnef/tnef_date.php');
$tnef_debug = true;
$attachment = new TnefAttachment($tnef_debug);
error_reporting(E_ALL);
$attachment->decodeTnef($tnef_body)
; 			$tnef_files = &$attachment->getFilesNested();
for($t=0;$t<count($tnef_files);$t++){
// hogehoge.txtファイルを探す
if($tnef_files[$t]->name == 'hogehoge.txt'){
$csv_file = $tnef_files[$t]->content;
break;
}
}
}
}
}

コメントする

このブログ記事について

このページは、utが2009年1月 5日 16:51に書いたブログ記事です。

ひとつ前のブログ記事は「ethna アクションの追加」です。

次のブログ記事は「PHPでCSVファイルのダウンロード(SSL+IE)」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 5.04

にほんブログ村

にほんブログ村 IT技術ブログへ
にほんブログ村