1 2 3 4 5 6 7 8 9
my $query = CGI->new; my @form_fields = qw/Name Vorname Feld1 sid/; # bestimmte Felder löschen foreach my $f (@form_fields) { $query->delete($f); } # VORSICHT!!! Oder alle CGI-Parameter (!!!!) löschen #$query->delete_all();
1
2
3
4
5
6
7
if (defined $query->param('Abschicken'){
open(MAIL, "|/usr/lib/sendmail -t -f info\@beispiel.de") || print STDERR "Mailprogramm konnte nicht gestartet werden\n";
print MAIL "To: $mailto\n", "Subject: Newsletter\n\n";
print MAIL "Hallo $derName, Du blabla";
close(MAIL);
$query->delete_all();
};
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
use CGI; my $query = CGI->new; my $z=''; print $query->header; if ($query->param('test') eq 'ok') { my @form_fields = qw/test test2/; # bestimmte Felder löschen foreach my $f (@form_fields) { $query->delete($f); } # VORSICHT!!! Oder alle CGI-Parameter (!!!!) löschen # $query->delete_all(); $z='OK!'; } print $query->start_form, $query->p('Eingabe von ok im ersten Feld bewirkt löschen! der Parameter'), $query->textfield(-name=>'test'), $z, $query->textfield(-name=>'test2'), $query->submit, $query->end_form;
2011-05-30T07:34:20 Olliwenn der User noch munter auf dem Submit-Button rumgeklickt hätte, daß dann nicht dementsprechend viele Mails raus gegangen wären (Weil durch Code leere Felder das verhindert hätten).
2011-05-30T09:00:05 rostidas Vermeiden von Mehrfachklicks mache ich so: Jedes Formular bekommt eine eindeutige ID, sofern es ohnehin eine Session gibt, wird diese ID genommen. Die ID schreibe ich in eine Lock-Datei mit Zeitstempel. Bei einem Submit wird einmal der Zeitstempel geprüft (für anderweitige Verwendung) und die ID aus der Lock-Datei gelöscht. Erst, wenn ein neues Formular erzeugt wurde, gibt es eine neue ID in der Lock-Datei womit ein Submit wieder möglich wird.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
#!/usr/bin/perl use strict; use warnings; use CGI; my $q = CGI->new; my $firmen_mail = 'info@example.org'; # eigene Mailadresse my $name = $q->param('name') || ''; my $email = $q->param('mail') || ''; my $anfrage = $q->param('anfrage') || ''; my $mail_sent = 0; # Flag, ob Mail gesendet wurde # ab hier Parameter auf Gültigkeit prüfen my $fehlermeldung = ''; my $parameter_fehler = 0; # # ungetester Regex! # besser Mailadressen mit Modul Email::Valid testen! if ( $email !~ /[a-zA-Z0-9][a-zA-Z0-9_.-]+\@[a-zA-Z0-9_.-]+(\.[a-zA-Z]+)/ ) { $parameter_fehler = 1; $fehlermeldung = 'E-Mail falsch eingegeben'; } # # sendmail und Parameter my $sendmail = "> mailout.txt"; # Ausgabe an Datei nur für lokales Testen!!!! #my $sendmail = "| /usr/lib/sendmail -t -oi"; if ( !$parameter_fehler && $name && $email && $anfrage ) { # Formular wurde abgesendet if ( open( my $sm, $sendmail ) ) { # sensmail öffnen $email =~ s/[\r\n]//g; print $sm <<MAIL; # Mail-Header und -Body senden From: $name <$email> To: Informationszentrale <$firmen_mail> Subject: Ihre Anfrage $anfrage MAIL close($sm) && $mail_sent++; # sendmail schließen und Flag für gesendet setzen $q->delete_all(); # alle CGI-Parameter löschen } } print $q->header; print $q->start_html( -title => 'Anfrage' ); if ( not $mail_sent ) { print $q->p( "Fehleingabe: ", $q->b( $fehlermeldung ) ) if length $fehlermeldung; print $q->start_form, $q->p( "Name : ", $q->textfield( -name => 'name' ) ), $q->p( "E-Mail : ", $q->textfield( -name => 'mail' ) ), $q->p( "Anfrage: ", $q->textarea( -name => 'anfrage' ) ), $q->submit, $q->end_form; } else { print $q->p( [ "Danke für Ihre Anfrage.", "Wir werden Sie demnächst kontaktieren." ] ); } print $q->end_html;
1 2
close($sm) && $mail_sent++; # sendmail schließen und Flag für gesendet setzen
1 2 3 4 5 6 7
if ( close($sm) ) { # sendmail schließen $mail_sent++ # Flag für gesendet setzen } else { $fehlermeldung = 'Mail konnte nicht gesendet werden!'; warn "Problem with sendmail: $!"; }