SPAM nach Aufbewahrungsfrist automatisch löschen

  • Thread starter Thread starter collecty
  • Start date Start date
C

collecty

Guest
Hallo!

Ich bin neu im Forum und suche Hilfe beim Versuch, die Spamflut in den Griff zu bekommen. Ich haben einen VServer bei S4Y mit mehreren Usern/Domains. Ich nutze Debian Etch mit Plesk 8.2.1, Qmail und Spamassassin. Letzteren habe ich nach der Anleitung "SpamAssassin auch ohne Lizenz" zum Laufen bekommen. Auf besonderen Wunsch einiger User habe ich Unterordner zum Aussortieren von Spam eingerichtet nach der Anleitung "spezielle Spam-Ordner".

Außerdem läuft ein Script, dass die User täglich über den Inhalt des Spam-Ordners per Mail informiert. Das funktioniert alles auch soweit. Ich hänge an dem Punkt, die Spam-Mails im Spam-Ordner, die älter als 14 Tage sind, zu löschen. Das soll mit einem Eintrag in /etc/courier-imap/imapd gelöst werden: IMAP_EMPTYTRASH=Trash:7,Spam:14,Sent:30

Allerdings funktioniert dieser Eintrag nur, wenn die User auch das IMAP-Protokoll nutzen. Einige User verwenden POP und melden sich nicht per IMAP an, solange die tägliche Infomail keinen Hinweis auf false-positive Mails im Spam-Ordner gibt. Jetzt suche ich also nach einem Script, dass ich per cronjob täglich starten kann und das alle älteren Spam-Mails protokoll- bzw. user-unabhängig löscht. Ich hab schon fleißig die Forumssuche verwendet und gegoogelt, aber bis jetzt noch keine Lösung gefunden.

Danke im Vorraus und auch ein dickes Lob für dieses tolle Forum.
 
SPAM automatisch löschen

Hallo!

Nun habe ich doch noch eine Lösung gefunden. Mails, die im Maildir-Format abgelegt werden, können auf Filesystemeben gelöscht werden. Pro Mail gibt es im Maildir-Format eine eigene Datei, die mit rm gelöscht werden kann. Ich dokumentiere das hier, vielleicht hilft es anderen mit dem gleichen Problem. Ich lösche alle Mails im Spam-Ordner, die älter als N Tage sind, mit folgendem Befehl auf Filesystemebene:

Code:
find /var/qmail/mailnames/<Maildomain>/<Mailuser>/Maildir/.Spam/ -type f -mtime +N | xargs rm
 
Script für die Infomail

Hallo,

benutze einen Server mit Plesk 8.4, Suse 10.1, qmail ...
Habe beim Thema Spam nach Anleitung von Huschi sa-learn und Filter in definierten Spamordner am laufen. Das funktioniert alles problemlos. Das die User ihre Spamordner nicht leeren laufen permanent die Mailboxen voll. Deshalb möchte ich eine Infomail schicken lassen und nach 14 Tagen automatisch löschen. Das löschen funktioniert auch.

Wo finde ich das Script für die Infomail und was muß man einrichten. Unter rootservices.de kann ich nichts mehr finden.

Danke für jeden Tipp.




Hallo!

Ich bin neu im Forum und suche Hilfe beim Versuch, die Spamflut in den Griff zu bekommen. Ich haben einen VServer bei S4Y mit mehreren Usern/Domains. Ich nutze Debian Etch mit Plesk 8.2.1, Qmail und Spamassassin. Letzteren habe ich nach der Anleitung "SpamAssassin auch ohne Lizenz" zum Laufen bekommen. Auf besonderen Wunsch einiger User habe ich Unterordner zum Aussortieren von Spam eingerichtet nach der Anleitung "spezielle Spam-Ordner".

Außerdem läuft ein Script, dass die User täglich über den Inhalt des Spam-Ordners per Mail informiert. Das funktioniert alles auch soweit. Ich hänge an dem Punkt, die Spam-Mails im Spam-Ordner, die älter als 14 Tage sind, zu löschen. Das soll mit einem Eintrag in /etc/courier-imap/imapd gelöst werden: IMAP_EMPTYTRASH=Trash:7,Spam:14,Sent:30

