#!/usr/bin/perl use CGI; use MIME::Lite; my $cgi = new CGI(); my $vals = {}; for ($cgi->param()) { $vals->{$_} = $cgi->param($_); } my $submitted = $vals->{'submit'}; my $r; $r = read_template_list($vals); if( $submitted ) { unless( $vals->{'name'} ) { $vals->{'error'} .= '
  • Please add your name
  • '; } # if( $vals->{'respond'} eq 'on' && !$vals->{'email'} ) { unless( $vals->{'email'} ) { $vals->{'error'} .= '
  • Please add an email address where we can reach you.
  • '; } if( !$vals->{'tmpl'} || $vals->{'tmpl'} =~ /[^a-zA-Z0-9]/ || !$r->{'file'}) { $vals->{'error'} .= "
  • Configuration error
  • "; $vals->{'fatal'} = 1; } if( $vals->{'error'} ) { output_form( $cgi, $vals, $r ); } else { if( send_mail( $vals, $r ) ) { output_thank_you( $cgi, $r ); } else { output_lots_of_nothing($cgi, $r); } } } else { output_form($cgi, $vals, $r); } sub read_template_list { my ($v) = @_; my $res = {}; open(IN, ") { my ($template, $file, $thanks, @recipients) = split; if( $template eq $v->{tmpl} ) { $res->{file} = $file; $res->{recipients} = \@recipients; $res->{thanks} = $thanks; last; } } close(IN); return $res; } sub output_form { my ($cgi, $v, $r) = @_; local *IN; if( $v->{fatal} ) { $cgi->header('text/html'); print <<"__END_FORM__"; There were errors while processing your request: Please use your browser back button to retry. __END_FORM__ return; } open(IN, "<$r->{file}"); my $out = ''; my $errstr = "Errors occurred while processing your request: \n"; while() { s//$errstr/ if $v->{error}; foreach my $tag (qw(name email comments)) { s/\@\@$tag\@\@/$v->{$tag}/g; } $out .= $_; } print $cgi->header('text/html'); print $out; return; } sub send_mail { my ($v, $r) = @_; open(LOG, ">>/tmp/emails-log"); print LOG "-----------\n"; print LOG scalar(localtime(time)), "\n"; foreach my $key (keys %ENV) { print LOG "$key: $ENV{$key}\n"; } # Spam. I don't know why they like to do this. It's so stupid. if ( $v->{comments} =~ /.*<\/a>/ || $v->{email} =~ /#EMAIL/ ) { print LOG "Input: $v->{comments}\n"; print LOG "Email: $v->{name} / $v->{email}\n"; print LOG "NOT SENT! SPAM SPAM SPAM SPAM SPAM\n"; print LOG "-----------\n"; close(LOG); return 0; } my $m = new MIME::Lite( From => $v->{'email'} || 'anonymous', To => join("," => @{ $r->{'recipients'} }), Subject => "[Web Form Submission: @{[$v->{'respond'} ? 'please respond' : 'dont respond']}]", Data => "Name: $v->{name}\nEmail: $v->{email}\n\nComments\n----\n$v->{comments}\n----\n", ); print LOG $m->as_string, "\n"; print LOG "-----------\n"; close(LOG); open(QMAIL, "|/var/qmail/bin/qmail-inject") or die("Could not open qmail.\n"); print QMAIL $m->as_string(); close(QMAIL); return 1; } sub output_thank_you { my ($cgi, $r) = @_; print $cgi->header('text/html'); open(IN, "<$r->{thanks}"); while() { print; } } sub output_lots_of_nothing { my ($cgi, $r) = @_; print "Content-type: text/html\n\n"; for(my $ii = 0; $ii < 1_000_000; ++$ii) { print "\x00" x 80; } } 1;