検索
ホームページphp教程php手册メールデコードクラス


/**これは、pear のデコード クラスから変更され、さまざまなデコード メソッドが追加され、ソース コードの一連のバグが修正され、デコードされたメールがテキストと添付ファイルに保存されるため、デコード効率が向上します。
* Mime デコード クラス
*
* このクラスは Mime ファイルのデコード時に使用されます
* 使用法:
*
* $message=GetMessage($filename,$read_type,$message); 無断転載を禁じます。著者 Richard,bjcctv
* @date:2004-11-24 最終更新日:2005-06-01
* @package MimeDecode
* @version $Id$
*/

class Decode_Mimemail
{

/**
* Mime ファイル
* @var 文字列
    */
var $_input;

/**
* ヘッダー文字列
* @var 文字列
    */
var $_header;

/**
* 本体文字列
* @var 文字列
    */
var $_body;

/**
* エラー情報
* @var 文字列
    */
var $_error;

/**
* bodyオブジェクトを含むかどうか
* @var boolean
    */
var $_include_bodies;

/**
* bodyオブジェクトを含むかどうか
* @var boolean
    */
var $_decode_bodies;

/**
* ヘッダーオブジェクトをデコードするかどうか
* @var boolean
    */
var $_decode_headers;

/**
* crlf 変数
* @var 文字列
    */
var $_crlf;

/**
* ボディパーツ
* @var オブジェクト
    */
var $parts;
var $mid;
var $maildir;

/**
* コンストラクター。
*
* オブジェクトを設定し、変数を初期化し、入力のヘッダーと本文を分割して
* 保存します。
*
* @param string デコードする入力
* @access public
    */

function Decode_Mimemail($input, $mid, $maildir, $crlf = "n")
{
$this->_crlf = "n";
list($header, $body) = $this->splitBodyHeader($input); //拆分信头和信体两块
$this->_input = $input;
$this->_header = $header;
$this->_body = $body;
$this->mid = $mid;
$this->maildir = $maildir;
$this->_decode_bodies = false;
        $this->_include_bodies = true;
}

/**
* デコードプロセスを開始します。静的に呼び出された場合
* オブジェクトが作成され、その decode() メソッド
* が呼び出されます。
*
* @param array
* さまざまなことを決定するさまざまなパラメータの配列:
* include_bodies - 返されるボディに本文を含めるかどうか
*オブジェクト。
* decode_bodies - パーツのボディ
* をデコードするかどうか。 (転送エンコーディング)
* decode_headers - ヘッダーをデコードするかどうか
* input - 静的に呼び出された場合、これは処理されます
*入力として
* @return object デコードされた結果
* @access public
    */

function decode($params = null)
{
// 静的に呼び出されましたか?
// その場合は、オブジェクトを作成し、それに詳細を渡します。
if (!isset($this) AND isset($params['input']))
{
if (isset($params['crlf']))
{
$obj =新しい Decode_Mimemail($params[' input'],$params['mid'],$params['maildir'],$params['crlf']);
}
else
{
$obj = new Decode_Mimemail($params['input'],$params['mid'],$params['maildir']);
}
$ Structure = $obj->decode($params);

// 静的に呼び出されましたが入力はありません
}
elseif (!isset($this))
{
return $this->_error="静的に呼び出され、入力はありません";

// オブジェクト経由で呼び出される
}
else
{
$this->_include_bodies = isset($params['include_bodies'])
? $params['include_bodies']
: false;
$this->_decode_bodies = isset($params['decode_bodies'])
                                        ? $params['decode_bodies']
: false;
$this->_decode_headers = isset($params['decode_headers'])
? $params['decode_headers']
: false;
if (is_null($this->_header) || is_null($this->_body)
|| is_null($this->mid) || is_null($this->maildir))
{
$構造 = false;
}
else
{
$struct = $this->_decode($this->_header, $this->gt;_body, $this->gt;mid,メールディレクトリ);
}
if($struct === false)
{
$struct = $this->_error;
}
}
$struct を返します。
}

/**
* デコードを実行します。渡された本文文字列をデコードします
* 特定のコンテンツタイプが見つかった場合は、
* 再帰的に自身を呼び出します
*
* @param string ヘッダーセクション
* @param string 本文セクション
* @param string ミッド MIME ファイル名
* @return object デコード処理結果
* @access private
    */

function _decode($headers, $body, $mid, $maildir, $default_ctype = 'text/plain')
{
$return = new stdClass;
if(!is_null($headers))
{
$headers = $this->parseHeaders($headers);
}
else{
$this->_error="MIME ヘッダーが null です。";
return $this->_error;
}

foreach ($headers as $value)
{
if (isset($return->headers[$value['name']]) AND !is_array($return->headers[$value[' name']]))
{
$return->headers[$value['name']] = array($return->headers[$value['name']]);
$return->headers[$value['name']][] = $value['value'];
            }
elseif (isset($return->headers[$value['name']]))
{
elseif (isset($return->headers[$value['name']]))
$return->headers[$value['name']][] = $value['value' ];
}
else
{
$return->headers[$value['name']] = $value['value'];
}
}
reset($headers); 
// 配列の内部ポインタを最初の要素に巻き戻し、最初の配列要素の値を返します。 
while (list($key, $value) = each($headers))
{
$headers[$key]['name'] = strto lower($headers[$key]['name']); 
switch ($headers[$key]['name'])
{
case 'content-type':
$content_type = $this->parseHeaderValue($headers[$キー]['値']); 
if (preg_match('/([0-9a-z+.-]+)/([0-9a-z+.-]+)/i', $content_type['value'], $regs))
{
$return->ctype_primary = $regs[1];
$return->ctype_secondary = $regs[2];
}
if (isset($content_type['other']))
{
while (list( $p_name, $p_value) = each($content_type['other']))
{
$return->ctype_parameters [$p_name] = $p_value;
}
}
休憩。

case 'content-disposition':
$content_disposition = $this->parseHeaderValue($headers[$key]['v​​alue']);
$return->disposition = $content_disposition['value'];
if (isset($content_disposition['other']))
{ 🎜                        while (list($p_name, $p_value) = each($content_disposition['other']))
{
$return->d_parameters[$p_name] = $p_value;
}
}
休憩。
case 'content-transfer-encoding':
if(!is_null($this->parseHeaderValue($headers[$key]['v​​alue'])))
{ $content_transfer_encoding = $this->parseHeaderValue( $headers[$key]['v​​alue']);
}
else{
$content_transfer_encoding = "";
}
休憩。
}
}
if (isset($content_type))
{
{
$content_type['value'] = strto lower($content_type['value']);
switch ($content_type['value'])
{
case 'text':
case 'text/plain':
if($this->_include_bodies)
{
if($this->_decode_bodies)
{
$return->body = isset($content_transfer_encoding['value'])
?$this->decodeBody($body,$content_transfer _encoding['value'])
: $body;
}
else{
$return->body = $body;
                        }

if(!isset($content_type['other']['charset']))
{ $content_type['other']['charset']="gb2312";
}
if($content_type['other']['charset'] != "")
{ $orim_str = "----- 元のメッセージ -----";
$orim_startpos = strpos($return->body,$orim_str);
if(is_int($orim_startpos))
{
$return->body = $return->本文;
}
else{
$return->body = body);
$return->body = str_replace(">gt;",">>",$return->body);
$return->body = str_replace("n","
",$return->body);
$return->body = str_replace(" "," ",$return->body);
}
}
$return->body = $this->ConverUrltoLink($return->body);
$return->body = str_replace("
","
",$return->body);
$return->body = str_replace(" "," ",$return->body);
                    if(strto lower($return->ctype_parameters['charset'])=="utf-8")
{
$return->body=iconv("utf-8", "gb2312", $return-> ;体);
}
休憩。

case 'text/html':
if($this->_include_bodies)
{ if($this->_decode_bodies)
{
$return->body = isset($content_transfer_encoding['value'] )
? $this->decodeBody($body,$content_transfer_encoding['value'])
: $body;
}
else{
$return->body = $body;
}
}
$return->body = $this->ConverUrltoLink($return->body);                
if(strto lower($return->ctype_parameters['charset'])=="utf-8")
{
$return->body=iconv ("utf-8", "gb2312", $return- >本文);
}
休憩。
ケース「マルチパート/混合」:
ケース「マルチパート/代替」:
ケース「マルチパート/ダイジェスト」:
ケース「マルチパート/パラレル」:
case 'multipart/report': // RFC1892
case 'multipart/signed' : // PGP
                ケース「マルチパート/関連」:
ケース「アプリケーション/x-pkcs7-mime」:
if(!isset($content_type['other']['boundary']))
{ $this->_error = ' 「.$content_type['value']」の境界が見つかりません。一部';
false を返します。
}
$default_ctype = (strto lower($content_type['value']) === 'マルチパート/ダイジェスト')
? 'message/rfc822'
: 'text/plain';
$parts = $this->boundarySplit($body, $content_type['other']['boundary']);
if(!isset($return->attlist))
{
$return- >attlist="";
}
for ($i = 0; $i { list($part_header, $part_body) = $this->splitBodyHeader($parts[$i]);
if (is_null($part_header) || is_null($part_body))
{
$part = false;
}
else
{
$part = $this->_decode($part_header, $part_body, $mid, $maildir, $default_ctype);
}
if($part === false)
{
                               $part =$this->_error;   
}
if(!is_null($part->ctype_primary) AND !is_null($part->ctype_secondary))
{
$part_content_type=$part->ctype_primary."/".$part->ctype_secondary ;
}
else{
$part_content_type="";
}

if(isset($part->body))
{
{ if(isset($part->headers['content-transfer-encoding']) AND !is_null($part->headers[ 'content-transfer-encoding']))
{
$part->body = ['コンテンツ転送エンコーディング']) ;
}
else{
$part->body =体;
}
}
/**
* ファイル名/名前を持つ部分が存在する場合は、ディスクに保存します。
                        */
if(!isset($part->body))
{
$part->body = $this->decodeBody($part_body, "base64" );
}
                        
if((($part->ctype_primary."/".$part->ctype_secondary=="message/rfc822") OR ($part->ctype_parameters['name']!="") OR ( $part->headers['content-id']!="") OR (isset($part->d_parameters['filename']) AND isset($part->disposition))) AND isset($ part->body))
{
$att_savename= $mid.".att".$i;    //添付ファイルの保存名。
$user_cache=$this->maildir;
if(!empty($user_cache) AND !empty($att_savename))
{ $att_file=$user_cache."/".$att_savename;
}
else
{ $att_file="";
$return->parts[] = $part;
休憩。
}
$att_filename = $part->ctype_parameters['name'];
if($att_filename=="")
{
$att_filename = >d_parameters['ファイル名']==""
? ? $att_filename = "autofile".$i
: $part->d_parameters['filename'];
// 添付ファイルのタイプが rfc/822 で、ファイル名が null の場合
                                //「.eml」で自動ファイルに名前を変更します
if(($part->ctype_primary."/".$part->ctype_secondary=="message/rfc822") and $att_filename=="autofile".$i )
{
$att_filename = $att_filename.".eml";  
}
}
$this->createAttfiles($att_file) ,$part->body);
, $attfile_size=filesize($att_file);
$return->attlist.=$att_filename."|".$attfile_size."|".$att_savename."|".$part_content_type."n";
$logName=$user_cache."/.attlog";
$LogContent = $att_savename."n";
$this->CreateLog($logName,$LogContent);
$part->body = ""; // 使用済みメモリを解放
}
else
{ if(isset($part->body))
{
$return->body=$part->body;
}
}
$return->parts[] = $part;
}
休憩。
ケース「画像/gif」:
ケース「画像/jpeg」:
                    壊す;
デフォルト:
if($this->_include_bodies)
{
if($this-> ;_decode_bodies)
{
$return->body = isset($content_transfer_encoding['value'])
?$this- >decodeBody($body,$content_transfer_encoding['value'])
:$body;
}
else{
$return->body = $body;
}
}
休憩。
} // スイッチ終了

}
else {
// content-type が存在しない場合の処理​​。
$ctype =explode('/', $default_ctype);
$return->ctype_primary = $ctype[0];
$return->ctype_secondary = $ctype[1];
$this->_include_bodies
? $return->body = ($this->_decode_bodies
? $this->decodeBody($body)
$body)
: null;
if($this->_include_bodies)
{
$orim_str = "----- 元のメッセージ -----";
$orim_startpos = strpos($return->body,$orim_str);
if(is_int($orim_startpos))
{
                        $return->body = $return->body;
}} else {
$ return-> body = str_replace( "n"、 "< br>"、$ return-> body);
$return->body = str_replace(" "," ",$return->body);
}
}
$return->body = $this->ConverUrltoLink($return->body);
$return->body = str_replace("
","
",$return->body);
$return->body = str_replace(" "," ",$return->body);
if(strto lower($return->ctype_parameters['charset'])=="utf-8")
{
$return->body=iconv("utf-8", "gb 2312"、$return- >本文);
}
} //end else
if(0attlist))
{
$return->attlist = substr($return->attlist,0,(strlen($return- >attlist)-1)); 
}
return $return;
}

/**
* ヘッダーと本文
* セクションを含む文字列を指定すると、この関数はそれらを (最初の空白行で) 分割して返します。
*
* @param string 分割する入力
* @return 配列 ヘッダーとボディセクションが含まれます
* @access private
    */

function splitBodyHeader($input)
{
$pos = strpos($input, $this->_crlf.$this->_crlf);
if ($pos === false)
{
$this->_error = 'ヘッダーと本文を分割できませんでした';
false を返します。
}

$header = substr($input, 0, $pos);
$body = substr($input, $pos+(2*strlen($this->_crlf)));
return array($header, $body);
}

/**
* $input で指定されたヘッダーを解析し、関連配列として返します。
*
* @param string 解析するヘッダー
* @return array 解析されたヘッダーが含まれます
* @access private
    */

function parseHeaders($input)
{
if ($input !== '')
{
            // 入力を展開します
$input = preg_replace('/' . $this->_crlf . "(t| )/", ' ', $input);
$headers =explode($this->_crlf, Trim($input));

foreach ($headers as $value)
{
$hdr_name = strto lower(substr($value, 0, $pos = strpos($value, ':')));
$hdr_value = substr($value, $pos+1);
$return[] = array(
'名前' => $hdr_name,
'値' => $this->_decode_headers
$this->decodeHeader($hdr_value)
? &nbs

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。