#! /usr/local/bin/perl ################################################################ ### ### imclean ### ### Author: Internet Message Group ### Created: Apr 23, 1997 ### Revised: Mar 8, 2005 ### BEGIN { use lib '/usr/local/lib'; use lib '/mnt/gmirror/ports/mail/im/work/im-148'; ###DELETE-ON-INSTALL### }; $Prog = 'imclean'; my $VERSION_DATE = "20050308"; my $VERSION_NUMBER = "148"; my $VERSION = "${Prog} version ${VERSION_DATE}(IM${VERSION_NUMBER})"; my $VERSION_INFORMATION = "${Prog} (IM ${VERSION_NUMBER}) ${VERSION_DATE} Copyright (C) 1999 IM developing team This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. "; ## ## Require packages ## use IM::Config; use IM::Util; use IM::Folder; use IM::File; use integer; use strict; use vars qw($Prog $EXPLANATION @OptConfig $opt_src $opt_noharm $opt_quiet $opt_verbose $opt_debug $opt_help $opt_version); ## ## Environments ## $EXPLANATION = "$VERSION mail/news garbage cleanup Usage: $Prog [OPTIONS] [FOLDER] [MSGS...] "; @OptConfig = ( 'src;F;;' => "Set a folder to be cleaned up", 'SSHServer,S;s;localhost;SSH_server' => 'SSH port relay server', 'noharm;b;;' => "Do not delete files, show what will be performed", 'quiet;b;;' => "Do not show any messages", 'verbose;b;;' => 'With verbose messages', 'debug;d;;' => "With debug message", 'help;b;;' => "Display this help and exit", 'version,V;b;;' => "Output version information and exit", ); ## ## Profile and option processing ## init_opt(\@OptConfig); read_cfg(); read_opt(\@ARGV); # help? print("${VERSION_INFORMATION}") && exit $EXIT_SUCCESS if $opt_version; help($EXPLANATION) && exit $EXIT_SUCCESS if $opt_help; debug_option($opt_debug) if $opt_debug; ## ## Main ## my @msgs = @ARGV; @msgs = ('all') if (!@ARGV); imclean($opt_src, @msgs); exit $EXIT_SUCCESS; ## ## work horse sub imclean($@) { my($folder, @msgs) = @_; my(@paths, $set, $HANDLE); if ($folder !~ /^%/) { @paths = get_message_paths($folder, @msgs); if (scalar(@paths) == 0) { im_warn("no msgs in $folder\n"); return; } } else { # IMAP folder (%folder[:[user[/auth]]@server]) require IM::Imap && import IM::Imap; require IM::GetPass && import IM::GetPass; my($ifld, $auth, $user, $host); $ifld = $folder; if ($ifld !~ /[:\@]/) { # Use ImapAccount spec, unless user or host is specified. (my $dummy, $auth, $user, $host) = imap_spec(''); $ifld =~ s/^%//; } else { ($ifld, $auth, $user, $host) = imap_spec($ifld); } my($pass, $agtfound, $interact) = getpass('imap', $auth, $host, $user); im_warn("accessing IMAP/$auth:$user\@$host\n") if (&verbose); (my $rc, $HANDLE) = imap_open($auth, $host, $user, $pass); if ($rc < 0) { my $prompt = lc("imap/$auth:$user\@$host"); im_err("invalid password ($prompt).\n"); &savepass('imap', $auth, $host, $user, '') if ($agtfound && &usepwagent()); exit $EXIT_ERROR; } &savepass('imap', $auth, $host, $user, $pass) if ($interact && $pass ne '' && &usepwagent()); my $exists = imap_select($HANDLE, $ifld, 1); if ($exists < 0) { imap_close($HANDLE); im_die("can't access to $folder\n"); } elsif ($exists == 0) { imap_close($HANDLE); im_warn("no msgs in $folder\n"); return; } $set = imap_range2set($HANDLE, @msgs); } print "unlinking msgs in $folder..." unless ($opt_noharm || $opt_quiet); print "\n" if $opt_verbose; flush('STDOUT') unless $opt_noharm; if ($folder !~ /^%/) { my $i = 0; foreach (@paths) { if (! -f $_) { im_die("invalid message specification (unlinked $i message(s))\n"); } im_unlink($_); $i++; } } else { imap_delete($HANDLE, $set); imap_close($HANDLE); } print "done\n" unless ($opt_noharm || $opt_quiet); if ($folder !~ /^%/) { touch_folder($folder) unless $opt_noharm; } } __END__ =head1 NAME imclean - mail/news garbage cleanup =head1 SYNOPSIS B [OPTIONS] [FOLDER] [MSGS...] =head1 DESCRIPTION The I command delete all mail/news messages from +trash folder. If you do not want to delete all messages, specify message numbers. This command is provided by IM (Internet Message). =head1 OPTIONS =over 5 =item I<-s, --src=FOLDER> Set a folder to be cleaned up. "--src=+xxx" is equivalent to "+xxx". Default value is "+trash". =item I<-S, --sshserver=SERVER> SSH port relay server. =item I<-n, --noharm={on,off}> Do not delete files, show what will be performed. =item I<-q, --quiet={on,off}> Do not show any messages. =item I<-v, --verbose={on,off}> Print verbose messages when running. =item I<--debug=DEBUG_OPTION> Print debug messages when running. =item I<-h, --help> Display help message and exit. =item I<--version> Output version information and exit. =back =head1 COPYRIGHT IM (Internet Message) is copyrighted by IM developing team. You can redistribute it and/or modify it under the modified BSD license. See the copyright file for more details. =cut ### Copyright (C) 1997, 1998, 1999 IM developing team ### All rights reserved. ### ### Redistribution and use in source and binary forms, with or without ### modification, are permitted provided that the following conditions ### are met: ### ### 1. Redistributions of source code must retain the above copyright ### notice, this list of conditions and the following disclaimer. ### 2. Redistributions in binary form must reproduce the above copyright ### notice, this list of conditions and the following disclaimer in the ### documentation and/or other materials provided with the distribution. ### 3. Neither the name of the team nor the names of its contributors ### may be used to endorse or promote products derived from this software ### without specific prior written permission. ### ### THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ### ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ### IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ### PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ### LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ### CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ### SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ### BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ### WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ### OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ### IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ### Local Variables: ### mode: perl ### End: