<?php
set_time_limit(0);
ini_set('display_errors', true);
ini_set('error_reporting', E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
// 輸入參數檢查
if ( !$argv[1] || !$argv[2] ){
echo <<<Output
Usage: php mbox2maildir.php mbox_file output_dir/
Output;
exit;
}
function remove_last_line($filename){
// 打开文件
$file_handle = fopen($filename, 'r');
// 设置循环变量
$linebreak = false;
$file_start = false;
// 要查看的字节数
$bite = 256;
// 文件大小
$filesize = filesize($filename);
// 将指针放在文件末尾。
fseek($file_handle, 0, SEEK_END);
while ($linebreak === false && $file_start === false) {
// 获取当前文件位置。
$pos = ftell($file_handle);
if ($pos < $bite) {
// 如果位置小于一口,则转到文件的开头
rewind($file_handle);
} else {
// 将$bite个字符移回文件
fseek($file_handle, -$bite, SEEK_CUR);
}
// 将文件的$bite个字符读入字符串。
$string = fread($file_handle, $bite) or die ("Can't read from file " . $filename . ".");
/* If we happen to have read to the end of the file then we need to ignore
* the last line as this will be a new line character.
*/
if ($pos + $bite >= $filesize) {
$string = substr_replace($string, '', -1);
}
// 由于我们将fred()前进到文件中,因此需要备份$bite字符。
if ($pos < $bite) {
// 如果位置小于一口,则转到文件的开头
rewind($file_handle);
} else {
// 将$bite个字符移回文件
fseek($file_handle, -$bite, SEEK_CUR);
}
// 我们读取的字符串中是否有换行符?
if (is_integer($lb = strrpos($string, "\n"))) {
// 将$linebreak设置为true,以便我们跳出循环
$linebreak = true;
// 文件中的最后一行在换行符之后
$line_end = ftell($file_handle) + $lb + 1;
}
if (ftell($file_handle) == 0) {
// 如果我们位于文件的开头,请跳出循环。
$file_start = true;
}
}
if ($linebreak === true) {
// 如果找到换行符,则将文件读入字符串以写入而无需最后一行。
rewind($file_handle);
$file_minus_lastline = fread($file_handle, $line_end);
// 关闭档案
fclose($file_handle);
// 以写入模式打开文件并截断它。
$file_handle = fopen($filename, 'w+');
fputs($file_handle, $file_minus_lastline);
fclose($file_handle);
} else {
// 关闭档案, nothing else to do.
fclose($file_handle);
}
}
$size = filesize($argv[1]);
$handle = fopen($argv[1], 'r');
$new = '';
$i = 1;
$j = 1;
if ($handle) {
while (($buffer = fgets($handle)) !== false) {
$new .= $buffer;
// 顯示進度
echo $i . '/' . $j."\n";
// 判斷下一封信
if ( preg_match("/\r\n\r\nFrom /", $new) ){
$j = 1;
$filename = $argv[2] . microtime(true) .'.'. uniqid();
// 將信儲存
$file_name = './'. microtime(true) .'.'. uniqid();
file_put_contents($file_name, $new);
exec('chown vmail:vmail '.$file_name);
// 將下一封信的 From 移除
remove_last_line($filename);
remove_last_line($filename);
remove_last_line($filename);
// 下一封信開始
$new = $buffer;
$i++;
}
$j++;
}
}
// 最後一封
file_put_contents($argv[2]. microtime(true) .'.'. uniqid(), $new);
fclose($handle);