Allerdings funktioniert dieser Eintrag nur, wenn die User auch das IMAP-Protokoll nutzen. Einige User verwenden POP und melden sich nicht per IMAP an, solange die tägliche Infomail keinen Hinweis auf false-positive Mails im Spam-Ordner gibt. Jetzt suche ich also nach einem Script, dass ich per cronjob täglich starten kann und das alle älteren Spam-Mails protokoll- bzw. user-unabhängig löscht. Ich hab schon fleißig die Forumssuche verwendet und gegoogelt, aber bis jetzt noch keine Lösung gefunden.

Danke im Vorraus und auch ein dickes Lob für dieses tolle Forum.
 
OK, das hab ich jetzt auch mal probiert. Da hängt er mit sendmail. Kann die sendmail.pm nicht finden. Hab diese dann auch in die unter @INC aufgeführten Ordner reinkopiert und mit rechten versehen. Das will so nicht funktionieren. Allerdings ist sendmail ein Buch mit 7 Siegeln. Kann man das auch anders lösen oder mir Tipps bzgl. des Problems geben.


s15213398:~ # ./spamreport.pl
Can't locate Mail/Sendmail.pm in @INC (@INC contains: /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8 /usr/lib/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl .) at ./spamreport.pl line 7.
BEGIN failed--compilation aborted at ./spamreport.pl line 7.
s15213398:~ #

Wie sollte denn die Sendmail.pm aussehen? Danke für jeden Tipp.
 
Den Fehler hatte ich auch damals. Ich hab das ganze umgangen, indem ich die Mails anders gesendet habe.

Hier ist mal meine komplette spamreport.pl. Der Großteil ist aus dem Artikel des Linux-Magazins übernommen (ich bin also nicht Matthias Jansen). Die Mailerfunktion in den letzten ~30 Zeilen habe ich auch irgendwo aus dem Netz, aber keine Ahnung mehr...

Code:
#!/usr/bin/perl -w
# Script for collecting all spam and generate a spamreport
# Author: Matthias Jansen
# Version: 0.1

use strict;
use HTML::Entities;
use Fcntl ':flock'; # import LOCK_* constants

# get all possible spam that wasn't deleted already
my @files = `/bin/ls -1 /var/qmail/mailnames/{domain1,domain2}/*/Maildir/.Junk/{cur,new}/* | /bin/grep -v 'T\$'`;


my %spams = ();
my $lastuser = '';
my $count = 0;

my $day = 48*60*60;

# collect all the data
for (my $i=0;$i<@files;$i++) {
     $files[$i] =~ /\/(\d+)\./;
     my $timestamp = $1;
     my $currenttime = time();

     if ($currenttime - $timestamp < $day) {

         my($domain, $user) = $files[$i] =~ /\/var\/qmail\/mailnames\/([^\/]+)\/([^\/]+)\//;
         my $currentuser = $user."@".$domain;

         if ($lastuser ne $currentuser) {
             my @temp = ();
             $spams{$currentuser} = \@temp;
             $count = 0;
         }

         $lastuser = $currentuser;
         if (open(SP,"<".$files[$i])) {
             # lock the mail before reading
             flock(SP,LOCK_EX);
             my $subject = '';
             my $from = '';

             while(defined(my $line = <SP>) && (length($subject) == 0 || ($from eq ''))) {
                 if ($line =~ /^Subject: (.*)$/i) { $subject = $1; }
                 elsif ($line =~ /^From: (.*)$/i) { $from = $1; }
                        }
             # encode HTML codes
             encode_entities($subject);
             encode_entities($from);

             my %spam = ('subject' => $subject, 'from' => $from);
             $spams{$currentuser}[$count] = \%spam;
             $count++;

            flock(SP,LOCK_UN);
            close(SP);
         }
     }
}

# generate the spamreport now

open(TPL,"/var/qmail/bin/helpscripts/spamreport.tpl");
my @a_tpl = <TPL>;
close(TPL);
my $tpl = join("",@a_tpl);

