--
--
Mozilla Thunderbird +
使用此方案可將 mbox 匯入到「本地」上,因為要跨裝置所以這種本機方案就不可行,要找 Server 的解決方案
--
Mbox 轉 MailDir
現在的 Mail Server Postfix 郵件儲存的格式都是 MailDir 所以 Google 匯出的 Mbox 格式需要轉換,其實只是把信件拆開,秉著不造輪子的想法在網路上找了一圈,就是找不到可以用的轉換程式,明明就沒有很難,只好自己寫了一個
因為判斷間隔方法因素,必須把下一封信的 From 刪除,本來使用的方式是使用換行轉成陣列,再使用 array_pop() 的方式,考慮到超大資料有可能會讓記憶體爆炸所以換了一個方式
mbox2maildir.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
<?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); |
用法
切換到使用者的 maildir cur 目錄,再執行
1 |
# php mbox2maildir.php mbox檔案 輸出路徑 |
結果大概就是長這樣
--
使用 array 刪除最後行的方式
1 2 3 4 |
$p = explode("\r\n", $new); array_pop($p); array_pop($p); $c = implode("\r\n", $p); |
--
1,033 total views, 1 views today