主题: 分享一个外发邮件备份邮箱删除重复邮件的脚本。
关于外发邮件备份,在论坛里可以找到,就是所有用户使用公司邮件服务器外发邮件的时候,发出的邮件都会自动转发到一个邮箱。
办法也很简单,在vmail 库里的 sender_bcc_domain 表里添加一个字段即可。
但是我发现这个邮箱的增长速度极快,而且很多重复的邮件,例如给公司所有人群发的信件,那就相当于一下子备份了几十封邮件,其实只需要一封即可。
为此,写了一个PHP脚本去检查删除。放在 crontab 里面,每天凌晨运行一次即可。
这个脚本可用,但是有以下问题,有精益求精的可以修改再使用
问题:
1、对于发送时间取的不是很精确,有可能会造成漏删。
2、判断机制有可能会造成以下情况的删除:
某人写了一封邮件,然后意识到错误,在10分钟之内又发送了一封主题一样的邮件。
不过对于我们公司来说,已经可以用了,那几个问题是可以容忍的。
此php脚本需要使用PEAR库的 Mime_Decode,iredmail里面已经含了。
但是还需要检查一下你的/etc/php.ini 确保 include_path 里面 有 /usr/share/pear
我的 /etc/php.ini 是这样的。
include_path = ".:/www/includes:/usr/share/pear"
OK,下面是脚本:
#!/usr/bin/php -q
<?
chdir("/www/scripts/");
include_once ('Mail/mimeDecode.php');
$domain = "abc.com";
$lasttime = time()- (24*60*60); //仅检查24小时以内的邮件。
$date = date("Y-m-d");
$time = date("Y-m-d H:i:s");
$arr_dir[] = "/home/vmail/$domain/backup/cur/";
$arr_dir[] = "/home/vmail/$domain/backup/new/";
$count = 0;
foreach($arr_dir as $dir)
{
if(is_dir($dir))
{
if($dh = opendir($dir))
{
while (false !== ($file = readdir($dh)))
{
if($file != "." || $file != "..")
{
$file = $dir."/".$file;
if(is_file($file))
{
$filetime = filemtime($file);
if($filetime >= $lasttime)
{
$header=getMailHeader($file);
$from = addslashes($header['return-path']);
$subject = addslashes(trim($header['subject']));
$date = addslashes(substr($header['date'],0,21));//取10分钟以内的时间。
$value = $from."_".$date;
if( array_key_exists($value , $arr_mail))
{
if($arr_mail[$value] == $subject)
{
//假如 发件人相符,时间相差不大,主题相同 ,那么删除。
unlink($file);
echo "===========deleted : $file\n";
}
}
else
$arr_mail[$value] = $subject ;
$count++;
}
}
}
}
}
}
}
//$count = count($arr_mail);
$time = date("Y-m-d H:i:s");
echo "================== $count files processed =============================================\n";
echo "========================$time==========================================================\n";
function getMailHeader($filename)
{
$raw_mail_msg = "";
$handle = fopen($filename,'r');
$raw_mail_msg = fread($handle, filesize ($filename));
fclose($handle);
$params = array();
$params['include_bodies'] = FALSE;
$params['decode_bodies'] = FALSE;
$params['decode_headers'] = TRUE;
$params['input'] = $raw_mail_msg;
$structure = Mail_mimeDecode::decode($params);
$header = $structure->headers;
return $header;
}
?>
[ 本帖最后由 denvor 于 2009-7-16 09:56 编辑 ]