[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Postfix i filtres



On Friday 19 September 2003 20:39, Francesc Alted wrote:

> Ufff... He hagut d'esborrar avui mateix més de 30 o 40 missatges del
> puto virus eixe. A 130 KB cada missatge, després d'un cap de setmana
> sense llegir el correu et quedes amb el compte bloquejat per excés de
> quota.

Com que a Ya.com han passat de mi he picat aquest script guarro en Perl 
que filtra la bustia. N'estic rebent mes d'un per minut.

Es molt simple, quan l'executes fa un TOP dels missatges nous i de tots 
aquells que fan mes de 150K o que tenen MS o Microsoft a les capcaleres 
o en les primeres 20 linies de missatge, escriu el From i el Subject 
per pantalla i et demana si tel vols carregar el missatge del servidor.

MS i Microsoft els posa en negreta + roig per a que es vegin facilment 
en el dialeg.

Si aneu a dormir podeu modificarlo facilment per a que faci el delete 
sense preguntar i programar un cron.

Usa el modul Net::POP3 que podeu instalar com a root fent:

    # perl -MCPAN -e 'install Net::POP3'

-- fxn
use strict;
use warnings;

use Net::POP3;
use Term::ANSIColor qw(:constants);

my $server   = 'pop.example.com';
my $login    = 'login';
my $password = 'password';

sub say { print @_, "\n" }

# Constructors
my $pop = Net::POP3->new($server);
if ($pop->login($login, $password) > 0) {
    say "logged in";
    my %msgnums = %{$pop->list}; # hashref of msgnum => size
    my $nmails = scalar keys %msgnums;
    foreach my $msgnum (keys %msgnums) {
        my @lines = @{$pop->top($msgnum, 20)};
        my ($subject) = grep /^Subject:/i, @lines;
        my ($from)    = grep /^From:/i, @lines;
        if ($msgnums{$msgnum} > 150000 || grep /\bM(?:S|icrosoft)\b/, @lines) {
            print "\n";
            $from    =~ s/\bM(?:S|icrosoft)\b/BOLD . RED . $& . RESET/e;
            $subject =~ s/\bM(?:S|icrosoft)\b/BOLD . RED . $& . RESET/e;
            print $from, $subject;
            my $answer = 'n';
            do {
                print "delete that fucking crap? ";
                $answer = <STDIN>;
                chomp $answer;
            } until $answer eq 'y' or $answer eq 'n';
            if ($answer eq 'y') {
                $pop->delete($msgnum);
                --$nmails;
            }
        }
    }
    say "$nmails new mails";
} else {
    say "no new mails";
}
$pop->quit;

Reply to: