Apagar emails duplicados com php ou perl

22/09/2011

em Como Fazer,Linha de comando,Truques e Dicas

Quando se utiliza um acesso imap, acontece frequentemente, quando se muda de cliente de email ou migração de contas entre servidores, muitas mensagens de email, duplicadas. Após uma verificação na internet deparei-me com alguns scripts interessantes e principalmente, que funcionam.

IMPORTANTE: Claro que nunca é demais avisar, que devem ter muito cuidado e manter sempre uma cópia de segurança antes de efectuar qualquer operação.

Script em PHP, apresentado no Blog Ramdom em 19/3/2008 e alterado por tadghe (créditos no inicio do script):

<?php
// Originally from http://www.blograndom.com/blog/deleting-duplicate-mdir-emails-using-php/ on 7/19/2008
// modified by tadghe@gmail.com to fix issues with single and double quotes as well as adding the 
//            maxemails (partially there in the origianl) and showdups options. 

//License unknown

// Setup
$dir = '/var/mail/tadghe/cur/';
$delete = false; // set to true after testing to actually delete them
$maxemails = 0; //if set to a number other than 0, this will stop at the number set. useful for large boxes.
$emails = scandir($dir);
$showdups = true; // if set to true, will show the duplicate emails.

// Shouldn't have to change anything below here
$found = array();
$dups = 0;
$actual = 0;
$blank = 0;

$i = 0;
foreach($emails AS $file){

set_time_limit(20);

if($file == '.' OR $file == '..') continue;

$i++;

if ($maxemails != 0 && $i > $maxemails)
{
         break; // temp stopper
}

$messageIds = false;

$email = file_get_contents($dir . $file);
preg_match('#Message-ID:(\s+)<([^>]+)>#is', $email, $messageIds);

if(!is_array($messageIds) OR !isset($messageIds[2]) OR empty($messageIds[2])){
        $messageIds[2] = 'md5_' . md5($email);
        $blank++;
}

$messageId = $messageIds[2];

if(in_array($messageId, $found)){
        // message is a dup, delete
        if($delete) unlink($dir . $file);
                $dups++;
                 echo "Found a duplicate message ID of $messageId\n";
                if($showdups == true)
                {
                        echo $email;
                }

        }else{
                $found[] = $messageId;
                $actual++;
        }

}

echo 'Found ' . $i . ' emails' . "<br/>\n";
echo 'Found ' . $dups . ' duplicates' . "<br/>\n";
echo 'Leaving ' . $actual . ' originals' . "<br/>\n";
echo 'With ' . $blank . ' without message IDs' . "<br/>\n";

?>

O Script em Perl pode ser efectuado o download na página de Rick Sanders – IMAP Tools, mais especificamente, o script delIMAPdups.pl.

Na página IMAP Tools, encontra não só o script que permite eliminar mensagens duplicadas, como muitos outros scripts, gratuitamente.

 

Artigo anterior:

Próximo artigo: