command line deletion of files

John Wade jwade at oakton.edu
Thu Sep 29 17:16:37 EDT 2016


We use a perl scrip that does similar process to delete mass phishing or 
malware email messages from the mail spool.     The script locates the 
sequence number for the message based on the message ID/filename, and 
then issues the IMAP delete and expunge commands.

Relevant section of code below  (This is called from a subroutine that 
uses File::Find to locate the files in the file system, but it could be 
called with a simple list of files.) Advantage over ipurge is that this 
is not based on date or size but a specific set of files.

Enjoy,
John
------------------------------------------------------------------------------------
use Net::IMAP::Simple;
use Cyrus::IMAP::Admin;

sub imapdeletemessage {
     ( my $path ) = @_;
     ## Extract out foldername and filename (UID) from path
     $path =~ /\/var\/spool\/imap\/\d\/(.*)\/(\d+.)/;
     my $foldername = $1;
     my $messageuid = $2;
     return "Error: Unable to identify folder or message for $path" if ( 
! defined($foldername) || ! defined ($messageuid) );
     $foldername =~ s/\//\./g;
     $messageuid =~ s/\.$//g;
     ## Give ourselves permissions
     if ( my $err = &setimapacl($foldername, 'rte')) {
        return "$err";
     }

     # Create the IMAP object
     my $imap = Net::IMAP::Simple->new('localhost') ||
        die "Unable to connect to IMAP: $Net::IMAP::Simple::errstr\n";

     # Log on
     if(!$imap->login($CYRUSADMIN,$CYRUSADMINPW)){
         print STDERR "Login failed: " . $imap->errstr . "\n";
         exit(64);
     }

     ## Select folder and get number of messages
     my $nm = $imap->select($foldername);
     if ( $imap->waserr || ! defined($nm)  ) {
        &setimapacl($foldername, 'none');
        return "ERROR: unable to select $foldername: " . $imap->errstr;
     }

     ### Now get Sequence Number for Message ID
     my @seq = $imap->seq($messageuid);
     if ( ! defined($seq[0])) {
        &setimapacl($foldername, 'none');
        return "ERROR: No sequence number for UID $messageuid 
$foldername, probably deleted\n";
     }
     # print "seq for uid $messageuid is $seq[0]\n";

     ## Delete the message
     if ( ! $imap->delete( $seq[0] )) {
        &setimapacl($foldername, 'none');
        return "ERROR: Unable to delete $messageuid from $foldername: " 
. $imap->errstr;
     }

     ## Expunge the mailbox to be safe
     my $expunged = $imap->expunge_mailbox( $foldername );
     if  ( $imap->waserr ) {
         &setimapacl($foldername, 'none');
         return "ERROR: unabled to expunge $foldername: " . $imap->errstr;
     }
     $imap->quit;
     print "IMAP Deleted: UID:$messageuid from folder:$foldername\n";
     print LOG "IMAP Deleted: UID:$messageuid from folder:$foldername\n" 
if ( $logfile);

     ## Take away our permissions
     if ( my $err = &setimapacl($foldername, 'none')) {
        return "$err";
     }
     return 0;
};


On 09/29/2016 11:27 AM, Shawn Bakhtiar via Info-cyrus wrote:
>> Good morning,
>>
>> trying to get rid of some emails that have large attachments (i.e. 
>> videos sent over email, or cd images, etc...)
>>
>> Would it be proper to
>>
>> rm -rf /var/spool/imap/u/username/mailbox/4321.
>>
>> then
>>
>> reconstruct -rf user.username
>>
>> Or is there a more "proper" way using cyrus?
>



More information about the Info-cyrus mailing list