#!/usr/bin/php
<?
chdir(dirname(__FILE__));
require_once('../nmail/include/global.php');
require_once("include/mail_lib.php");
require_once("include/file.php");


// 웹상에서의 실행방지.
if ($_SERVER['DOCUMENT_ROOT'] || $_SERVER['SERVER_SOFTWARE'])
{
	die("Access Denied");	
}	// if()


echo "[Nmail] 메일파일중 공백이 들어간 파일명을 언더바(_)로 변경해주는 작업\n\n";


// [2012-03-29] 편지함 복구를 통해 복구한 파일명에 공백이 들어간 경우, 아웃룩에서 POP3 로 메일을 가져갈 때 문제가 생기지 않도록 함.  (mf_filename LIKE '% %' OR LENGTH(mf_filename) > 140)

// set
set_time_limit(0);
ini_set('memory_limit', '2047M');
$memory_limit = ini_get('memory_limit');
#echo "memory_get_usage: ".number_format(memory_get_usage()) . "\n"; 

$_start = getmicrotime();

// 입력값 확인.
$d_name_input = addslashes($_SERVER['argv'][1]);
$m_id_input = addslashes($_SERVER['argv'][2]);
#if (!$d_name_input || !$m_id_input)
if (!$d_name_input)
{
	die("  사용방법)\n    - 특정 회  원 : ".$_SERVER['PHP_SELF']." domain.com userid\n    - 특정 도메인 : ".$_SERVER['PHP_SELF']." domain.com\n    - 전체 도메인 : ".$_SERVER['PHP_SELF']." ALL\n");
}	// if()


if ($d_name_input == 'ALL')
{
	$dm = db_get_rows("SELECT d_no, d_name FROM " . $TB['DOMAIN'] . "");
} else 
{
	$d_no = db_get_one("SELECT d_no FROM " . $TB['DOMAIN'] . " WHERE d_name = '" . $d_name_input . "'");
	if (!$d_no)
		die("존재하지 않는 도메인입니다.\n=> " . $d_name_input."\n");

	$q_where = '';
	if ($m_id_input)
	{
		$q_where = " m_id = '" . $m_id_input . "' AND ";
	}	// if()

	$dm = array(array('d_no'=>$d_no, 'd_name'=>$d_name_input));
}	// if()

