#!/usr/bin/perl -wT # # mailform.pl # Copyright (C) 1998-2002 Steven Pritchard (steve@silug.org) # Inspired by (and somewhat compatible with) mailback.pl by Phillip Moore # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # Documentation in pod format follows the script. # # $Id: mailform,v 1.3 2002/12/21 06:43:29 steve Exp $ use strict; use CGI; use Net::SMTP; # Replace with whatever mail server # you want this script to connect to my $mailserver="localhost"; my (%name,%address,$param); # Add valid addresses here. # This is the simple way to prevent being a spam gateway. my %valid=('to' => []); my $query=new CGI; # For compatibility with mailback.pl if (defined($query->param('mailitto'))) { $query->param(-name=>'to',-value=>$query->param('mailitto')); $query->delete('mailitto'); $query->param(-name=>'from',-value=>$query->param('mailfrom')); $query->delete('mailfrom'); } print $query->header; print $query->start_html(-title=>'Form Mail Results', -BGCOLOR=>'white'); # Verify from & to foreach $param ("from", "to") { if ($query->param($param) =~/^\s*(\S+.*?)?\s*<([\w\.\-\%]+\@\[?[A-Za-z0-9\-\.]+\]?)>\s*$/) { $name{$param}=$1; $address{$param}=$2; } elsif ($query->param($param) =~/^\s*([\w\.\-\%]+\@\[?[A-Za-z0-9\-\.]+\]?)\s*(\(\S+.*?\))?\s*$/) { $address{$param}=$1; $name{$param}=$2; $name{$param}=~s/^\((.*)\)$/$1/; } else { print "
\nPlease enter a valid $param email address.\n
\n"; print $query->end_html; exit 0; } if ($valid{$param} && !grep(/^$address{$param}$/, @{$valid{$param}})) { print "\nInvalid $param email address.\n
\n"; print $query->end_html; exit 0; } } # As a test, I used this script for a web email form thingy. # I'm leaving the relevant code here in the hopes that it # might be useful or of interest to someone. #my $body=$query->param('body'); #if (!$body) #{ # print "\nNot sending mail with empty body.\n
\n"; # print $query->end_html; # exit 0; #} my $subject=$query->param('subject'); #print "\nSending mail from \"$name{from}\" ($address{from}) to \"$name{to}\" ($address{to})...\n
\n"; my $smtp=Net::SMTP->new($mailserver); if (!$smtp) { print "\nFailed to send mail. Please try again later.\n
\n"; print $query->end_html; exit 0; } $smtp->mail($address{'from'}); $smtp->to($address{'to'}); $smtp->data(); $smtp->datasend("From: $name{from} <$address{from}>\n"); $smtp->datasend("To: $name{to} <$address{to}>\n"); $smtp->datasend("Subject: $subject\n"); $smtp->datasend("X-Originating-IP: $ENV{'REMOTE_ADDR'}\n"); $smtp->datasend("X-Mailform-URL: http://$ENV{'SERVER_NAME'}" . (($ENV{'SERVER_PORT'} != 80) ? ":$ENV{'SERVER_PORT'}" : "") . $ENV{'REQUEST_URI'} . ($ENV{'QUERY_STRING'} ? "?$ENV{'QUERY_STRING'}" : "") . "\n"); $smtp->datasend("X-HTTP-Referer: $ENV{'HTTP_REFERER'}\n") if (defined($ENV{'HTTP_REFERER'})); $smtp->datasend("\n"); foreach $param ($query->param) { if ($param!~/^(to|subject|sentmessage|return(url|graphic|message))$/o) { $smtp->datasend($param . " = " . $query->param($param) . "\n"); } } # Replace the previous foreach with the next line # to use this script for a web email form. #$smtp->datasend($body); $smtp->dataend(); $smtp->quit; # Output message if ($query->param('sentmessage')) { print "\n";
if (defined($query->param('returnurl')))
{
print "param('returnurl'), "\">\n";
}
if ($query->param('returngraphic'))
{
print "param('returngraphic'), "\">\n";
}
print $query->param('returnmessage');
print "\n" if (defined($query->param('returnurl')));
print "