[Frameworkspider-svn] spider-commit [85] -- 2010-01-20

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2010年 3月 26日 (金) 17:05:29 JST


Revision: 85
          http://sourceforge.jp/projects/frameworkspider/svn/view?view=rev&revision=85
Author:   m_nakashima
Date:     2010-03-26 17:05:29 +0900 (Fri, 26 Mar 2010)

Log Message:
-----------
-- 2010-01-20
1) GETパラメータによるデバッグコマンドを実装しました
   spiderdebugcmd=viewmoduletime
   モジュール実行時間がダンプされます。
2) binファイルの起点パスを設置上位フォルダからに変更しました。
  define.inc.phpのSPIDER_USE_ABSOLUTE_BIN_PATHをtrueにするとこれまでどおりの動作となります。
3) movaサービスの終了に伴い配布版からDoCoMo1.0分岐の記述を削除しました。
4) php.iniのbase_dirで読み込み階層が制限されていた場合の対策として
  spiderフォルダ検索をspider.inc.php設置の上位ディレクトリまでとしました。
5) spider_HttpRequestのwriteLogメソッドでログURIを記述できるように引数追加しました。
6) RewriteDocumentRootの実装不具合を修正しました。
7) setタグの記述方法でオブジェクトのメンバ指定子を許可するよう変更しました。

Modified Paths:
--------------
    current/README.txt
    current/spider/define.inc.php
    current/spider/lib/spider/BuildInformation.class.php
    current/spider/lib/spider/Builder.class.php
    current/spider/lib/spider/HttpRequest.class.php
    current/spider/lib/spider/module/AutoEncode.class.php
    current/spider/lib/spider/module/AutoFormat.class.php
    current/spider/lib/spider/tags/RewriteDocumentRoot.class.php
    current/spider/lib/spider/tags/SetAttribute.class.php
    current/spider/lib/util/CharUtility.class.php
    current/spider/lib/util/Date.class.php
    current/spider/lib/util/GetHTTPResponse.class.php
    current/spider/lib/util/Mail.class.php
    current/spider/lib/util/mail/SendMail.class.php


-------------- next part --------------
Modified: current/README.txt
===================================================================
--- current/README.txt	2010-01-13 12:35:56 UTC (rev 84)
+++ current/README.txt	2010-03-26 08:05:29 UTC (rev 85)
@@ -3,6 +3,19 @@
 **
 ** このファイルにはコミットごとに変更点とファイル名を記述します。
 **
+-- 2010-01-20
+1) GETパラメータによるデバッグコマンドを実装しました
+   spiderdebugcmd=viewmoduletime
+   モジュール実行時間がダンプされます。
+2) binファイルの起点パスを設置上位フォルダからに変更しました。
+  define.inc.phpのSPIDER_USE_ABSOLUTE_BIN_PATHをtrueにするとこれまでどおりの動作となります。
+3) movaサービスの終了に伴い配布版からDoCoMo1.0分岐の記述を削除しました。
+4) php.iniのbase_dirで読み込み階層が制限されていた場合の対策として
+  spiderフォルダ検索をspider.inc.php設置の上位ディレクトリまでとしました。
+5) spider_HttpRequestのwriteLogメソッドでログURIを記述できるように引数追加しました。
+6) RewriteDocumentRootの実装不具合を修正しました。
+7) setタグの記述方法でオブジェクトのメンバ指定子を許可するよう変更しました。
+
 -- 2009-07-01
 1) PHP5.1.6でDoCoMoのxhtmlヘッダが正しく送信されない問題の修正
    PHP5.1.6だと、ob_get_clean()呼び出し時に勝手にContent-Type: text/html;がセットされ、

Modified: current/spider/define.inc.php
===================================================================
--- current/spider/define.inc.php	2010-01-13 12:35:56 UTC (rev 84)
+++ current/spider/define.inc.php	2010-03-26 08:05:29 UTC (rev 85)
@@ -5,6 +5,8 @@
 // セッション機能 ( true=spiderのセッションID発行機能を使う / false=PHP標準を使う )
 // ※PHPのセッションID発行機能はIDが重複するバグがありますが、spiderの発行機能は環境によっては利用できません。
 define( 'SPIDER_USE_SPIDER_SESSION_ID',	false );
