Zobelei-Homepage

Zähler

Das Zobel'sche Netz

Familie Theologie Computer Freizeiten Wetter Info

Temperatur in Dohna: Stand: 05.Dec 14
Außen:  Ausgefallen °C -  Eiskalt  ( Uhr)
Innen:  Ausgefallen °C -  Eiskalt  ( Uhr)
ServerCPU:  29.38 °C -  Sehr warm  (17:53:46 Uhr)
 

 

Bitte wählen:

Überblick

Windows

Gemeindeverzeichnis1,2

SyncFlo1

Linux

Existenztester

POP3-Aufräumen

1 unvollendet

2 z.Zt. auf Eis

POP3-Postfachwächter

Dieses Skript hilft, ein Postfach aufgeräumt zu halten. Ich starte es jede Nacht automatisch an, um mit meinem entfernten POP3-Server Kontakt aufzunehmen und die E-Mails dort zu Sortieren. Abhängig vom Eingangsdatum (EMail 1a - Monate Haltezeit, EMail 1b - Tage Haltezeit) oder vom Füllstand des Postfaches (EMail 2) werden diese dann gelöscht.

Technische Daten

E-Mail 1a und b E-Mail 2
Besonderheit E-Mails werden nach dem Datum sortiert, und die Mails, die ein bestimmtes Datum überschritten haben, werden gelöscht. In der Version a kann man die Monate einstellen, die eine E-Mail aufbewahrt wird, in der Version b sind es Tage. In der Version 1.1 wurde durch scan auch der August-Bug behoben ("08 is not octal"-Fehler). Die E-Mails werden auch hier nach Datum sortiert, doch es werden solange die ältesten E-Mails gelöscht, bis ein Postfach wieder so leer ist, wie man es wünscht. Dazu wird einerseits nur der Überwachungsalgorithmus ausgeführt, wenn das Postfach eine bestimmte Größe meldet. Um nicht alle E-Mail-Header erneut zu laden, wird eine Liste auf dem Rechner gespeichert, die nur aktualisiert wird.
Vorgaben Das Skript muß ausführbar sein, und der Benutzer muß telnet ausführen dürfen.
Größe 2.802 Bytes 5.606 Bytes
Sprache #!/bin/expect, eine TCL-Erweiterung.
Installation Anpassungen im Quelltext, z.B. den Logindaten (die auch in das E-Mail-Programm gehören), sowie eine Anpassung der Serverantwort (einfach "telnet meinserver.de pop3" eingeben und Antwort erwarten. Ein Teil des Antworttextes reicht. Dann durch Cron anstarten, z.B. jede Nacht um 3 Uhr, wenn wenig Datenverkehr ist. Alle Einstellungen werden oberhalb der Zeile "# Nichts mehr zu ändern" gemacht!
Umgebung Das Programm läuft bei mir auf einem Pentium 233 mit 128 MB RAM problemlos.

E-Mail 1a: Abhängig vom Eingangsdatum (Monate) löschen

Diese Variante ist insofern einfach, da sie alle E-Mail-Header nach dem Datum durchsucht, und alte Mails entsprechend löscht.

#!/usr/bin/expect -f

# Löschen von E-Mails in einem POP3-Faches
# anhand des Alters in Monaten der E-Mails

# Version 1.1 Dirk Zobel

# ein Monat Haltezeit, Haltezeit = 0 bedeutet 1 Tag
set haltezeit 1
# Server
set popserver "*****.de"
# Antwortestring beim Einloggen
set popantwort "@enterprise.ecore.net>\r"
# Username
set user "*****@*******.de"
# Passwort
set pass "******"
# Logdatei
set logdatei "/var/log/exim/aufrauemer.log"

# Nichts mehr zu aendern nach dieser Zeile
# Variablen einstellen
set log [open $logdatei a]
set monate "null Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec"
set jtag [timestamp -format "%d"]
scan $jtag %d jtag
set atag [expr $jtag-1]
set jjahr [timestamp -format "%Y"]
scan $jjahr %d jjahr
set ajahr $jjahr
set jmonat [timestamp -format "%m"]
scan $jmonat %d jmonat
set amonat [expr $jmonat-$haltezeit]
while {$amonat < 1} {
                    set ajahr [expr $ajahr-1]
                    set amonat [expr $amonat+12]
                    }
puts $log [timestamp -format "%d.%m.%y %X +OK  Start Aufräumer $user nach $haltezeit Monaten"]

# Reden mit dem Server

spawn -noecho telnet $popserver pop3
match_max 100000
set timeout 10
expect {
        timeout {puts $log [timestamp -format "%d.%m.%y %X -ERR Kein Kontakt innerhalb 10 Sekunden"]
                 send "quit\r"
                 exit 0}
        $popantwort}
set timout 10
send -- "user $user\r"
expect {
        timeout {puts $log [timestamp -format "%d.%m.%y %X -ERR Keine Antwort nach Userabfrage innerhalb 10 Sekunden"]
                send "quit\r"
                exit 0}
        "+OK \r"}
send -- "pass $pass\r"
expect {
        timeout {puts $log [timestamp -format "%d.%m.%y %X -ERR Keine Antwort nach Passwortangabe innerhalb 10 Sekunden"]
                send "quit\r"
                exit 0}
        "+OK \r"}
send -- "stat\r"
set timeout 30
expect  {
        timeout {puts $log [timestamp -format "%d.%m.%y %X -ERR Keine Statistik innerhalb 30 Sekunden"]
                send "quit\r"
                exit 0}
        "+OK * *\r"}
set status [split [lindex [split $expect_out(buffer) \n] 2]  ]
set groesse [lindex $status 2]
set anzahl [lindex $status 1]
set geloescht 0

# Bearbeiten der E-Mails
for {set nr 1} {$nr <= $anzahl} {incr nr} {
puts $nr
send "TOP $nr 0\r"
expect -indices "Date: *\r"
set datum [split [lindex [split $expect_out(0,string) \n] 0]  ]
# 2 - Tag 3-Monat 4-Jahr
if {[lindex $datum 4] <= $ajahr} {
  if {[lsearch $monate [lindex $datum 3]] <= $amonat} {
     if {[lindex $datum 2] <= $atag} {
        send "dele $nr\r"
        expect "+OK\r"
        incr geloescht
        }
     }
  }
}

# Session beenden
send "quit\r"
expect "closed"
puts $log [timestamp -format "%d.%m.%y %X +OK  Anzahl E-Mails: $anzahl"]
puts $log [timestamp -format "%d.%m.%y %X +OK  davon gelöscht: $geloescht"]
puts $log [timestamp -format "%d.%m.%y %X +OK  Größe Postfach: $groesse"]

E-Mail 1b: Abhängig vom Eingangsdatum (Tage) löschen

Auch diese Variante ist einfach, nur das sie das Löschdatum anders berechnet. Bitte am Ende um den entsprechenden Teil von oben ergänzen.

#!/usr/bin/expect -f

# Löschen von E-Mails in einem POP3-Faches
# anhand des Alters in Tagen der E-Mails

# Version 1.1 Dirk Zobel

# Tage Haltezeit, Haltezeit = 0 bedeutet 1 Tag, hier 21 Tage eingestellt
set haltezeit 21
# Server
set popserver "*****.de"
# Antwortestring beim Einloggen
set popantwort "@enterprise.ecore.net>\r"
# Username
set user "*****@*******.de"
# Passwort
set pass "******"
# Logdatei
set logdatei "/var/log/exim/aufrauemer.log"

# Nichts mehr zu ändern
# Variablen einstellen
set log [open $logdatei a]
set monate "null Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec"
set tage "0 31 26 31 30 31 31 30 31 30 31 30 31"
set jjahr [timestamp -format "%Y"]
scan $jjahr %d jjahr
set ajahr $jjahr
set jmonat [timestamp -format "%m"]
scan $jmonat %d jmonat
set amonat $jmonat
set jtag [timestamp -format "%d"]
scan $jtag %d jtag
set atag [expr $jtag-1]
set atag [expr $atag-$haltezeit]
while {$atag < 1} {
  set amonat [expr $amonat-1]
  if {$amonat < 1} {
     set ajahr [expr $ajahr-1]
     set amonat [expr $amonat+12]
     }
  set atag [expr $atag+[lindex $tage $amonat]]
}
puts $log [timestamp -format "%d.%m.%y %X +OK  Start Aufräumer $user fuer $haltezeit Tage"]
puts $log "                  +OK  Verfallsdatum: $atag.$amonat.$ajahr"

# Reden mit dem Server
Nun geht es weiter wie oben unter EMail 1a...

E-Mail 2: Abhängig von Postfachgröße löschen

Diese Variante speichert zusätzlich die Mailgröße jeder Mail im Postfach auf der Festplatte ab, um einen schnelleren Zugriff zu gewährleisten.

#!/usr/bin/expect -f

# Loeschen von E-Mails in einem POP3-Postfach
# wenn eine maximale Größe der Box erreicht ist.
# Damit nicht täglich gelöscht wird, kann eine Schwelle eingegeben werden.
# Dadurch wird beim Löschen gleich etwas mehr gelöscht (wie unter Schwelle angegeben),
# damit Platz für neue Mails ist.
#
# Die E-Mails werden nach dem Alter sortiert gelöscht => Ältere werden zuerst gelöscht.
#
# Beispielsweise: groessemax 30000000, schwelle 5000000
# Inhalt: 24000000 => Es wird nicht gelöscht (<30M)
#         27000000 => Es wird nicht gelöscht (<30M)
#         31000000 => Es wird bis <25000000 gelöscht (30M-5M)

# Version 1.0 Dirk Zobel

# Maximale Größe Mailbox in oects (z.B. bei 40 MB Platz auf 30 MB halten)
set groessemax 500000
# Wenn zu löschen: Wieviel mehr (z.B. wenn 30 MB erreicht, dann auf 25 MB löschen)
set schwelle 100000
# Server 
set popserver "******.de"
# Antwortestring beim Einloggen
set popantwort "@enterprise.ecore.net>\r"
# Username
set user "****@*****.de"
# Passwort
set pass "*****"
# Logdatei
set logdatei "/var/log/exim/aufrauemer.log"
# Arbeitsdatei, speichern muß möglich sein
set speicherdatei "/var/spool/inet/$user.emails"

# Nichts mehr zu ändern nach dieser Zeile

# Variablen einstellen
set log [open $logdatei a]
set monate "null Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec"
puts $log [timestamp -format "%d.%m.%y %X +OK  Start Aufräumer"]

# Reden mit dem Server

spawn -noecho telnet $popserver pop3
match_max 100000
set timeout 10
expect {
        timeout {puts $log [timestamp -format "%d.%m.%y %X -ERR Kein Kontakt innerhalb 10 Sekunden"]
                send "quit\r"
                exit 0}
        $popantwort}
set timout 10
send -- "user $user\r"
expect {
        timeout {puts $log [timestamp -format "%d.%m.%y %X -ERR Keine Antwort nach Userabfrage innerhalb 10 Sekunden"]
                send "quit\r"
                exit 0}
        "+OK \r"}
send -- "pass $pass\r"
expect {
        timeout {puts $log [timestamp -format "%d.%m.%y %X -ERR Keine Antwort nach Passwortangabe innerhalb 10 Sekunden"]
                send "quit\r"
                exit 0}
        "+OK \r"}
send -- "stat\r"
set timeout 30
expect  {
        timeout {puts $log [timestamp -format "%d.%m.%y %X -ERR Keine Statistik innerhalb 30 Sekunden"]
                send "quit\r"
                exit 0}
        "+OK * *\r"}
set status [split [lindex [split $expect_out(buffer) \n] 2]  ]
set groesse [lindex $status 2]
set anzahl [lindex $status 1]
set geloescht 0

# Überprüfung, ob Mailbox über Maximalgröße
# Wenn nein, wird nichts gemacht.
# Wenn ja, dann geht es hier rund.
if {$groessemax < $groesse} {

# Variablen setzen
set loesche [expr $groessemax - $schwelle]
if {$loesche < 1} {
   puts $log [timestamp -format "%d.%m.%y %X -ERR Zielvorgabe zum Löschen liegt unter Null"]
   set loesche 1
   }

# Datei einlesen
if [catch {open $speicherdatei RDONLY} f] {
   puts $log [timestamp -format "%d.%m.%y %X -ERR $f"]
   set email [list "000000000na"]
   # Abbruch ist nicht nötig, denn nun wird die Datei einfach neu erstellt.
   } else {
   set email [read -nonewline $f]
   close $f
   # Alle Nummern der E-Mails löschen
   set max [llength $email]
   for {set nr 0} {$nr < $max} {incr nr} {
      set zeile [lindex $email $nr]
      set zeile [lreplace $zeile 2 2 "na"]
      set email [lreplace $email $nr $nr $zeile]
      }
   }

# Liste aktualisieren

# Einzelne Einträge
for {set nr 1} {$nr <= $anzahl} {incr nr} {
send "UIDL $nr\r"
expect -indices "+OK * *\r"
set uidl [lindex [split $expect_out(0,string)  ] 2]
set eintrag [lsearch $email $uidl]
# 1. Bearbeitung: Eintrag nicht vorhanden: Anhängen
# 2. Eintrag vorhanden: Nummer setzen
if {$eintrag < 0} {
   send "TOP $nr 0\r"
   expect -indices "Date: *\r"
   set datum [split [lindex [split $expect_out(0,string) \n] 0]  ]
   # 2 - Tag 3-Monat 4-Jahr
   set post 0
   set Monat -1
   while {$Monat < 0} {
      incr post
      set Monat [lsearch $monate [lindex $datum $post]]
      if {$post>15} {set Monat 16}
      }
   if {$Monat < 16} {
      set Jahr [lindex $datum [expr $post +1]]
      if {[string length $Monat] < 2} {set Monat "0$Monat"}
      set Tag [lindex $datum [expr $post -1]]
      if {[string length $Tag] < 2} {set Tag "0$Tag"}
      set zeile "$Jahr$Monat$Tag"
      } else {
      set zeile [timestamp -format "%y%m%d"]
      }
   send "LIST $nr\r"
   expect -indices "+OK * *\r"
   set gros [lindex [split $expect_out(0,string)  ] 2]
   set zeile [list $zeile $uidl $nr $gros]
   lappend email $zeile
   } else {
   set zeile [lindex $email $eintrag]
   set email [lreplace $email $eintrag $eintrag [lreplace $zeile 2 2 $nr]]
   }
}

# Nicht mehr vorhandene E-Mails in Liste löschen
set zeile [lindex $email 0]
if {$zeile == "000000000na"} {set email [lreplace $email 0 0]}
set max [llength $email]
set nr 0
while {$nr < $max} {
   set zeile [lindex $email $nr]
   set eintrag [lindex $zeile 2]
   if {$eintrag == "na"} {
   set email [lreplace $email $nr $nr]
   incr max -1
   } else {
   incr nr
   }
}


# Liste sortieren
set email [lsort -increasing $email]

# Nacheinander die E-Mails löschen, bis loesche erreicht
while {$groesse > $loesche} {
set zeile [lindex $email 0]
set nr [lindex $zeile 2]
set aktuell [lindex $zeile 3]
set groesse [expr $groesse - $aktuell]
set loeschdatum [lindex $zeile 0]
set email [lreplace $email 0 0]
send "DELE $nr\r"
expect "+OK\r"
incr geloescht
}

# EMail-Datei speichern
set f [open $speicherdatei w]
puts $f $email
close $f

# Klammer umklammert Groessemax erreicht, wenn nicht: Keine Aktion

} else {
puts $log "                  +OK  Kein Aufräumen nötig"
}

# Session beenden
send "quit\r"
expect "closed"
puts $log "                       Anzahl E-Mails: $anzahl"
puts $log "                       davon gelöscht: $geloescht"
puts $log "                       Größe Postfach: $groesse"
puts $log [timestamp -format "%d.%m.%y %X +OK  Ende Aufräumer"]
close $log

Bei allen hier vorgestellten Programmen gilt der Haftungsausschluß, benutze es auf eigene Gefahr!