#!/usr/bin/perl # remailer.cgi - web-to-email gateway with many possible recipients, # based on "roles" defined in a text file # copyright (c) 2002 Prescient Code Solutions. All rights reserved. # Please do not redistribute without permission. #use strict; require 'cgi-lib.pl'; # configuration my $formfile = 'feedback.html'; my $outputURL = 'http://flgbtqc.quaker.org/thanks.html'; my $roleDB = 'email-roles.txt'; my $sendmail = '/usr/sbin/sendmail'; my $debug = 0; print &header if $debug; sub error { my $message = shift; print &header; print "Error: $message"; exit; } # three lazy fixes for CGI.pm -> cgi-lib sub header { &PrintHeader; } sub param { my $var = shift; return $in{$var}; } sub referer { return $ENV{'HTTP_REFERER'}; } sub remote_host { return $ENV{'REMOTE_HOST'} || lookup($ENV{'REMOTE_ADDR'}) || 'localhost'; } sub lookup { my $ip = shift; return $ip unless $ip=~/\d+\.\d+\.\d+\.\d+/; return $CACHE{$ip} if exists $CACHE{$ip}; my @h = eval <<'END'; alarm(TIMEOUT); my @i = gethostbyaddr(pack('C4',split('\.',$ip)),2); alarm(0); @i; END $CACHE{$ip} = $h[0]; return $CACHE{$ip} || $ip; } sub redirect { my $url = shift; return "Status: 302 Moved\nLocation: $url$pic\n\n"; } &error("Can't find your sendmail: $sendmail") unless (-f $sendmail); &error("Can't execute your sendmail: $sendmail") unless (-e $sendmail); # parse role file into $role{$rolename} and @rolelist # file has format: open(FILE, "<$roleDB") or &error("Couldn't read role file '$roleDB'"); my @roles = ; my %role; my @rolelist; my $line; foreach $line (@roles) { next if (($line =~ /^\s*\#/) or ($line =~ /^\s*$/)); chomp $line; $line =~ s/^(\s+)//; # strip leading space my ($rolename, $rolevalue) = split /\s+/, $line, 2; unless ($rolename =~ /^\w+$/) { &error("Role name '$rolename' is invalid in file '$roleDB'"); } unless ($rolevalue =~ /\w+@\w*/) { &error("Role value '$rolevalue' for role '$rolename' isn't an email address."); } push @rolelist, $rolename; $role{$rolename} = $rolevalue; print "$rolename = $rolevalue\n" if ($debug); } my %in; &ReadParse; unless (param('role') && param('message')) { # parse feedback-form, replace two tags (REFERER and ROLE) # print feedback-form and exit. open(FORMFILE, "<$formfile") or &error("Couldn't read feedback-form '$formfile'"); my $formcontents; { local $/=undef; $formcontents = ; } my $referer = referer() || 'Unknown'; $formcontents =~ s///; my $selected = param('role') || ""; my $rolehtml; foreach $line (@rolelist) { $rolehtml .= "||; print header(); print $formcontents; exit; } # feedback form has been submitted, because 'message' and 'role' are filled in. # process contents, send email, and redirect browser to $outputURL; &error("No role specified in inputs") unless (param('role')); &error("Invalid role specified: ".param('role')) unless ($role{param('role')}); &error("No sender specified in inputs") unless (param('sender')); &error("Your email address '".param('sender')."' seems to be invalid") unless param('sender') =~ /^.+@\w+.\w+/; &error("Your message appears to be blank.") unless (param('message')); my $rolename = param('role'); my $roleaddress = $role{$rolename}; my $sender = param('sender'); my $sendername = param('sendername'); my $subject = param('subject') || 'No Subject Specified'; my $message = param('message'); my $url = param('url') || 'Unknown'; my $host = remote_host() || 'Unknown'; my $cc; # if $roleaddress has more than one address, mangle to turn , into >,< $roleaddress=~ s/,\s*/>, $cc From: $sendername <$sender> Subject: FLGBTQC Website: $subject $message ----------------------------------------------------- The above message was sent by the FLGBTQC website. 'To:' is the intended recipient named on the website; 'From:' (and 'Cc:' if it exists) were supplied by the person filling in the form. Webpage: $url Sender's IP: $host "; my $mailexec = "$sendmail -f$sender -t"; open(MAIL,"|$mailexec") || &error("Couldn't open mail program using '$mailexec'"); print MAIL $email; #print &header . $email; print redirect($outputURL);