#!/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;