#!/usr/bin/perl -w
######################################################################
# (c) Michael Schilli 1999
######################################################################

use Net::POP3;                      # Mail-Abfrage-Handler
use Fcntl qw/:flock/;               # LOCK_EX definieren

my $efile = '/usr/data/email.dat';  # Datei mit Adressen

my $activ = 0;                      # Statistik

$host   = 'localhost';              # Mail-Host
$userid = 'register';               # Registrierungs-Mail-
                                    # Account
$passwd = 'topsecret!';             # Paßwort

$verbose = 0;                       # Gesprächig?
@ARGV = grep { !(/^-v$/ && ($verbose = 1)) } @ARGV;

                                    # Mail lesen
($mail = Net::POP3->new($host)) || 
                                die "Could not open $host";

$nof_messages = $mail->login($userid, $passwd);
die "Userid/Passwd Error" unless defined $nof_messages;

if($nof_messages) {               # Liegen Nachrichten vor?
                                  # Für alle Nachrichten
    foreach $mesgno (keys %{$mail->list()}) {
                            # Alle Header-Felder abklappern
        foreach (@{$mail->top($mesgno)}) {
            $key = $1 if          # Key im Betreff-Feld
           /Subject: Re: Ihre Registrierung \(Key: (.*)\)/;
            $from = $1 if(/From: (.*)/);  # Absender finden
        }

        activate_entry($from, $key) &&    # Aktivieren
            $mail->delete($mesgno) &&     # Mail löschen
            $activ++;                     # Statistik
    }
}

$mail->quit();                     # Mailprogramm verlassen
print "Mailbox: $nof_messages Activated: $activ\n" if $verbose;


###############################################################
sub activate_entry {          # Ausgewählten Eintrag aktivieren
###############################################################
    my ($from, $key) = @_;   # Absender, Schlüssel 

    open(FILE, "+<$efile") || die "Cannot open $efile";

    flock(FILE, LOCK_EX);    # Gegen parallele Zugriffe sichern
    seek(FILE, 0, 0);        # An den Dateianfang manövrieren

    while(<FILE>) {          # Absender suchen
        ($cfrom, $ckey) = /(.*) (\S+)$/;
                             # Email und Key müssen stimmen
        if(index($from, $cfrom) && $ckey eq $key) {
            $len = length($ckey);
            seek FILE, -$len-1, 1; # Keylänge zurückmanövrieren
            printf FILE "%${len}s", "OK";  # Key mit OK 
                                           # überschreiben
            print "Activated $cfrom\n" if $verbose;
            close(FILE);
            return(1);       # Aktiviert
        }
    }
    close(FILE);
    return 0;                      # Eintrag nicht gefunden
}