for ($di=0; $di<sizeof($dm); $di++)
{
	$d_no = $dm[$di]['d_no'];
	$d_name = $dm[$di]['d_name'];

	echo "\n";
	echo "#############################################\n";
	echo "# [".($di+1)."/".sizeof($dm)."] ".$d_name."\n";
	echo "#############################################\n";

	// [2007-07-21] 메일링 리스트 계정은 제외
	//$mbr = db_get_rows("SELECT m_no, m_id, m_mail_file_group FROM " . $TB['MEMBER'] . " WHERE ".$q_where." d_no = '" . $d_no . "'");
	$mbr = db_get_rows("SELECT m_no, m_id, m_mail_file_group FROM " . $TB['MEMBER'] . " WHERE ".$q_where." d_no = '" . $d_no . "' AND m_usertype IS NULL");
	$mbr_cnt = sizeof($mbr);
	if ($mbr_cnt < 1)
	{
		if ($m_id_input)
		{
			die("존재하지 않는 사용자입니다.\n=> " . $m_id_input."\n");
		} else if ($d_name_input != 'ALL')
		{
			die("도메인내에 등록된 사용자가 없습니다.\n");
		}	// if()
	} else 
	{
		echo "총 ".number_format($mbr_cnt)."명의 메일파일명 변경 작업을 시작합니다.\n";


		for ($mi=0; $mi<$mbr_cnt; $mi++)
		{
			// set
			$m_id = $mbr[$mi]['m_id'];
			$AUTH['auth_m_no'] = $mbr[$mi]['m_no'];
			$AUTH['auth_m_id'] = $mbr[$mi]['m_id'];
			$AUTH['auth_m_mail_file_group'] = $mbr[$mi]['m_mail_file_group'];
			$AUTH['auth_m_mf_table'] = $G_SYS[PRE_FIX] . 'mail_file_' . $d_no . '_' . $mbr[$mi]['m_mail_file_group'];
			$G_SYS['MAIL_DOMAIN'] = $d_name;

			#echo "[".($mi+1)."/".$mbr_cnt."][".$m_id."]님의 재생성를 시작합니다.(" . round((getmicrotime() - $_start),4) . "sec)\n";

		// 메일박스가져오기
			$DEBUG['get_mail_box']['start'] = getmicrotime();
			$sql = "
				SELECT
					mb_id
				FROM
					".$TB['MAIL_BOX']."
				WHERE
					m_no='". $AUTH['auth_m_no'] . "'
				ORDER BY
					mb_sort
				";
			$mb = db_get_rows($sql);
			$DEBUG['get_mail_box']['exec'] += getmicrotime() - $DEBUG['get_mail_box']['start'];

			$DEBUG['get_maildb_cnt']['start'] = getmicrotime();
			$maildb_cnt = array();
			$mb_dir_id = array();
			for ($m=0; $m<sizeof($mb); $m++)
			{
				$DEBUG['get_mf_filenames']['start'] = getmicrotime();
				$sql = "
					SELECT
						mf_filename, mf_no
					FROM
						" .$AUTH['auth_m_mf_table'] . "
					WHERE
						m_no='" . $AUTH['auth_m_no'] . "'
						AND mb_id = '" . $mb[$m]['mb_id'] . "'
						AND (mf_filename LIKE '% %' OR LENGTH(mf_filename) > 140)
					";
				$rows = db_get_rows($sql);
				$rows_cnt = sizeof($rows);
				$DEBUG['get_mf_filenames']['exec'] += getmicrotime() - $DEBUG['get_mf_filenames']['start'];
				
				if ($rows_cnt > 0)
				{
					echo "[".($mi+1)."/".$mbr_cnt."][".$m_id."] ".$mb[$m]['mb_id']." : ".$rows_cnt . "\n";

					for ($r=0; $r<$rows_cnt; $r++)
					{
						$mf_dir = get_mail_dir().'/'.get_mb_dir($mb[$m]['mb_id']).'/';
						#echo $AUTH['auth_m_mf_table'].' / '.$mf_dir.$rows[$r]['mf_filename'].' / '.$rows[$r]['mf_no'].' / '.$AUTH['auth_m_no']."\n";
						#mail_db_rebuild($AUTH['auth_m_mf_table'], $mf_dir.$rows[$r]['mf_filename'], $rows[$r]['mf_no'], $AUTH['auth_m_no']);

						// [2012-03-29] 파일명에서 공백 제거
						$mf_filename_new = str_replace(' ', '_', $rows[$r]['mf_filename']);

						// [2012-05-15] 140자이내로 제한.
						if (strlen($mf_filename_new) > 140)
							$mf_filename_new = substr($mf_filename_new, 0, 136).'.eml';

						// 중복되었을 경우 파일명 변경
						for ($n=0; $n<100; $n++)
						{
							if (!file_exists($mf_dir.'/'.$mf_filename_new))
								break;
							$mf_filename_new = str_replace('.eml', '.'.rand(111,999).'.eml', $mf_filename_new);
						}	// for()

						// 1. DB 갱신
						$q = "UPDATE " .$AUTH['auth_m_mf_table'] . " SET mf_filename='".addslashes($mf_filename_new)."' WHERE mf_no='" . $rows[$r]['mf_no'] . "' AND m_no='" . $AUTH['auth_m_no'] . "' AND mb_id = '" . $mb[$m]['mb_id'] . "' AND (mf_filename LIKE '% %' OR LENGTH(mf_filename) > 140)";
						db_query($q);


						// 2. 파일명 변경
						rename($mf_dir.$rows[$r]['mf_filename'], $mf_dir.$mf_filename_new);
					}	// for()

					flush();
				}	// if()
			}	// for()
			$DEBUG['get_maildb_cnt']['exec'] += getmicrotime() - $DEBUG['get_maildb_cnt']['start'];

		}	// for()

		echo "[" . round((getmicrotime() - $_start),4) . "sec]메일파일명 변경 작업이 완료되었습니다.\n";

	}	// if()

}	// for()

if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')
{
	#system('pause');
}	// if()

#require_once('include/global_end.php');
?>