+// 実行ファイル作成のURIを絶対パスから始める場合
+define( 'SPIDER_USE_ABSOLUTE_BIN_PATH',	false );
 
 /*
  * アプリケーション設置位置設定
@@ -32,15 +34,13 @@
 $GLOBALS['SPIDER_USER_AGENT_CLASS_HASH']	= array(
 	'au'			=> 'au',
 	'softbank'		=> 'SoftBank',
-	'docomo2'		=> 'DoCoMo2.0',
-	'docomo'		=> 'DoCoMo1.0',
-	'default'		=> 'Default',
+	'docomo2'		=> 'DoCoMo',
+	'default'		=> 'PC',
 );
 // 分岐タイプにファイルが存在しなかった場合の代替タイプ定義
 $GLOBALS['SPIDER_USER_AGENT_CLASS_ALT_HASH']	= array(
 	'au'			=> 'docomo2',
 	'softbank'		=> 'docomo2',
-	'docomo2'		=> 'docomo',
 );
 // ユーザーエージェント正規表現による分岐タイプ 正規表現=>分類ID
 $GLOBALS['SPIDER_USER_AGENT_CLASS_REGX_HASH']	= array(
@@ -50,16 +50,22 @@
 	'/^Vodafone/'							=> 'softbank',
 	'/^SoftBank/'							=> 'softbank',
 	'/^DoCoMo\\/2/'						=> 'docomo2',
-	'/^DoCoMo\\/1/'						=> 'docomo',
 );
+// 携帯メールアドレスドメイン名の正規表現による分岐タイプ 正規表現=>分類ID
+$GLOBALS['MOBILE_MAIL_DOMAIN_CLASS_REGX_HASH'] = array(
+	'/\\@docomo\\.ne\\.jp$/'			=> 'docomo2'
+	,'/\\@ezweb\\.ne\\.jp$/'				=> 'au'
+	,'/\\@yy.ezweb\\.ne\\.jp$/'			=> 'au'
+	,'/\\@[a-z].vodafone\\.ne\\.jp$/'	=> 'softbank'
+	,'/\\@softbank\\.ne\\.jp$/'			=> 'softbank'
+	,'/\\@disney\\.ne\\.jp$/'			=> 'softbank'
+	,'/\\@i\\.softbank\\.jp$/'			=> 'softbank'
+);
 // ユーザーエージェントごとに出力文字セットを指定する場合
 $GLOBALS['SPIDER_USER_AGENT_CLASS_OUTPUT_CHARSET']	= array(
-	'docomo'	=> 'SJIS-win',
 	'docomo2'	=> 'SJIS-win',
 	'au'		=> 'SJIS-win',
 	'softbank'	=> 'SJIS-win',
-	'mobile'	=> 'UTF-8',
-	'iphone3'	=> 'UTF-8',
 	'default'	=> 'UTF-8',
 );
 /*
@@ -74,6 +80,8 @@
 define ( 'DIR_NAME_LIB',				'lib' );
 // テンプレート配置ディレクトリ名
 define ( 'DIR_NAME_TEMPLATES',		'templates' );
+// Pウィジェットディレクトリ名
+define ( 'DIR_NAME_PWIDGETS',		'pwidgets' );
 // ウィジェットディレクトリ名
 define ( 'DIR_NAME_WIDGETS',			'widgets' );
 // データ保存ディレクトリ名
@@ -99,6 +107,8 @@
 define( 'DIR_PATH_LIB', DIR_PATH_SPIDER_DATA.DIRECTORY_SEPARATOR.DIR_NAME_LIB );
 // テンプレートディレクトリパス
 define( 'DIR_PATH_TEMPLATES', DIR_PATH_SPIDER_DATA.DIRECTORY_SEPARATOR.DIR_NAME_TEMPLATES );
+// Pウィジェットディレクトリパス
+define( 'DIR_PATH_PWIDGETS',DIR_PATH_SPIDER_DATA.DIRECTORY_SEPARATOR.DIR_NAME_PWIDGETS);
 // ウィジェットディレクトリパス
 define( 'DIR_PATH_WIDGETS',DIR_PATH_SPIDER_DATA.DIRECTORY_SEPARATOR.DIR_NAME_WIDGETS);
 // データ保存ディレクトリ
@@ -141,4 +151,4 @@
 // システムメール定義ファイルパス
 define ( 'FILE_PATH_SYSTEM_DEFINITION',	DIR_PATH_DATA.DIRECTORY_SEPARATOR.FILE_NAME_SYSTEM_DEFINITION );
 
-?>
+?>
\ No newline at end of file

Modified: current/spider/lib/spider/BuildInformation.class.php
===================================================================
--- current/spider/lib/spider/BuildInformation.class.php	2010-01-13 12:35:56 UTC (rev 84)
+++ current/spider/lib/spider/BuildInformation.class.php	2010-03-26 08:05:29 UTC (rev 85)
@@ -1,4 +1,5 @@
 <?php
+require_once(dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR.'util'.DIRECTORY_SEPARATOR.'CharUtility.class.php');
 /**
  * ビルドファイルを作成する情報を保持するデータオブジェクトクラス
  * 
@@ -102,10 +103,22 @@
 		} else {
 			$virtual_root	= substr($virtual_root,1);
 		}
+		// 2009-12-16 実行ファイル作成パスをspiderの上層ディレクトリ起点とする
+		if( !defined('SPIDER_USE_ABSOLUTE_BIN_PATH') || SPIDER_USE_ABSOLUTE_BIN_PATH === false ) {
+			$cutPath	= dirname(DIR_PATH_SPIDER_DATA);
+			if( preg_match('/^[a-zA-Z]\\:\\\/', APPLICATION_BASE_PATH, $regmatch_array ) > 0 ) {
+				// Windows対策ドライブをディレクトリとして変換
+				$driveName		= substr($regmatch_array[0],0,1);
+				$cutPath	= preg_replace('/^[a-zA-Z]\\:\\\/'
+					,$driveName.DIRECTORY_SEPARATOR, $cutPath );
+			}
+			$virtual_root	= preg_replace('/^'.util_CharUtility::escapeRegxStr($cutPath).'/','',$virtual_root);
+		}
 		$bin_file_path	= DIR_PATH_BIN
 			.DIRECTORY_SEPARATOR.$virtual_root
 			.DIRECTORY_SEPARATOR.str_replace('/','',str_replace(DIRECTORY_SEPARATOR,'',APPLICATION_BASE_URI))
 			.DIRECTORY_SEPARATOR.$this->getAgentPageUri();
+		$bin_file_path	= str_replace(DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR,DIRECTORY_SEPARATOR,$bin_file_path);
 		if( !is_dir( dirname($bin_file_path) ) ) {
 			// 上位ディレクトリがないならディレクトリ階層を作成する
 			$dirname_array	= explode(DIRECTORY_SEPARATOR, dirname($bin_file_path) );
@@ -148,18 +161,23 @@
 			// Unix系ならパスはディレクトリセパレータから開始
 			$dir_path		= DIRECTORY_SEPARATOR;
 		}
+		// php.iniのbase_dirで読み込み階層が制限されていた場合の対策
+		$spiderBaseDir	= dirname(DIR_PATH_SPIDER_DATA);
 		foreach( $dir_name_array as $dirname ) {
 			if( strlen($dirname) > 0 ) {
 				$dir_path	.= $dirname.DIRECTORY_SEPARATOR;
-				$pre_module_file	= $dir_path."pre_module.inc.php";
-				if ( file_exists( $pre_module_file ) ) {
-					$lines			= file( $pre_module_file );
-					foreach ( $lines as $line ) {
-						$line		= trim( $line );
-						$this->addExecModuleByString( $line );
+				// php.iniのbase_dirで読み込み階層が制限されていた場合の対策
+				if( strlen($dir_path) >= strlen($spiderBaseDir) ) {
+					$pre_module_file	= $dir_path."pre_module.inc.php";
+					if ( file_exists( $pre_module_file ) ) {
+						$lines			= file( $pre_module_file );
+						foreach ( $lines as $line ) {
+							$line		= trim( $line );
+							$this->addExecModuleByString( $line );
+						}
+						// ホットビルドタイムスタンプ比較ファイルに追加
+						array_push( $this->compare_time_file_array, $pre_module_file );
 					}
-					// ホットビルドタイムスタンプ比較ファイルに追加
-					array_push( $this->compare_time_file_array, $pre_module_file );
 				}
 			}
 		}

Modified: current/spider/lib/spider/Builder.class.php
===================================================================
--- current/spider/lib/spider/Builder.class.php	2010-01-13 12:35:56 UTC (rev 84)
+++ current/spider/lib/spider/Builder.class.php	2010-03-26 08:05:29 UTC (rev 85)
@@ -212,6 +212,12 @@
 			}
 			$string	.= '$controller->loadModule( "' . $module_name . '", '.$force.',"'.$attribute_prefix
 				.'","'.$get_contents.'", "'.$post_contents.'" );'."\n";
+			$string	.= 'if($_GET[\'spiderdebugcmd\'] == \'viewmoduletime\' '
+				.'&& is_array($GLOBALS[\'SPIDER_DEBUG_COMMAND_PERMIT_ADDRESSES\']) '
+				.'&& in_array($_SERVER[\'REMOTE_ADDR\'],$GLOBALS[\'SPIDER_DEBUG_COMMAND_PERMIT_ADDRESSES\']) '
+				.') { '
+				.'$request_object->debugExecTime(\''.$module_name.'\'); '
+				.'}'."\n";
 		}
 		
 		// モジュール実行結果による分岐処理を記述

Modified: current/spider/lib/spider/HttpRequest.class.php
===================================================================
--- current/spider/lib/spider/HttpRequest.class.php	2010-01-13 12:35:56 UTC (rev 84)
+++ current/spider/lib/spider/HttpRequest.class.php	2010-03-26 08:05:29 UTC (rev 85)
@@ -32,12 +32,18 @@
 	var $attribute_prefix	= null;
 	/** Access User Agent Class	*/
 	var $agentClass			= null;
+
+	var $startTime;
+	var $lastTime;
+
 	/**
 	 * コンストラクタ
 	 */
 	function spider_HttpRequest() {
 		$this->attribute_array	= array();
 		$this->errors			= array();
+		$this->startTime		= time();
+		$this->lastTime			= time();
 	}
 	/**
 	 * 属性を設定します。
@@ -276,7 +282,7 @@
 	 * ログを出力します
 	 * @param $message ログメッセージ
 	 */