while (my ($user,$data) = each(%spams)) {
        (my $text = $tpl) =~ s/###EMAIL###/$user/;
        my $spam_text = '';
        for (my $i=0;$i<scalar @$data;$i++) {
             $spam_text.='<tr><td>'.@$data[$i]->{'from'}.'</td><td>'.@$data[$i]->{'subject'}.'</td></tr>';
        }
        $text =~ s/###SPAMTEXT###/$spam_text/;
        my %mail = ( To    => $user,
             From    => 'Spamreporter <spamreport@domain.de>',
             Message => $text,
             Subject => 'Spamreport',
             'Content-Type' => 'text/html; charset="utf8"'
        );

        send_mail('noreply@domain.de', $user, 'noreply@domain.de',  'Spamreport fuer '.$user, $text);

}



sub send_mail {
local *SENDMAIL;
my $ok='';
my $SENDMAIL='';

my $returnadresse=shift;
my $to=shift;
my $from=shift;
my $subject=shift;
my $mailtext=shift;

 #gültige Zeichen in Mailadressen sind:
 # a-z A-Z 0-9 _ \- \+ \* \$ \. \@
 # falls andere Zeichen auftreten -> STOPP
die ('wrong returnadresse') if ($returnadresse=~ /[^a-zA-Z0-9_\-\+\*\$\.\@]/);
die ('wrong to:') if ($to=~ /[^a-zA-Z0-9_\-\+\*\$\.\@]/);
die ('wrong from:') if ($from=~ /[^a-zA-Z0-9_\-\+\*\$\.\@]/);
die ('no mailtext') if ($mailtext eq '');
die ('no subject') if ($subject eq '');
die ('wrong subject') if ($subject=~ /[\n\0\t\r\0\|]/);
my @sendmails=(
'/usr/sbin/sendmail',
'/usr/bin/sendmail',
'/usr/lib/sendmail'
);
#prüfen, wo sendmail sich befindet
foreach (@sendmails){
if (open (SENDMAIL,"|$_ -t")){
$SENDMAIL=$_;
close SENDMAIL;
last;
}
}
die ('Can not find sendmail!!!') if ($SENDMAIL eq '');
open (SENDMAIL,"|$SENDMAIL -t -f $returnadresse") || die('can not open sendmail');
print SENDMAIL <<EOF;
To: $to
Subject: $subject
From: $from
Content-Type: text/html; charset="utf8"
Content-Transfer-Encoding: 8bit
$mailtext
EOF
close SENDMAIL;
}
 
Vielen Dank für die Mühe. Ich probiere hier schon wieder 2h rum und bekomms nicht zu laufen. Er hat irgendwie Probleme mit der Zeitselektion.

Fehlermeldung:

Use of uninitialized value in subtraction (-) at ./spamreport.pl line 28.

Dies entspricht:

