Outlook(Outlook Expressも?)で添付ファイルをつけてメール送信すると、なんとも不思議なことに勝手にリッチテキスト形式になるようで。
E-Mailの形式としては、リッチテキストは、SMTPのプロトコルとしては扱えませんので、添付ファイル扱いとなります。リッチテキスト部分だけ添付ファイルとなればいいのですが、なんと添付ファイル込みでのリッチテキストとなります。設定によっては、テキスト形式としているのにも関わらず、リッチテキスト化されてしまう現象も確認しております。
また、社内のネットワークで、メール環境をMS Exchangeで構築されている場合、MS Exchangeの設定でメールデータをリッチテキストに変換することそ推奨しているようです。添付ファイルがあった場合。
そうすると、どんなことをしても、添付ファイルは勝手にリッチテキスト内にあることになり、さらにbase64で暗号化されてしまいます。
このとき、リッチテキスト形式をメール内で扱うための形式をTNEF(Transport 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;
}
}
}
}
}

コメントする