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

use CGI qw/:standard :html3/;      # Standard-CGI-Funktionen
use Fcntl qw/:flock/;              # LOCK_EX etc. definieren
use Mail::Send;                    # Mail-Funktionen

my $efile = '/usr/data/email.dat'; # Datei mit Adressen
                                   # Email des 
                                   # Registrierungssystems
my $regsystem_email = 'register@registration.com';


if(! defined param('email')) {     # Keine Email eingetragen
                                   # (erster Aufruf?) => 
                                   # Einführungsseite
    print_form("Bitte tragen Sie Ihre Email-Adresse ein.");

} elsif (param('email') =~ /\S\@.+?\..+/) {

                                   # Eindeutige ID erzeugen
    $id = unpack ('H*', pack('Nc', time, $$ % 0xff));

                                   # Abspeichern, Kontroll-Mail
    if(register_email(param('email'), $efile, $id)) {
        print_form("Registrierung entgegengenommen. Bitte " .
                   "warten Sie auf eintreffende Mail und " .
                   "beantworten Sie diese, um Ihre " .
                   "Anmeldung zu bestätigen.");
        send_mail(param('email'), $id, $regsystem_email);
    } else {
        print_form("Fehler: $ERROR");
    }

} else {                           # Unsinn eingetragen, mit 
                                   # Fehlermeldung wiederholen.
    print_form("Ungültige Email-Adresse - bitte nochmal.");
}

###############################################################
sub print_form {        # Formular mit Nachrichtentext ausgeben
###############################################################
    my ($message) = @_;

    print header,
          start_html('-title' => "Registration"),
          h2($message), start_form(), 
          table(TR(td("Email:"),
                   td(textfield(-name => 'email', 
                            -value => (param('email') || ""))),
                   td(submit(-value => "Registrieren")))),
          end_form();
}

###############################################################
sub register_email {               # Email in Datei aufnehmen
###############################################################
    my ($email, $filename, $id) = @_;
                                   # Datei erzeugen, falls noch 
                                   # nicht vorhanden
    do {open(FILE, ">$efile"); close(FILE)} unless -f $efile;

    if(!open(FILE, "+<$efile")) {  # Read/Write öffnen.
        $ERROR = "$efile nicht zu öffnen (Interner Fehler)."; 
        return 0;
    }

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

    while(<FILE>) {           # Nach neuer Email durchsuchen
        chomp;                # Newline abscheiden
        if($_ eq $email) {
            $ERROR = "Sie sind bereits registriert."; 
            close(FILE);
            return 0;
        }
    }
        
    seek(FILE, 0, 2);         # Email am Dateiende anhängen
    print FILE "$email $id\n";
    close(FILE);
    return 1;
}

###############################################################
sub send_mail {
###############################################################
    my ($to, $key, $from) = @_;

    my $mail=Mail::Send->new(              # Neues Mail-Objekt 
         Subject => "Ihre Registrierung (Key: $key)", # Betreff
         To      => $to);                  # Empfänger
 
    $mail->set("From", $from);             # Absender
    $mail->set("Reply-To", $from);         # Rückadresse
    
    $mailhandle = $mail->open("sendmail"); # Mail-Programm 
                                           # starten
    print $mailhandle <<EOT;               # Text erstellen
      Lieber $to,

      um Ihre Registrierung zu bestätigen, senden Sie diese
      Mail einfach an den Absender zurück, indem Sie die Reply-
      Funktion ihres Mail-Programms nutzen. Danke!
      Virtuell herzlichst, Ihre Email-Registratur
EOT
                             
    $mailhandle->close();  # Schließen und senden
}