if ($currenttime - $timestamp < $day) {

Hier wird ja nach den letzten 24h gefiltert. Ich bin nicht die hellste Leuchte, aber in diesem Syntax kann ich keinen Fehler entdecken. Hab auch schon alle möglichen Variationen durch.

Ich wäre dankbar wenn ich noch Tipps haben könnte, auch wenn wieder andere Ihre Freizeit für mein fehlendes KnowHow opfern müssen. Vielleicht kann ich ja irgendwann was zurückgeben.

DANKE
 
Hi,


ich denke mal, dass das Forum genau dafür da ist, in solchen Fällen zu helfen.


Der Fehler liegt meiner Meinung nach davor. Ich vermute bei dir ist $timestamp nicht gesetzt, was daran liegt, dass $1 nicht existiert, was wiederrum daran liegt, dass der reguläre Ausdruck keinen Kandidaten findet.

Lass dir am besten mal nach dem regulären Ausdruck $files[$i] =~ /\/(\d+)\./;
1. $files[$i] und
2. $1 ausgeben

Das machst du am Besten mit

Code:
print $files[$i]."    -     ".$1;


BTW: In Zeile 11 hast du in "my @file" domain1 und domain2 mit deinen namen ersetzt?


Gruß,
Dennis
 
Danke,

das Domain habe ich ersetzt. Das funktioniert soweit auch, da er im ersten Postfach anfängt zu suchen und dann einen Fehler bzgl. Rechte bringt. Dann kommt die Meldung mit Zeile 28.

Die ganze Geschichte mit Timestamp ist leider völlig neu.
ein

lpr $files[$i]." - ".$1;

bringt folgenden Fehler:

lpr: Fehler - Kann auf "[]. - ." nicht zugreifen - Datei oder Verzeichnis nicht gefunden

Komm hier nicht weiter, da ich leider nichtmal den Sinn des Befehls nachvollziehen kann.
 
Wie kommst du denn auf lpr??


Aber du hast doch deinen Fehler! Du musst gucken, warum der Fehler mit den Rechten kommt. Wenn er das Durchsuchen des Ordners abbricht, dann hast du keinen Rückgabewert von dem /bin/ls , d.h. nix lässt sich parsen.

Die Grundidee ist:

1. Listen aller Mails mit /bin/ls in den Mailordnern. Das landet dann in $files . Dort steht wegen der " - 1" Option alles untereinander (eine Spalte). Beachte, dass die Mails alle einen Zeitstempel im Dateinamen haben
2. Parsen jeder Zeile des $file-Array, d.h. jede Mail im Ordner: $files[$i] =~ /\/(\d+)\./ . Hier wird das Datum aus dem Dateinamen herausgeparst (Der Name jeder Mail beginnt mit dem Timestamp. Dieser geht bis zu dem ersten .
3. Vergleich ob eine Mail "neu" ist. Nur wenn sie neu ist, wird sie als neuer Spam gemeldet. Dazu dient die if-Abfrage.


Was ist das denn für eine Fehlermeldung mit Rechten? Für das /bin/ls muss schon ein Benutzer her, der in die Mailordner reingucken darf.


Dennis
 
Bzgl. Rechte habe ich spamreport.pl als root ausgeführt. Gut das habe ich mal schnell angepasst. Jetzt kommt folgender Fehler:

# ./spamreport.pl

/var/qmail/mailnames/*******/admin/Maildir/.Spam/cur/1216420799.M262906P24841V0000000000000908I000000000F091EAF_0.s15213398,S=2133:2,S: line 1: From: command not found
/var/qmail/mailnames/*******/admin/Maildir/.Spam/cur/1216420799.M262906P24841V0000000000000908I000000000F091EAF_0.s15213398,S=2133:2,S: line 2: syntax error near unexpected token `newline'
/var/qmail/mailnames/*******/admin/Maildir/.Spam/cur/1216420799.M262906P24841V0000000000000908I000000000F091EAF_0.s15213398,S=2133:2,S: line 2: `Return-Path: <rereknit1981@dundeerealty.com>'
Use of uninitialized value in subtraction (-) at ./spamreport.pl line 28.
Use of uninitialized value in subtraction (-) at ./spamreport.pl line 28.
Use of uninitialized value in subtraction (-) at ./spamreport.pl line 28.
Use of uninitialized value in subtraction (-) at ./spamreport.pl line 28.
Use of uninitialized value in subtraction (-) at ./spamreport.pl line 28.
Use of uninitialized value in subtraction (-) at ./spamreport.pl line 28.
Use of uninitialized value in subtraction (-) at ./spamreport.pl line 28.
Use of uninitialized value in subtraction (-) at ./spamreport.pl line 28.
Use of uninitialized value in subtraction (-) at ./spamreport.pl line 28.
Use of uninitialized value in subtraction (-) at ./spamreport.pl line 28.
Use of uninitialized value in subtraction (-) at ./spamreport.pl line 28.
 
ähm.... der scheint die Mail als Perl-Skript parsen zu wollen??

Probier mal "perl spamreport.pl" statt ./spamreport.pl . Bin mir zwar nicht sicher, ob dies einen Unterschied macht, aber bei Perl weiß man nie :)
 
Dann bin ich im Moment etwas ratlos.

Poste am besten mal dein komplettes Skript, wie es im Moment ist (mit nur den nötigsten Anonymisierungen). Dann kann ich mal gucken, ob ich das bei mir irgendwie nachvollziehen kann.
 
Als Anlage füge ich das in meinem ursprünglichen Posting verlinkte Script zur Erstellung eines Spamreports bei, das auf rootservices.de veröffentlicht war. Es läuft bei mir problemlos.
 

Attachments

Last edited by a moderator:
Hallo,

wollte nur 2 Anmerkungen zu den Fehlern oben los werden.

Can't locate Mail/Sendmail.pm

Sendmail.pm ist ein perl modul, das ich bei meinem DebianSystem in /usr/share/perl5/Mail/ abgelegt habe.
Dann findet er dieses Modul, welches genutzt wird um die Mail zusammen zu setzen und dann abzuschicken. AFAIK.

Die Imap Courier Settings zum löschen werden nur ausgeführt, wenn man sich bei den Imap-Postfächer einloggt. AFAIK
.

Mich interressiert dieses "SPAM-Report per Email" auch sehr. Ich werde demnächst mal versuchen, das Skript bei mir zum laufen zu bekommen. Melde mich bestimmt nochmal.

gruß
stevie
 
Hallo,

wollte mal einen Status abgeben. Das Skript hab ich zum laufen bekommen.
Ich muss das Skript nun anpassen.
Ich lasse alle Spammails per EMail-Forward an ein virtuelles Postfach weiterleiten. Nun stimmt im Skript also die Empfänger Adresse nicht.
Ich werde veruschen die per Parameterübergabe mit angeben, so dass es an den richtigen EMpfänger geschickt wird. (Ich hoffe das ich nicht zu lange brauche, meine Perl Kenntnisse sind begrenzt)

Wenn interesse besteht, kann ich das vollendete Skript hier posten.

Gruß
stevie
 
Als Anlage füge ich das in meinem ursprünglichen Posting verlinkte Script zur Erstellung eines Spamreports bei, das auf rootservices.de veröffentlicht war. Es läuft bei mir problemlos.

Ich habe mir das mal angeschaut, doch um es richtig ans laufen zu bekommen
brauche ich noch etwas mehr input.

Was sind denn die Variablen
$mailhost und $maildomain

$maildomain ist denke ich die "domain.de"
aber

$mailhost = ???

Kann mir da jemand weiterhelfen...THX
 
Hallo,

ich habe dieses Script hier übernommen und bekomme nun folgende Ausgabe, wenn ich es ausführe:
Code:
Bareword found where operator expected at /root/spamreport.pl line 126, near "Subject"
	(Missing operator before Subject?)
Bareword found where operator expected at /root/spamreport.pl line 127, near "From"
	(Missing operator before From?)
Bareword found where operator expected at /root/spamreport.pl line 128, near "Content"
	(Missing operator before Content?)
Bareword found where operator expected at /root/spamreport.pl line 129, at end of line
	(Missing semicolon on previous line?)
Bareword found where operator expected at /root/spamreport.pl line 129, near "8bit"
	(Missing operator before bit?)
syntax error at /root/spamreport.pl line 126, near "Subject"
syntax error at /root/spamreport.pl line 129, next token ???
Unmatched right curly bracket at /root/spamreport.pl line 133, at end of line
syntax error at /root/spamreport.pl line 133, next char }
Execution of /root/spamreport.pl aborted due to compilation errors.

Kann mir da jemand einen Tipp geben?

Habe nun einige Sachen verändert und nun erscheint folgende Meldung:
Use of uninitialized value $timestamp in subtraction (-) at /root/spamreport.pl line 26.
 
Last edited by a moderator:
Das unitialized value ist erstmal nur eine Warnung. Das eigentliche Problem dürfte sich in Zeile 126 bzw. davor finden. Mit Sicherheit gibt es da einen Syntaxfehler, der zu der Kette an Fehlern führt. Meistens ein vergessenes Semikolon, fehlende schließende Klammer oder auch ein fehlendes schließendes " etc. ...
 
Back
Top