-	function writeLog( $message, $log_level=SPIDER_LOG_LEVEL_INFO ) {
+	function writeLog( $message, $log_level=SPIDER_LOG_LEVEL_INFO, $logFileUri=null ) {
 		$system_log_level	= SPIDER_LOG_LEVEL_INFO;
 		if( defined('SYSTEM_LOG_LEVEL') && is_numeric(SYSTEM_LOG_LEVEL)
 			&& preg_match('/^[0-4]$/',SYSTEM_LOG_LEVEL) > 0 ) {
@@ -340,32 +346,59 @@
 			closelog();
 		} else {
 			// ファイルに出力する
+			$logFilePath	= null;
 			// ログファイル名の決定
-			$log_file_path	= DIR_PATH_LOG.DIRECTORY_SEPARATOR.'spider';
-			if( !file_exists( $log_file_path ) ) {
-				if( @mkdir( $log_file_path, SPIDER_FOLDER_CREATE_PERMITTION ) ) {
-					@chmod( $log_file_path, SPIDER_FOLDER_CREATE_PERMITTION );
+			if( is_null($logFileUri) || strlen($logFileUri) == 0 ) {
+				// ファイルURIが指定されていない場合は自動生成
+				$logFilePath	= DIR_PATH_LOG.DIRECTORY_SEPARATOR.'spider';
+				if( !file_exists( $logFilePath ) ) {
+					if( @mkdir( $logFilePath, SPIDER_FOLDER_CREATE_PERMITTION ) ) {
+						@chmod( $logFilePath, SPIDER_FOLDER_CREATE_PERMITTION );
+					}
 				}
-			}
-			$log_file_path	= $log_file_path.DIRECTORY_SEPARATOR.date('Y');
-			if( !file_exists( $log_file_path ) ) {
-				if( @mkdir( $log_file_path, SPIDER_FOLDER_CREATE_PERMITTION ) ) {
-					@chmod( $log_file_path, SPIDER_FOLDER_CREATE_PERMITTION );
+				$logFilePath	= $logFilePath.DIRECTORY_SEPARATOR.date('Y');
+				if( !file_exists( $logFilePath ) ) {
+					if( @mkdir( $logFilePath, SPIDER_FOLDER_CREATE_PERMITTION ) ) {
+						@chmod( $logFilePath, SPIDER_FOLDER_CREATE_PERMITTION );
+					}
 				}
-			}
-			$log_file_path	= $log_file_path.DIRECTORY_SEPARATOR.date('m');
-			if( !file_exists( $log_file_path ) ) {
-				if( @mkdir( $log_file_path, SPIDER_FOLDER_CREATE_PERMITTION ) ) {
-					@chmod( $log_file_path, SPIDER_FOLDER_CREATE_PERMITTION );
+				$logFilePath	= $logFilePath.DIRECTORY_SEPARATOR.date('m');
+				if( !file_exists( $logFilePath ) ) {
+					if( @mkdir( $logFilePath, SPIDER_FOLDER_CREATE_PERMITTION ) ) {
+						@chmod( $logFilePath, SPIDER_FOLDER_CREATE_PERMITTION );
+					}
 				}
-			}
-			$log_file_path	= $log_file_path.DIRECTORY_SEPARATOR.'system_'.date('d').'.log';
-			if( !file_exists( $log_file_path ) ) {
-				if(@touch( $log_file_path, SPIDER_FILE_CREATE_PERMITTION )){
-					@chmod( $log_file_path, SPIDER_FILE_CREATE_PERMITTION );
+				$logFilePath	= $logFilePath.DIRECTORY_SEPARATOR.'system_'.date('d').'.log';
+				if( !file_exists( $logFilePath ) ) {
+					if(@touch( $logFilePath, SPIDER_FILE_CREATE_PERMITTION )){
+						@chmod( $logFilePath, SPIDER_FILE_CREATE_PERMITTION );
+					}
 				}
+			} else {
+				// ログファイルURIが指定されている場合は指定ログファイルへ出力
+				$logFilePath	= DIR_PATH_LOG;
+				$logFileUri	= str_replace(DIRECTORY_SEPARATOR,'/',$logFileUri);
+				$dirNames	= explode('/',$logFileUri);
+				$fileName	= array_pop($dirNames);
+				foreach( $dirNames as $dirName ) {
+					if( strlen(trim($dirName)) > 0 ) {
+						$logFilePath	.= DIRECTORY_SEPARATOR.$dirName;
+						if( !file_exists( $logFilePath ) ) {
+							if( @mkdir( $logFilePath, SPIDER_FOLDER_CREATE_PERMITTION ) ) {
+								@chmod( $logFilePath, SPIDER_FOLDER_CREATE_PERMITTION );
+							}
+						}
+					}
+				}
+				$logFilePath	.= DIRECTORY_SEPARATOR.$fileName;
+				if( !file_exists( $logFilePath ) ) {
+					if(@touch( $logFilePath, SPIDER_FILE_CREATE_PERMITTION )){
+						@chmod( $logFilePath, SPIDER_FILE_CREATE_PERMITTION );
+					}
+				}
 			}
-			error_log($log_message."\n" , 3, $log_file_path );
+			// ログを出力
+			error_log($log_message."\n" , 3, $logFilePath );
 		}
 		return true;
 	}
@@ -373,43 +406,43 @@
 	 * Fatalレベルのログを出力します。
 	 * @param $message ログメッセージ
 	 */
-	function fatal($message){
-		$this->writeLog( $message, SPIDER_LOG_LEVEL_FATAL );
+	function fatal($message, $logFileUri=null){
+		$this->writeLog( $message, SPIDER_LOG_LEVEL_FATAL, $logFileUri );
 	}
 	/**
 	 * Errorレベルのログを出力します。
 	 * @param $message ログメッセージ
 	 */
-	function error($message){
-		$this->writeLog( $message, SPIDER_LOG_LEVEL_ERROR );
+	function error($message, $logFileUri=null){
+		$this->writeLog( $message, SPIDER_LOG_LEVEL_ERROR, $logFileUri );
 	}
 	/**
 	 * Warningレベルのログを出力します。
 	 * @param $message ログメッセージ
 	 */
-	function warn($message){
-		$this->writeLog( $message, SPIDER_LOG_LEVEL_WARNING );
+	function warn($message, $logFileUri=null){
+		$this->writeLog( $message, SPIDER_LOG_LEVEL_WARNING, $logFileUri );
 	}
 	/**
 	 * Noticeレベルのログを出力します。
 	 * @param $message ログメッセージ
 	 */
-	function notice($message){
-		$this->writeLog( $message, SPIDER_LOG_LEVEL_NOTICE );
+	function notice($message, $logFileUri=null){
+		$this->writeLog( $message, SPIDER_LOG_LEVEL_NOTICE, $logFileUri );
 	}
 	/**
 	 * Infoレベルのログを出力します。
 	 * @param $message ログメッセージ
 	 */
-	function info($message){
-		$this->writeLog( $message, SPIDER_LOG_LEVEL_INFO );
+	function info($message, $logFileUri=null){
+		$this->writeLog( $message, SPIDER_LOG_LEVEL_INFO, $logFileUri );
 	}
 	/**
 	 * Debugレベルのログを出力します。
 	 * @param $message ログメッセージ
 	 */
-	function debug($message){
-		$this->writeLog( $message, SPIDER_LOG_LEVEL_DEBUG );
+	function debug($message, $logFileUri=null){
+		$this->writeLog( $message, SPIDER_LOG_LEVEL_DEBUG, $logFileUri );
 	}
 	/**
 	 * システム設定された値でメール送信オブジェクトを作成して取得します。
@@ -519,6 +552,14 @@
 			return false;
 		}
 	}
+	/**
+	 * for debug echo time
+	 */
+	function debugExecTime($caption='') {
+		$time	= time() - $this->lastTime;
+		echo $caption.'='.$time."<br />\n";
+		$this->lastTime	= time();
+	}
 }
 /**
  * spider_HttpRequestクラスオブジェクトを経由したセッション保存用の

Modified: current/spider/lib/spider/module/AutoEncode.class.php
===================================================================
--- current/spider/lib/spider/module/AutoEncode.class.php	2010-01-13 12:35:56 UTC (rev 84)
+++ current/spider/lib/spider/module/AutoEncode.class.php	2010-03-26 08:05:29 UTC (rev 85)
@@ -27,6 +27,8 @@
 			// GETパラメータ
 			$this->encodeHash( $_GET,'UTF-8', $inputCharset );
 		}
+		$request->setAttribute( 'postparams', $_POST );
+		$request->setAttribute( 'getparams', $_GET );
 	}
 	/**
 	 * 多次元配列を指定文字セットにエンコードします

Modified: current/spider/lib/spider/module/AutoFormat.class.php
===================================================================
--- current/spider/lib/spider/module/AutoFormat.class.php	2010-01-13 12:35:56 UTC (rev 84)
+++ current/spider/lib/spider/module/AutoFormat.class.php	2010-03-26 08:05:29 UTC (rev 85)
@@ -23,6 +23,8 @@
 		$this->convertKana( $_POST,'KVas','UTF-8' );
 		// GETパラメータ
 		$this->convertKana( $_GET,'KVas','UTF-8' );
+		$request->setAttribute( 'postparams', $_POST );
+		$request->setAttribute( 'getparams', $_GET );
 	}
 	/**
 	 * 多次元配列の値をフォーマットにエンコードします

Modified: current/spider/lib/spider/tags/RewriteDocumentRoot.class.php
===================================================================
--- current/spider/lib/spider/tags/RewriteDocumentRoot.class.php	2010-01-13 12:35:56 UTC (rev 84)
+++ current/spider/lib/spider/tags/RewriteDocumentRoot.class.php	2010-03-26 08:05:29 UTC (rev 85)
@@ -44,7 +44,7 @@
 				$replace_uri	= preg_replace('/\\/$/','',$replace_uri);
 			}
 			// src書き換え
-			$process_code = 'if( preg_match_all( \'/[sS][rR][cC]\\\\=([\\\'"])(\\/[^\\\'"]+)([\\\'"])/\'';
+			$process_code = 'if( preg_match_all( \'/[sS][rR][cC]\\\\=([\\\'"])(\\/([^\\\'"\\/][^\\\'"]*|))([\\\'"])/\'';
 			$process_code .= ', $outstr';
 			$process_code .= ', $output_array';
 			$process_code .= ', PREG_PATTERN_ORDER ) > 0 ) { ';
@@ -57,7 +57,7 @@
 			$process_code .= '}}}';
 			
 			// href書き換え
-			$process_code .= 'if( preg_match_all( \'/[hH][rR][eE][fF]\\\\=([\\\'"])(\\/[^\\\'"]*)([\\\'"])/\'';
+			$process_code .= 'if( preg_match_all( \'/[hH][rR][eE][fF]\\\\=([\\\'"])(\\/([^\\\'"\\/][^\\\'"]*|))([\\\'"])/\'';
 			$process_code .= ', $outstr';
 			$process_code .= ', $output_array';
 			$process_code .= ', PREG_PATTERN_ORDER ) > 0 ) { ';
@@ -70,7 +70,7 @@
 			$process_code .= '}}}';
 			
 			// action書き換え
-			$process_code .= 'if( preg_match_all( \'/[aA][cC][tT][iI][oO][nN]\\\\=([\\\'"])(\\/[^\\\'"]*)([\\\'"])/\'';
+			$process_code .= 'if( preg_match_all( \'/[aA][cC][tT][iI][oO][nN]\\\\=([\\\'"])(\\/([^\\\'"\\/]|)[^\\\'"]*)([\\\'"])/\'';
 			$process_code .= ', $outstr';
 			$process_code .= ', $output_array';
 			$process_code .= ', PREG_PATTERN_ORDER ) > 0 ) { ';

Modified: current/spider/lib/spider/tags/SetAttribute.class.php
===================================================================
--- current/spider/lib/spider/tags/SetAttribute.class.php	2010-01-13 12:35:56 UTC (rev 84)
+++ current/spider/lib/spider/tags/SetAttribute.class.php	2010-03-26 08:05:29 UTC (rev 85)
@@ -25,6 +25,214 @@
 	 * コンバートメソッド
 	 */
 	function convert( &$result_strings, &$build_information ){
+		// set の変換
+		$tagStringsHash			= array();
+		preg_match_all( '/\\{set\\:[^\\}]*?}/'
+			, $result_strings
+			, $tagStringsHash
+			, PREG_PATTERN_ORDER );
+		$valiable_counter	= 0;
+		foreach ( $tagStringsHash as $tagStringsArray ) {
+			foreach ( $tagStringsArray as $tagStrings ) {
+				$optionStrings	= preg_replace( '/\\{set\\:/','', $tagStrings );
+				$optionStrings	= preg_replace( '/\\}$/','', $optionStrings );
+				$optionStrings	= trim( $optionStrings );
+				if( strlen($optionStrings) > 0 ) {
+					// オプションがあるなら分解
+					$optionArray	= $this->splitOptionBySpace( $optionStrings );
+					if( count($optionArray) < 2 ) {
+						// オプション数が足りない場合
+						$result_strings = str_replace( $tagStrings, '[set tag requre 2 parameters! '.$tagStrings.']', $result_strings );
+					} else if( count($optionArray) == 2 ) {
+						// オプション数が2つの場合
+						// 新規登録属性名
+						$attributeName	= trim(array_shift($optionArray));
+						// 属性値
+						$attibuteValue	= trim(array_shift($optionArray));
+						if( preg_match('/\\:\\:/',$attibuteValue) > 0 ) {
+							// コロン連続を含むなら下位互換
+							$repCode	= $this->cnvOldCode( $attributeName, $attibuteValue );
+							$result_strings	= str_replace( $tagStrings, $repCode, $result_strings );
+						} else if( preg_match('/\\-\\>[a-zA-Z_][0-9a-zA-Z_]*$/',$attibuteValue) > 0 ) {
+							// ''で囲まれないメンバ変数が記述されていたら下位互換
+							$repCode	= $this->cnvOldCode( $attributeName, $attibuteValue );
+							$result_strings	= str_replace( $tagStrings, $repCode, $result_strings );
+						} else {
+							// 含まないならPHPコード化
+							$attributeNameArray	= array();
+							$attributeValue	= $this->tagCode2NativeCode( $attibuteValue, $attributeNameArray );
+							// 下位互換の為setAttributeも行う
+							$repCode	= '<?php '
+								.' $GLOBALS[\''.$attributeName.'\'] = '.$attributeValue.'; '
+								.'$request->setAttribute(\''.$attributeName.'\',$GLOBALS[\''.$attributeName.'\']); ?>';
+							$result_strings	= str_replace( $tagStrings, $repCode, $result_strings );
+						}
+					} else {
+						// オプション数が3つ以上複数ある場合
+						// 新規登録属性名
+						$attributeName	= array_shift($optionArray);
+						// 属性値はPHPコード化する
+						$attributeValue	= '';
+						foreach( $optionArray as $option ) {
+							$attributeNameArray	= array();
+							$attributeValue	.= ' '.$this->tagCode2NativeCode( $option, $attributeNameArray );
+						}
+						// 下位互換の為setAttributeも行う
+						$repCode	= '<?php '
+							.' $GLOBALS[\''.$attributeName.'\'] = '.$attributeValue.'; '
+							.'$request->setAttribute(\''.$attributeName.'\',$GLOBALS[\''.$attributeName.'\']); ?>';
+						$result_strings	= str_replace( $tagStrings, $repCode, $result_strings );
+					}
+				} else {
+					// オプションパラメーターがないならエラー表示に切り替え
+					$result_strings = str_replace( $tagStrings, '[set tag requre 2 parameters! '.$tagStrings.']', $result_strings );
+				}
+				$valiable_counter++;
+			}
+		}
+		// presetタグの機能追加
+		if( preg_match_all( '/\\{preset\\:[^\\}]*?\\}/'
+			, $result_strings
+			, $output_array
+			, PREG_PATTERN_ORDER ) > 0 ) {
+			foreach ( $output_array as $output ) {
+				foreach ( $output as $target ) {
+					$option_strings	= preg_replace( '/\\{preset\\:/','', $target );
+					$option_strings	= preg_replace( '/\\}/','', $option_strings );
+					$option_strings	= trim($option_strings);
+					if( strpos($option_strings,' ') !== false ) {
+						// 空白が存在するなら分割して復元
+						$option_array	= $this->splitOptionBySpace( $option_strings );
+						if( count($option_array) >= 2 ) {
+							// パラメータが2つ以上ならモジュール実行前コードを追加
+							$this->createPresetCode( $build_information, $option_array );
+							// タグ行の削除
+							$result_strings = str_replace( "\n".$target."\n", "", $result_strings );
+							$result_strings = str_replace( $target, "", $result_strings );
+						} else {
+							// 空白が存在しないなら使い方が違うのでエラーメッセージを表示する
+							$result_strings = str_replace( $target, "[preset tag requre 2 parameters! ".$target."]", $result_strings );
+						}
+					} else {
+						// 空白が存在しないなら使い方が違うのでエラーメッセージを表示する
+						$result_strings = str_replace( $target, "[preset tag requre 2 parameters! ".$target."]", $result_strings );
+					}
+				}
+			}
+		}
+	}
+	/**
+	 * 旧setタグの変換ロジックで変換した個別変換文字列を取得します。
+	 */
+	function cnvOldCode( $var_name, $var_value ) {
+		$var_name	= trim( $var_name );
+		if( ( preg_match('/^"/',$var_name) > 0 && preg_match('/"$/',$var_name) > 0 )
+			|| ( preg_match('/^\'/',$var_name) > 0 && preg_match('/\'$/',$var_name) > 0 )
+		) {
+			$var_name	= substr($var_name,1,strlen($var_name)-2);
+		}
+		$rep_string = "<?php ";
+		if( preg_match('/^\\".+?\\"$/',$var_value) || preg_match('/^\\\'.+?\\\'$/',$var_value) ) {
+			// 値がクォーテーションで囲まれている場合は中の値をそのまま登録する
+			$rep_string .= '$tmp='.$var_value.'; ';
+			$rep_string .= '$request_object->setAttribute( "' . $var_name . '",$tmp ); ';
+			$rep_string .= '$GLOBALS["' . $var_name . '"] =$tmp; ';
+		} else {
+			// 値がクォーテーションで囲まれていない場合は、スコープから変数を探して登録
+			if( preg_match('/\\:\\:/',$var_value) > 0 ) {
+				// コロン二つがつく場合はオブジェクトかハッシュの属性自動判別
+				list( $obj_name, $at_name )		= explode('::',$var_value);
+				$rep_string .= '$tmp=$request_object->getAttribute( "' . $obj_name . '" ); ';
+				$rep_string	.= '$type=gettype($tmp); ';
+				if ( strlen(trim($at_name)) > 0 ) {
+					$rep_string	.= 'if(\'array\'==$type) { ';
+					$rep_string	.= '$tmp=$tmp[\''.$at_name.'\'];';
+					$rep_string	.= ' } ';
+					$rep_string	.= 'if(\'object\'==$type) { $tmp=$tmp->'.$at_name.'; } ';
+				}
+			} else if( preg_match('/\\->/',$var_value) > 0 ) {
+				// オブジェクト指定子の場合はオブジェクトのメソッドまたはメンバ値である
+				list( $obj_name, $member_strings )	= explode('->',$var_value);
+				$rep_string .= '$tmp=$request_object->getAttribute( "' . $obj_name . '" ); ';
+				$rep_string	.= '$type=gettype($tmp); ';
+				$member_strings	= trim($member_strings);
+				if( strlen($member_strings) > 0 ) {
+					if( preg_match('/\\(/',$member_strings) > 0 && preg_match('/\\)$/',$member_strings) > 0 ) {
+						// 開始括弧があり、閉じ括弧で終了しているならメソッドの引数部分を確認
+						list( $method_name, $method_param_strings )	= explode('(',$member_strings );
+						list( $method_param_strings )				= explode(')',$method_param_strings );
+						$method_param_strings						= trim( $method_param_strings );
+						$method_param_tmp_array						= explode(',',$method_param_strings);
+						$method_param_array							= array();
+						foreach( $method_param_tmp_array as $param ) {
+							$param	= trim( $param );
+							if( strlen( $param ) > 0 ) {
+								if( ( preg_match('/^"/',$param) > 0 && preg_match('/"$/',$param) > 0 )
+									|| ( preg_match('/^\'/',$param) > 0 && preg_match('/\'$/',$param) > 0 )
+								) {
+									// シングルクォートかダブルクォートで囲まれているなら固定文字列
+									array_push( $method_param_array, $param );
+								} else if( is_numeric($param) ){
+									// 数値ならそのまま登録
+									array_push( $method_param_array, $param );
+								} else {
+									// 文字列でないなら属性から取得
+									$strmp	= '$request_object->getAttribute( "' . $param . '" ); ';
+									array_push( $method_param_array, $strmp );
+								}
+							}
+						}
+						$rep_string	.= 'if(\'object\'==$type) { $tmp=$tmp->'.$method_name.'('.implode(',',$method_param_array).'); } ';
+					} else {
+						// 開始括弧も閉じ括弧もないならメンバ変数として処理
+						$rep_string	.= 'if(\'object\'==$type) { $tmp=$tmp->'.$member_strings.'; } ';
+					}
+				}
+			} else if( preg_match('/\\[/',$var_value) > 0 && preg_match('/\\[/',$var_value) > 0 ) {
+				// 開始大括弧と閉じ大括弧があるなら配列・ハッシュと判断する
+				list( $hash_name, $hash_key_strings )	= explode('[',$var_value );
+				$rep_string .= '$tmp=$request_object->getAttribute( "' . $hash_name . '" ); ';
+				$rep_string	.= '$type=gettype($tmp); ';
+				list( $hash_key_strings )				= explode(']',$hash_key_strings );
+				$hash_key_strings						= trim( $hash_key_strings );
+				if( ( preg_match('/^"/',$hash_key_strings) > 0 && preg_match('/"$/',$hash_key_strings) > 0 )
+					|| ( preg_match('/^\'/',$hash_key_strings) > 0 && preg_match('/\'$/',$hash_key_strings) > 0 )
+				) {
+					// キー文字列がクォートされているなら文字列としてそのまま利用
+					$rep_string	.= 'if(\'array\'==$type) { $tmp=$tmp['.$hash_key_strings.']; } ';
+				} else if( is_numeric($hash_key_strings) ) {
+					// キー文字列が数値ならそのまま利用
+					$rep_string	.= 'if(\'array\'==$type) { $tmp=$tmp['.$hash_key_strings.']; } ';
+				} else {
+					// キー文字列が数字でなくクォートされていないなら属性から取得
+					if( preg_match('/\\:\\:/',$hash_key_strings) > 0 ) {
+						// コロン二つがつく場合はオブジェクトかハッシュの属性自動判別
+						list( $key_object_name, $key_at_name )		= explode('::',$hash_key_strings);
+						$rep_string .= '$tmp_key=$request_object->getAttribute( "' . $key_object_name . '" ); ';
+						$rep_string	.= '$type_key=gettype($tmp_key); ';
+						if ( strlen(trim($key_at_name)) > 0 ) {
+							$rep_string	.= 'if(\'array\'==$type_key) { $tmp_key=$tmp_key[\''.$key_at_name.'\']; } ';
+							$rep_string	.= 'if(\'object\'==$type_key) { $tmp_key=$tmp_key->'.$key_at_name.'; } ';
+							$rep_string	.= 'if(\'array\'==$type) { $tmp=$tmp[$tmp_key]; } ';
+						}
+					} else {
+						// とりあえず配列キーではメソッド呼び出しはできない仕様。その他の場合はそのままgetAttribute
+						$hash_key_strings	= '$request_object->getAttribute("'.$hash_key_strings.'")';
+						$rep_string	.= 'if(\'array\'==$type) { $tmp=$tmp['.$hash_key_strings.']; } ';
+					}
+				}
+			} else {
+				// 単体文字列なら属性から取得
+				$rep_string .= '$tmp = $request_object->getAttribute( "' . $var_value . '" ); ';
+			}
+			$rep_string .= '$request_object->setAttribute( "' . $var_name . '", $tmp ); ';
+			$rep_string .= '$GLOBALS["' . $var_name . '"] =$tmp; ';
+		}
+		$rep_string .= " ?>";
+		return $rep_string;
+	}
+/*
+	function convert( &$result_strings, &$build_information ){
 		$vars_tags_aray			= array();
 		preg_match_all( '/\\{set\\:[^\\}]*?}/'
 			, $result_strings
@@ -183,6 +391,7 @@
 			}
 		}
 	}
+*/
 	/**
 	 * presetタグのパラメータを受け取って実行前コードを作成します
 	 */

Modified: current/spider/lib/util/CharUtility.class.php
===================================================================
--- current/spider/lib/util/CharUtility.class.php	2010-01-13 12:35:56 UTC (rev 84)
+++ current/spider/lib/util/CharUtility.class.php	2010-03-26 08:05:29 UTC (rev 85)
@@ -180,7 +180,27 @@
 		if( strlen($elm) > 0 ) {
 			array_push( $elmArray, $elm );
 		}
-		return $elmArray;
+		// 数字部分はint範囲内に収める為最後に文字の長さをチェック
+		$returnArray	= array();
+		foreach( $elmArray as $elm ) {
+			if( preg_match('/^[0-9]+$/',$elm) > 0 ) {
+				// 数字の場合文字数を確認
+				if( strlen($elm) > 8 ) {
+					// 8文字以上ならあふれる恐れが高いので8文字ずつに分割
+					for( $i=0; $i<strlen($elm);$i=$i+8 ) {
+						$numStr	= trim(substr($elm,$i,8));
+						array_push($returnArray,$numStr);
+					}
+				} else {
+					// 8文字以内ならそのまま利用
+					array_push($returnArray,$elm);
+				}
+			} else {
+				array_push($returnArray,$elm);
+			}
+		}
+//		return $elmArray;
+		return $returnArray;
 	}
 	/**
 	 * CSVデータラインを配列にして返します

Modified: current/spider/lib/util/Date.class.php
===================================================================
--- current/spider/lib/util/Date.class.php	2010-01-13 12:35:56 UTC (rev 84)
+++ current/spider/lib/util/Date.class.php	2010-03-26 08:05:29 UTC (rev 85)
@@ -23,6 +23,8 @@
 				return 28;
 			} else if ( ( $year % 4 ) == 0 ) {
 				return 29;
+			} else {
+				return 28;
 			}
 		}
 	}
@@ -53,5 +55,16 @@
 			return false;
 		}
 	}
+	/**
+	 * 指定年月の1日から末日とその曜日の配列の生成
+	 */
+	function getDayArray ( $year, $month ) {
+		$maxDays	= util_Date::getMonthMaxDay( $year, $month );
+		for ( $i=1; $i<=$maxDays; $i++ ) {
+			$week_day = jddayofweek( cal_to_jd( CAL_GREGORIAN, $month, $i, $year ), 0 );
+			$day_array[$i]	= $week_day;
+		}
+		return $day_array;
+	}
 }
 ?>
\ No newline at end of file

Modified: current/spider/lib/util/GetHTTPResponse.class.php
===================================================================
--- current/spider/lib/util/GetHTTPResponse.class.php	2010-01-13 12:35:56 UTC (rev 84)
+++ current/spider/lib/util/GetHTTPResponse.class.php	2010-03-26 08:05:29 UTC (rev 85)
@@ -39,7 +39,7 @@
 			}
 		}
 		$request	.= "Connection: close\r\n\r\n";
-		if( $fp = @fsockopen( $host, 80, $rv->en, $rv->es, 20 ) ){
+		if( $fp = @fsockopen( gethostbyname($host), 80, $rv->en, $rv->es, 20 ) ){
 			if( socket_set_timeout( $fp, 30 ) ) {
 				fwrite( $fp, $request );
 				$response	= '';
@@ -59,8 +59,14 @@
 					= explode(" ",$status_str);
 				// その他のヘッダを取得
 				foreach($headerpear_array as $line){
-					list($key,$val)	= explode(":",$line);
-					$this->response_headers[trim($key)] = trim($val);
+					if( strlen($line) > 0 ) {
+						$headers	= explode(":",$line);
+						if( count($headers) > 0 ) {
+							$key	= array_shift($headers);
+							$val	= implode(':',$headers);
+							$this->response_headers[trim($key)] = trim($val);
+						}
+					}
 				}
 				// レスポンスボディの取得
 				if( $this->response_headers['Transfer-Encoding'] == 'chunked' ) {
@@ -87,11 +93,95 @@
 					$status_str				= array_shift($headerpear_array);
 					list($this->protocol,$this->status_code,$this->status_string)
 						= explode(" ",$status_str);
-					foreach($headerpear_array as $line){
-						list($key,$val)	= explode(":",$line);
-						$this->response_headers[trim($key)] = trim($val);
+				}
+				return true;
+			}
+			return false;
+		} else {
+			return false;
+		}
+	}
+	function post($url,$header_params=array(),$requestBody){
+		list( $pr, $blank, $domain )	= explode('/',$url );
+		$uri	= substr($url,strpos($url,$domain));
+		$uri	= str_replace($domain,"",$uri);
+		if( strlen($uri) == 0 ) {
+			$uri	= '/';
+		}
+		if( preg_match('/^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}/',gethostbyname($domain)) == 0 ) {
+			return false;
+		}
+		return $this->post_response($domain,$uri,$header_params,$requestBody);
+	}
+	function post_response($host,$uri,$header_params=array(),$requestBody){
+		$request = "POST {$uri} HTTP/1.1\r\n"
+			."Accept: */*\r\n"
+			."Host: {$host}\r\n"
+		;
+		foreach( $header_params as $key => $value ) {
+			if( strlen(trim($key)) > 0 && strlen(trim($value)) > 0 ) {
+				$request	.= $key . ": " . $value . "\r\n";
+			}
+		}
+		$request	.= "Connection: close\r\n\r\n";
+		$request	.= "Content-Type: application/x-www-form-urlencoded;charset=UTF-8\r\n";
+		$request	.= "Content-Length: ".strlen($requestBody)."\r\n\r\n";
+		$request	.= $requestBody;
+		if( $fp = @fsockopen( $host, 80, $rv->en, $rv->es, 20 ) ){
+			if( socket_set_timeout( $fp, 30 ) ) {
+				fwrite( $fp, $request );
+				$response	= '';
+				while (!feof($fp)) {
+					$response .= fgets($fp, 128);
+				}
+				// responseの解析
+				$header_string	= '';
+				$response_body	= null;
+
+				// レスポンスヘッダ文字列を取得
+				$header_string		= substr( $response, 0, strpos($response,"\r\n\r\n"));
+				$headerpear_array	= explode("\r\n",$header_string);
+				// レスポンスステータスを確認
+				$status_str			= array_shift($headerpear_array);
+				list($this->protocol,$this->status_code,$this->status_string)
+					= explode(" ",$status_str);
+				// その他のヘッダを取得
+				foreach($headerpear_array as $line){
+					if( strlen($line) > 0 ) {
+						$headers	= explode(":",$line);
+						if( count($headers) > 0 ) {
+							$key	= array_shift($headers);
+							$val	= implode(':',$headers);
+							$this->response_headers[trim($key)] = trim($val);
+						}
 					}
 				}
+				// レスポンスボディの取得
+				if( $this->response_headers['Transfer-Encoding'] == 'chunked' ) {
+					$header_hex_string		= bin2hex($header_string."\r\n\r\n");
+					$separator_hex_string	= bin2hex("\r\n");
+					$body_start_pos			= strlen($header_hex_string);
+					$body_hex_string		= bin2hex($response);
+					$body_hex_string		= substr($body_hex_string,$body_start_pos);
+					$body_chunk_array		= explode($separator_hex_string,$body_hex_string);
+					// 0,2,4,..偶数はチャンクサイズなので削除してつなげ直す
+					$i	= 0;
+					$body_hex_string		= '';
+					foreach( $body_chunk_array as $val ) {
+						if( $i%2 != 0 ) { $body_hex_string	.= $val; }
+						$i++;
+					}
+					$this->response_body	= pack("H*",$body_hex_string);
+				} else {
+					$lines					= explode("\r\n\r\n",$response);
+					$header_string			= array_shift($lines);
+					$response_body			= implode("\r\n\r\n",$lines);
+					$this->response_body	= $response_body;
+					$headerpear_array		= explode("\r\n",$header_string);
+					$status_str				= array_shift($headerpear_array);
+					list($this->protocol,$this->status_code,$this->status_string)
+						= explode(" ",$status_str);
+				}
 				return true;
 			}
 			return false;

Modified: current/spider/lib/util/Mail.class.php
===================================================================
--- current/spider/lib/util/Mail.class.php	2010-01-13 12:35:56 UTC (rev 84)
+++ current/spider/lib/util/Mail.class.php	2010-03-26 08:05:29 UTC (rev 85)
@@ -114,7 +114,7 @@
 	 * テンプレートから件名と本文を設定します。
 	 * @param $file_path テンプレートファイルパス
 	 */
-	function setTemplateFile( $file_path ) {
+	function setTemplateFile( $file_path, $toEncoding=null, $fromEncoding='auto', $convertKana=null ) {
 		if( file_exists( $file_path ) ) {
 			if( $lines = @file( $file_path ) ) {
 				$this->subject		= array_shift( $lines );
@@ -124,6 +124,19 @@
 				$this->text_body	= implode("",$lines);
 				$this->text_body	= str_replace("\r\n","\n",$this->text_body);
 				$this->text_body	= str_replace("\r","\n",$this->text_body);
+				if( !is_null($toEncoding) && $toEncoding != $fromEncoding ) {
+					if( !is_null($fromEncoding) ) {
+						$this->subject		= mb_convert_encoding($this->subject,$toEncoding,$fromEncoding);
+						$this->text_body	= mb_convert_encoding($this->text_body,$toEncoding,$fromEncoding);
+					} else {
+						$this->subject		= mb_convert_encoding($this->subject,$toEncoding);
+						$this->text_body	= mb_convert_encoding($this->text_body,$toEncoding);
+					}
+				}
+				if( !is_null($convertKana) ) {
+					$this->subject		= mb_convert_kana($this->subject,$convertKana,$toEncoding);
+					$this->text_body	= mb_convert_kana($this->text_body,$convertKana,$toEncoding);
+				}
 			} else {
 				return false;
 			}
@@ -399,7 +412,7 @@
 				$return_hash['Content-Type']	= 'Multipart/Mixed; boundary="'.$this->boundary.'"';
 			} else if( strlen($this->html_body) > 0 && count($this->attachements) == 0 && count($this->inline_images) > 0 ) {
 				// HTMLメールでインライン画像のみある場合
-				$return_hash['Content-Type']	= 'Multipart/Alternative; boundary="'.$this->boundary.'"';
+				$return_hash['Content-Type']	= 'Multipart/Related; boundary="'.$this->boundary.'"; type="Multipart/Alternative"';
 			} else if( strlen($this->html_body) > 0 ) {
 				// HTMLメールで添付もインライン画像もない場合
 				$return_hash['Content-Type']	= 'Multipart/Alternative; boundary="'.$this->boundary.'"';
@@ -550,9 +563,11 @@
 				// textパート
 				$return_body	.= '--' . $alternative_boundary . "\r\n";
 				$return_body	.= 'Content-Type: text/plain; charset="'.$this->getBodyCharset().'"' ."\r\n";
-				$return_body	.= 'Content-Transfer-Encoding: 7bit'."\r\n\r\n";
-				$return_body	.= $text_body;
-				$return_body	.= "\r\n";
+//				$return_body	.= 'Content-Transfer-Encoding: 7bit'."\r\n\r\n";
+//				$return_body	.= $text_body;
+				$return_body	.= 'Content-Transfer-Encoding: quoted-printable'."\r\n\r\n";
+				$return_body	.= $this->quoted_printable_encoding($text_body);
+				$return_body	.= "\r\n\r\n";
 				// htmlパート
 				$return_body	.= '--' . $alternative_boundary . "\r\n";
 				$return_body	.= 'Content-Type: text/html; charset="'.$this->getBodyCharset().'"' ."\r\n";
@@ -607,9 +622,11 @@
 				// textパート
 				$return_body	.= '--' . $alternative_boundary . "\r\n";
 				$return_body	.= 'Content-Type: text/plain; charset="'.$this->getBodyCharset().'"' ."\r\n";
-				$return_body	.= 'Content-Transfer-Encoding: 7bit'."\r\n\r\n";
-				$return_body	.= $text_body;
-				$return_body	.= "\r\n";
+//				$return_body	.= 'Content-Transfer-Encoding: 7bit'."\r\n\r\n";
+//				$return_body	.= $text_body;
+				$return_body	.= 'Content-Transfer-Encoding: quoted-printable'."\r\n\r\n";
+				$return_body	.= $this->quoted_printable_encoding($text_body);
+				$return_body	.= "\r\n\r\n";
 				// htmlパート
 				$return_body	.= '--' . $alternative_boundary . "\r\n";
 				$return_body	.= 'Content-Type: text/html; charset="'.$this->getBodyCharset().'"' ."\r\n";
@@ -647,9 +664,11 @@
 				// textパート
 				$return_body	.= '--' . $alternative_boundary . "\r\n";
 				$return_body	.= 'Content-Type: text/plain; charset="'.$this->getBodyCharset().'"' ."\r\n";
-				$return_body	.= 'Content-Transfer-Encoding: 7bit'."\r\n\r\n";
-				$return_body	.= $text_body;
-				$return_body	.= "\r\n";
+//				$return_body	.= 'Content-Transfer-Encoding: 7bit'."\r\n\r\n";
+//				$return_body	.= $text_body;
+				$return_body	.= 'Content-Transfer-Encoding: quoted-printable'."\r\n\r\n";
+				$return_body	.= $this->quoted_printable_encoding($text_body);
+				$return_body	.= "\r\n\r\n";
 				// htmlパート
 				$return_body	.= '--' . $alternative_boundary . "\r\n";
 				$return_body	.= 'Content-Type: text/html; charset="'.$this->getBodyCharset().'"' ."\r\n";
@@ -670,7 +689,7 @@
 					$file_name	= base64_encode($file_name);
 					$file_name	= '=?'.$this->getFileNameCharset().'?B?'.$file_name.'?=';
 					$return_body	.= '--' . $this->boundary . "\r\n";
-					$return_body	.= 'Content-Type: '.$file_type.'; name="image'.sprintf('%02d',$num).'.jpg"'."\r\n";
+					$return_body	.= 'Content-Type: '.$file_type.'; name="'.$file_name.'"'."\r\n";
 					$return_body	.= 'Content-Transfer-Encoding: base64'."\r\n";
 					$return_body	.= 'Content-Id: <'.$content_id.'>'."\r\n\r\n";
 					$return_body	.= $attach . "\r\n";
@@ -688,9 +707,11 @@
 				// textパート
 				$return_body	.= '--' . $alternative_boundary . "\r\n";
 				$return_body	.= 'Content-Type: text/plain; charset="'.$this->getBodyCharset().'"' ."\r\n";
-				$return_body	.= 'Content-Transfer-Encoding: 7bit'."\r\n\r\n";
-				$return_body	.= $text_body;
-				$return_body	.= "\r\n";
+//				$return_body	.= 'Content-Transfer-Encoding: 7bit'."\r\n\r\n";
+//				$return_body	.= $text_body;
+				$return_body	.= 'Content-Transfer-Encoding: quoted-printable'."\r\n\r\n";
+				$return_body	.= $this->quoted_printable_encoding($text_body);
+				$return_body	.= "\r\n\r\n";
 				// htmlパート
 				$return_body	.= '--' . $alternative_boundary . "\r\n";
 				$return_body	.= 'Content-Type: text/html; charset="'.$this->getBodyCharset().'"' ."\r\n";
@@ -738,19 +759,28 @@
 			// 添付とHTMLのパターン判断
 			if( strlen($this->html_body) > 0 && count($this->attachements) > 0 && count($this->inline_images) > 0 ) {
 				// HTMLメールで添付ファイルとインライン画像両方がある場合
+				// multipart/relatedパート
+				$return_body	.= '--' . $this->boundary . "\r\n";
+				$related_boundary = "*-bndd" . uniqid("b");
+				$return_body	.= 'Content-Type: Multipart/Related; type="multipart/alternative"; boundary="'.$related_boundary.'"' ."\r\n\r\n";
 				// multipart/alternativeパート
-				$return_body	= '--' . $this->boundary . "\r\n\r\n";
+				$return_body	.= '--' . $related_boundary . "\r\n";
 				$alternative_boundary = "*-bndd" . uniqid("b");
 				$return_body	.= 'Content-Type: Multipart/Alternative; boundary="'.$alternative_boundary.'"' ."\r\n\r\n";
-				// multipart/relatedパート
-				$return_body	.= '--' . $this->boundary . "\r\n";
-				$related_boundary = "*-bndd" . uniqid("b");
-				$return_body	.= 'Content-Type: Multipart/Related; boundary="'.$related_boundary.'"' ."\r\n\r\n";
+				// textパート
+				$return_body	.= '--' . $alternative_boundary . "\r\n";
+				$return_body	.= 'Content-Type: text/plain; charset="'.$this->getBodyCharset().'"'."\r\n";
+				$return_body	.= 'Content-Transfer-Encoding: quoted-printable'."\r\n\r\n";
+				$return_body	.= $this->quoted_printable_encoding($text_body);
+				$return_body	.= "\r\n\r\n";
 				// htmlパート
-				$return_body	.= '--' . $related_boundary . "\r\n";
-				$return_body	.= 'Content-Type: text/html; charset="'.$this->getBodyCharset().'"' ."\r\n\r\n";
+				$return_body	.= '--' . $alternative_boundary . "\r\n";
+				$return_body	.= 'Content-Type: text/html; charset="'.$this->getBodyCharset().'"'."\r\n";
+				$return_body	.= 'Content-Transfer-Encoding: quoted-printable'."\r\n\r\n";
 				$return_body	.= $this->quoted_printable_encoding($html_body);
 				$return_body	.= "\r\n\r\n";
+				// multipart/alternativeパート終了
+				$return_body	.= '--' . $alternative_boundary . '--'."\r\n\r\n";
 				// インラインファイル添付
 				foreach( $this->inline_images as $content_id => $file_info ) {
 					$file_path	= $file_info['path'];
@@ -771,8 +801,6 @@
 				}
 				// multipart/relatedパート終了
 				$return_body	.= '--' . $related_boundary . '--'."\r\n\r\n";
-				// multipart/alternativeパート終了
-				$return_body	.= '--' . $alternative_boundary . '--'."\r\n\r\n";
 				// ファイルパート
 				foreach( $this->attachements as $file_info ) {
 					$file_path	= $file_info['path'];
@@ -796,17 +824,19 @@
 			} else if( strlen($this->html_body) > 0 && count($this->attachements) > 0 && count($this->inline_images) == 0 ) {
 				// HTMLメールで添付ファイルのみある場合
 				// multipart/alternativeパート
-				$return_body	= '--' . $this->boundary . "\r\n\r\n";
+				$return_body	= '--' . $this->boundary . "\r\n";
 				$alternative_boundary = "*-bndd" . uniqid("b");
 				$return_body	.= 'Content-Type: Multipart/Alternative; boundary="'.$alternative_boundary.'"' ."\r\n\r\n";
 				// textパート
 				$return_body	.= '--' . $alternative_boundary . "\r\n";
-				$return_body	.= 'Content-Type: text/plain; charset="'.$this->getBodyCharset().'"' ."\r\n\r\n";
-				$return_body	.= $text_body;
+				$return_body	.= 'Content-Type: text/plain; charset="'.$this->getBodyCharset().'"' ."\r\n";
+				$return_body	.= 'Content-Transfer-Encoding: quoted-printable'."\r\n\r\n";
+				$return_body	.= $this->quoted_printable_encoding($text_body);
 				$return_body	.= "\r\n\r\n";
 				// htmlパート
 				$return_body	.= '--' . $alternative_boundary . "\r\n";
-				$return_body	.= 'Content-Type: text/html; charset="'.$this->getBodyCharset().'"' ."\r\n\r\n";
+				$return_body	.= 'Content-Type: text/html; charset="'.$this->getBodyCharset().'"' ."\r\n";
+				$return_body	.= 'Content-Transfer-Encoding: quoted-printable'."\r\n\r\n";
 				$return_body	.= $this->quoted_printable_encoding($html_body);
 				$return_body	.= "\r\n\r\n";
 				// multipart/alternativeパート終了
@@ -833,20 +863,24 @@
 				$return_body	.= '--' . $this->boundary . '--'."\r\n";
 			} else if( strlen($this->html_body) > 0 && count($this->attachements) == 0 && count($this->inline_images) > 0 ) {
 				// HTMLメールでインライン画像のみある場合
+				// multipart/alternativeパート
+				$return_body	= '--' . $this->boundary . "\r\n";
+				$alternative_boundary = "*-bndd" . uniqid("b");
+				$return_body	.= 'Content-Type: Multipart/Alternative; boundary="'.$alternative_boundary.'"' ."\r\n\r\n";
 				// textパート
-				$return_body	= '--' . $this->boundary . "\r\n\r\n";
-				$return_body	.= 'Content-Type: text/plain; charset="'.$this->getBodyCharset().'"' ."\r\n\r\n";
-				$return_body	.= $text_body;
+				$return_body	.= '--' . $alternative_boundary . "\r\n";
+				$return_body	.= 'Content-Type: text/plain; charset="'.$this->getBodyCharset().'"' ."\r\n";
+				$return_body	.= 'Content-Transfer-Encoding: quoted-printable'."\r\n\r\n";
+				$return_body	.= $this->quoted_printable_encoding($text_body);
 				$return_body	.= "\r\n\r\n";
-				// multipart/relatedパート
-				$return_body	.= '--' . $this->boundary . "\r\n";
-				$related_boundary = "*-bndd" . uniqid("b");
-				$return_hash['Content-Type']	= 'Multipart/Related; boundary="'.$related_boundary.'"' ."\r\n\r\n";
 				// htmlパート
-				$return_body	.= '--' . $related_boundary . "\r\n";
-				$return_body	.= 'Content-Type: text/html; charset="'.$this->getBodyCharset().'"' ."\r\n\r\n";
+				$return_body	.= '--' . $alternative_boundary . "\r\n";
+				$return_body	.= 'Content-Type: text/html; charset="'.$this->getBodyCharset().'"' ."\r\n";
+				$return_body	.= 'Content-Transfer-Encoding: quoted-printable'."\r\n\r\n";
 				$return_body	.= $this->quoted_printable_encoding($html_body);
 				$return_body	.= "\r\n\r\n";
+				// multipart/alternativeパート終了
+				$return_body	.= '--' . $alternative_boundary . '--'."\r\n\r\n";
 				// インラインファイル添付
 				foreach( $this->inline_images as $content_id => $file_info ) {
 					$file_path	= $file_info['path'];
@@ -857,7 +891,7 @@
 					$file_name	= mb_convert_encoding( $file_name, $this->getFileNameEncoding(), 'auto');
 					$file_name	= base64_encode($file_name);
 					$file_name	= '=?'.$this->getFileNameCharset().'?B?'.$file_name.'?=';
-					$return_body	.= '--' . $related_boundary . "\r\n";
+					$return_body	.= '--' . $this->boundary . "\r\n";
 					$return_body	.= 'Content-Type: '.$file_type.'; name="'.$file_name.'"'."\r\n";
 					$return_body	.= 'Content-Transfer-Encoding: base64'."\r\n";
 					$return_body	.= 'Content-Id: <'.$content_id.'>'."\r\n";
@@ -865,20 +899,21 @@
 					$return_body	.= $attach . "\r\n";
 					$return_body	.= "\r\n\r\n";
 				}
-				// multipart/relatedパート終了
-				$return_body	.= '--' . $related_boundary . '--'."\r\n\r\n";
 				// マルチパート終了
 				$return_body	.= '--' . $this->boundary . '--'."\r\n";
 			} else if( strlen($this->html_body) > 0 ) {
 				// HTMLメールで添付もインライン画像もない場合
 				// textパート
-				$return_body	= '--' . $this->boundary . "\r\n";
-				$return_body	.= 'Content-Type: text/plain; charset="'.$this->getBodyCharset().'"' ."\r\n\r\n";
+				$return_body	.= '--' . $this->boundary . "\r\n";
+				$return_body	.= 'Content-Type: text/plain; charset="'.$this->getBodyCharset().'"' ."\r\n";
+				$return_body	.= 'Content-Transfer-Encoding: quoted-printable'."\r\n\r\n";
+				$return_body	.= $this->quoted_printable_encoding($text_body);
 				$return_body	.= $text_body;
 				$return_body	.= "\r\n\r\n";
 				// htmlパート
 				$return_body	.= '--' . $this->boundary . "\r\n";
-				$return_body	.= 'Content-Type: text/html; charset="'.$this->getBodyCharset().'"' ."\r\n\r\n";
+				$return_body	.= 'Content-Type: text/html; charset="'.$this->getBodyCharset().'"' ."\r\n";
+				$return_body	.= 'Content-Transfer-Encoding: quoted-printable'."\r\n\r\n";
 				$return_body	.= $this->quoted_printable_encoding($html_body);
 				$return_body	.= "\r\n\r\n";
 				// マルチパート終了
@@ -918,7 +953,7 @@
 			}
 		}
 		
-		return $return_body;
+		return trim($return_body);
 	}
 	/**
 	 * 本文と件名の特定置き換えワードを設定します。
@@ -927,6 +962,19 @@
 		$this->replace_words[$name]	= $value;
 	}
 	/**
+	 * 本文と件名の特定置き換えワードをハッシュで設定します。
+	 */
+	function addReplaceWordByHash( $prefix_name, $hash ) {
+		foreach( $hash as $key=>$val ) {
+			if( gettype( $val ) != 'object'
+				&& gettype( $val ) != 'array'
+				&& gettype( $val ) != 'resource'
+			) {
+				$this->addReplaceWord( $prefix_name."::".$key, $val );
+			}
+		}
+	}
+	/**
 	 * 本文と件名の特定置き換えワードをオブジェクトで設定します。
 	 */
 	function addReplaceWordByObject( $prefix_name, $object ) {
@@ -1015,31 +1063,34 @@
 	 * @return string エンコード後文字列
 	 */
 	function quoted_printable_encoding($str){
-		$str	= str_replace("\r\n","",$str);
-		$str	= str_replace("\r","",$str);
-		$str	= str_replace("\n","",$str);
-		define('CRLF', "\r\n");
-		$lines = preg_split("/\r?\n/", $str);
-		$out	 = '';
-		foreach ($lines as $line){
-			$newpara = '';
-			for ($j = 0; $j <= strlen($line) - 1; $j++){
-				$char = substr ( $line, $j, 1 );
-				$ascii = ord ( $char ); 
-				if ( $ascii < 32 || $ascii == 61 || $ascii > 126 ){
-					$char = '=' . strtoupper ( dechex( $ascii ) );
+		if( !defined('CRLF') ) {
+			define('CRLF', "\r\n");
+		}
+		$str		= trim($str);
+		$str		= str_replace("\r\n","\n",$str);
+		$lines		= preg_split("/\r?\n/", $str);
+		$retStrings	= '';
+		foreach ( $lines as $line ) {
+			$lineDec	= '';
+			for( $i=0; $i < strlen($line); $i++ ) {
+				$char	= substr( $line, $i, 1 );
+				$ascii	= ord( $char );
+				if ( $ascii < 32 || $ascii == 61 || $ascii > 126 ) {
+					$char	= '='.strtoupper( dechex( $ascii ) );
 				}
-				if ( ( strlen ( $newpara ) + strlen ( $char ) ) >= 76 ){
-					$out .= $newpara . '=' . CRLF;   $newpara = '';
+				if ( ( strlen ( $lineDec ) + strlen ( $char ) ) >= 76 ) {
+					$retStrings .= $lineDec.'='.CRLF;
+					$lineDec	= '';
 				}
-				$newpara .= $char;
+				$lineDec	.= $char;
 			}
-			$out .= $newpara . $char;
+			if( strlen(trim($lineDec)) > 0 ) {
+				$retStrings	.= $lineDec.CRLF;
+			} else {
+				$retStrings	.= '=0A=0D='.CRLF;
+			}
 		}
-		if( preg_match('/\\>\\>$/',$out) > 0 ) {
-			$out	= preg_replace('/\\>\\>$/','>',$out);
-		}
-		return trim ( $out );
+		return trim($retStrings);
 	}
 	/**
 	 * 携帯電話メール宛か確認します

Modified: current/spider/lib/util/mail/SendMail.class.php
===================================================================
--- current/spider/lib/util/mail/SendMail.class.php	2010-01-13 12:35:56 UTC (rev 84)
+++ current/spider/lib/util/mail/SendMail.class.php	2010-03-26 08:05:29 UTC (rev 85)
@@ -19,7 +19,8 @@
 		// 本文文字列を取得する
 		$header_strings		= $this->_get_header_part_strings(true,true,false,$add_header_crlf,$convert_encoding);
 		$body_strings		= $this->_get_body_part_strings($convert_encoding);
-		$sendwrite_strings	= $header_strings . $body_strings;
+		$sendwrite_strings	= trim($header_strings)."\r\n".trim($body_strings);
+		$sendwrite_strings	= str_replace("\r\n","\n",$sendwrite_strings);
 
 		// メールアドレス部分のみ抜き出す
 		$to				= $this->getToAddress();



Frameworkspider-svn メーリングリストの案内
Back to archive index