主题: 分享一个外发邮件备份邮箱删除重复邮件的脚本。

关于外发邮件备份,在论坛里可以找到,就是所有用户使用公司邮件服务器外发邮件的时候,发出的邮件都会自动转发到一个邮箱。
办法也很简单,在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 编辑 ]

回复: 分享一个外发邮件备份邮箱删除重复邮件的脚本。

感谢分享。:loveliness:

回复: 分享一个外发邮件备份邮箱删除重复邮件的脚本。

在vmail 库里的 sender_bcc_domain 表里添加一个字段.

这个具体怎么做????楼主能否赐教,鄙人大白,还望指点

回复: 分享一个外发邮件备份邮箱删除重复邮件的脚本。

不是字段,我写错了,就是添加一个记录。
你看看那个表就知道了。

回复: 分享一个外发邮件备份邮箱删除重复邮件的脚本。

邮件服务器外发邮件的时候,发出的邮件都会自动转发到一个邮箱~!这个功能还是很有用的,不过好像没谁发过类似的专门设置的帖子,希望能有人写一个实操的册子,造福我等白人