#!/usr/bin/perl
##############################################################################
# #
# BFormMail Version 2.2.192 #
# #
# Copyright 1997-2004 Brian Sietz bsietz@infosheet.com #
# The Byte Shop - Small Business Solutions for Internet Web Development #
# http://www.infosheet.com #
# Created: 8/14/1997 #
# Modified: 11/27/2004 #
# #
# Based on FormMail by Matt Wright - mattw@scriptarchive.com #
# Modifications Copyright (c) 1997-2004 Brian S. Sietz, All Rights Reserved. #
# This version of FormMail may be used and modified free of charge by anyone #
# so long as this copyright notice and the one below by Matthew Wright remain#
# intact. By using this code you agree to indemnify Brian Sietz from any #
# liability arising from it's use. You also agree that this code cannot be #
# sold to any third party without prior written consent of both Brian Sietz #
# and Matthew M. Wright. #
# #
##############################################################################
# FormMail Version 1.92 #
# Copyright 1995-2002 Matt Wright mattw@scriptarchive.com #
# Created 06/09/95 Last Modified 04/21/02 #
# Matt's Script Archive, Inc.: http://www.scriptarchive.com/ #
##############################################################################
# COPYRIGHT NOTICE #
# Copyright 1995-2002 Matthew M. Wright All Rights Reserved. #
# #
# FormMail may be used and modified free of charge by anyone so long as this #
# copyright notice and the comments above remain intact. By using this #
# code you agree to indemnify Matthew M. Wright from any liability that #
# might arise from its use. #
# #
# Selling the code for this program without prior written consent is #
# expressly forbidden. In other words, please ask first before you try and #
# make money off of my program. #
# #
# Obtain permission before redistributing this software over the Internet or #
# in any other medium. In all cases copyright and header must remain intact. #
##############################################################################
# ACCESS CONTROL FIX: Peter D. Thompson Yezek #
# http://www.securityfocus.com/archive/1/62033 #
##############################################################################
# #
# #
# BFormMail #
# #
# Took Matt's original 1.6 script and made some mods... #
# Then took Matt's 1.92 and added the security features here #
# #
# Mods made were mostly from features in yForm #
# which was Matt's original FormMail 1.5 with changes by: #
# Donald E. Killen 10/2/96 and #
# Ashley Bass 1/29/97 #
# #
# History: #
# #
# Added 6/29/97: #
# - Added table output to HTML (orig by Don Killen in yForm) #
# - Added printing of realname & email in HTML output (orig Ashley Bass)#
# - Added misc form fields: #
# cc - if present, a Cc: is added to the e-mail when sent #
# bcc - if present, a Bcc: is added to the e-mail when sent #
# - Added courtesy reply (based on code from yForm) #
# Changed field names; a bit longer, but easier to understand: #
# courtesy_reply - if present and email also present, reply sent #
# courtesy_reply_texta, First line of courtesy reply text #
# courtesy_reply_textb, Second line of courtesy reply text #
# courtesy_who_we_are, Name or company underneath the "Regards" #
# courtesy_our_url, URL to print after "Regards" #
# courtesy_our_email, e-mail to print after "Regards" #
# - Added database option (based on code from yForm) #
# append_db, if present, value is the data file to append to #
# db_delimiter, delimiter between fields #
# - Removed FormMail display in HTML output (except error output) #
# Nobody should care about who wrote the script, if they really #
# want to know, they should send e-mail to the webmaster... #
# #
# Added 8/14/97: #
# - Added support for e-mail to fax services by adding two form fields: #
# faxto, if specified is the e-mail address of the fax service. #
# for Faxaway, it would be a phone number@faxaway.com, i.e. #
# 16097951994@faxaway.com #
# faxfrom, specifies the From: field for the fax. Faxaway requires #
# field to be a valid Faxaway customer. #
# More information can be found in the BFormMail.readme file or #
# at http://www/faxaway.com #
# - Added db_fields config field to control which fields are appended #
# to the database. #
# - All form fields appended to database are stripped of newlines so #
# that all outputted fields will be on a single record #
# #
# Added 1/27/98: #
# - Added courtesy_who_we_are2 - same as courtesy_who_we_are but an #
# extra line of text if needed. #
# - Added support for another e-mail to fax service. Fax service is #
# selected by the faxservice field. Currently, the faxservice field #
# can specify 'faxaway' or 'faxsav' or 'netmoves'. Each service #
# requires a slightly (faxsav & netmoves are the same) #
# different header. The following fields fully control the form-fax #
# gateway: #
# faxservice, if specified enables the form-to-fax gateway and will #
# specify the desired service. The current services supported #
# are 'faxsav', 'netmoves' and 'faxaway'. #
# For more information on these #
# services visit http://www.netmoves.com or #
# http://www.faxaway.com #
# Please note, faxsav requires the variable $faxstamp #
# to be set - see below. #
# faxnum, specifies the telephone number to send the fax. For #
# security, the full e-mail address is assembled in the script. #
# Both faxsav & faxaway require the format as follows: #
# 16095551212 #
# faxfrom, specifies the From: field for the fax. Must be from an #
# authorized account from both services. For example: #
# bsietz@infosheet.com #
# More information can be found in the BFormMail.readme file. #
# #
# Added 7/16/98: #
# - Added check for valid e-mail address, if specified for cc: & bcc: #
# #
# Added 12/9/98: #
# - Fixed bug in print_blank_fields #
# #
# Added 8/15/99: #
# - Y2K fix provided by Karl Bogott #
# #
# Added 10/10/99: #
# - In routine check_url, if HTTP_REFERER not available, no longer #
# return true. #
# #
# Added 3/12/2000: #
# - Fixed ?? bug in redirect tag #
# #
# Added 4/18/2000: #
# - Added cc_visitor tag - send copy of form results to visitor #
# #
# Added 1/22/2001: #
# - Modified fax to support netmoves (formerly faxsav) #
# #
# Added 9/16/2001: #
# - Added EasyLink to list of fax services (formerly netmoves or faxsav #
# #
# Added 12/2001: #
# - Added security fixes from FormMail Version 1.9 #
# #
# Added 8/16/2002: #
# - Added -f parameter to sendmail #
# #
# Added 10/08/2003: #
# - Added $xrealsender variable which adds the X-Actual-From: #
# header to all outbound email to assist email server software to #
# parse the header #
# #
# Added 11/20/2004: #
# - Added log routine to help debug script actions #
# - Incorporated Matt's security fixes from FormMail v1.92 #
# - Added anti-SPAM harvesting of email addresses from HTML forms #
# Added 11/25/2004: #
# - Added checks of email all email addresses used in headers #
# (recipient, cc, bcc) to be specified in the @recipients array. #
# #
##############################################################################
# Define Variables #
# Detailed Information Found In README File. #
# #
# $mailprog defines the location of your sendmail program on your unix #
# system. The flags -i and -t should be passed to sendmail in order to #
# have it ignore single dots on a line and to read message for recipients #
#$mailprog = '/usr/lib/sendmail -i -t';
$mailprog = '/usr/sbin/sendmail -t -i';
# @referers allows forms to be located only on servers which are defined #
# in this field. This security fix from the last version which allowed #
# anyone on any server to use your FormMail script on their web site. #
#**PFL**
@referers = ('laflammeconsulting.com','centrend.com','uplandpreserve.com');
# @recipients defines the e-mail addresses or domain names that e-mail can #
# be sent to. This must be filled in correctly to prevent SPAM and allow #
# valid addresses to receive e-mail. Read the documentation to find out how #
# this variable works!!! It is EXTREMELY IMPORTANT. #
@recipients = &fill_recipients(@referers);
# ACCESS CONTROL FIX: Peter D. Thompson Yezek #
# @valid_ENV allows the sysadmin to define what environment variables can #
# be reported via the env_report directive. This was implemented to fix #
# the problem reported at http://www.securityfocus.com/bid/1187 #
@valid_ENV = ('REMOTE_HOST','REMOTE_ADDR','REMOTE_USER','HTTP_USER_AGENT');
# BSS
# $xrealsender: defines an optional X-Actual-From: field in the outbound
# email to assist parsing for script generated messages
$xrealsender = '';
# The EasyLink service requires a special stamp as part of the e-mail header #
# for additional security. This stamp, along with the appropriate 'from' #
# field are required in order to send a fax. #
# #
# Replace passwd in the line below with the stamp issued from EasyLink. #
# visit http://www.EasyLink.com for more information. #
$faxstamp = 'passwd';
#enable program debugging
$enable_debug = 0;
# Done #
##############################################################################
&debug_log("\n-----> Start of script:");
# Check Referring URL
&check_url;
# Retrieve Date
&get_date;
&debug_log("$date2|$time");
&debug_log("\nREMOTE_ADDR:$ENV{'REMOTE_ADDR'}|HTTP_REFERER:$ENV{'HTTP_REFERER'}|REMOTE_HOST:$ENV{'REMOTE_HOST'}|REMOTE_USER:$ENV{'REMOTE_USER'}|");
# Parse Form Contents
&parse_form;
# Check Required Fields
&check_required;
&debug_log("\nRecipients:$Config{'recipient'}/$recipient2|");
&debug_log("\nEmails:$Config{'email'}|$Config{'cc'}|$Config{'bcc'}|");
#&debug_log("\nBuffer:$buffer|");
# Send E-Mail
&send_mail;
#BSS
# Courtesy E-Mail to Visitor
&send_courtesy;
#Append Database
&append_database;
#BSS
# Send E-Fax
if ($Config{'faxservice'}) {
&send_mail($Config{'faxservice'})
};
# Return HTML Page or Redirect User
&return_html;
# Main ends here - only subroutines follow #
##############################################################################
# NOTE rev1.91: This function is no longer intended to stop abuse, that #
# functionality is now embedded in the checks made on @recipients and the #
# recipient form field. #
sub check_url {
# Localize the check_referer flag which determines if user is valid. #
local($check_referer) = 0;
# If a referring URL was specified, for each valid referer, make sure #
# that a valid referring URL was passed to FormMail. #
if ($ENV{'HTTP_REFERER'}) {
foreach $referer (@referers) {
if ($ENV{'HTTP_REFERER'} =~ m|https?://([^/]*)$referer|i) {
$check_referer = 1;
last;
}
}
}
else {
$check_referer = 1;
}
# If the HTTP_REFERER was invalid, send back an error. #
if ($check_referer != 1) { &error('bad_referer') }
}
sub get_date {
# Define arrays for the day of the week and month of the year. #
@days = ('Sunday','Monday','Tuesday','Wednesday',
'Thursday','Friday','Saturday');
@months = ('January','February','March','April','May','June','July',
'August','September','October','November','December');
# Get the current time and format the hour, minutes and seconds. Add #
# 1900 to the year to get the full 4 digit year. #
($sec,$min,$hour,$mday,$mon,$year,$wday) = (localtime(time))[0,1,2,3,4,5,6];
$time = sprintf("%02d:%02d:%02d",$hour,$min,$sec);
# $year += 1900;
# Y2K fix provided by Karl Bogott 8/1999
if ($year < 50){
$year += 2000;
}
else {
$year += 1900;
}
# Format the date. #
$date = "$days[$wday], $months[$mon] $mday, $year at $time";
$mon2 = $mon + 1;
$date2 = "$mon2/$mday/$year";
}
sub parse_form {
# Define the configuration associative array. #
%Config = ('recipient','', 'subject','',
'email','', 'realname','',
'redirect','', 'bgcolor','',
'background','', 'link_color','',
'vlink_color','', 'text_color','',
'alink_color','', 'title','',
'sort','', 'print_config','',
'required','', 'env_report','',
'return_link_title','', 'return_link_url','',
'print_blank_fields','', 'missing_fields_redirect','',
#BSS
'cc','', 'bcc','',
'courtesy_reply','',
'courtesy_our_url','', 'courtesy_our_email','',
'courtesy_reply_texta','',
'courtesy_reply_textb','',
'courtesy_who_we_are','','courtesy_who_we_are2','',
'append_db','', 'db_delimiter','',
'db_fields','',
'faxservice','',
'faxnum','', 'faxfrom','',
'cc_visitor',''
#BSS
);
# Determine the form's REQUEST_METHOD (GET or POST) and split the form #
# fields up into their name-value pairs. If the REQUEST_METHOD was #
# not GET or POST, send an error. #
if ($ENV{'REQUEST_METHOD'} eq 'GET') {
# Split the name-value pairs
@pairs = split(/&/, $ENV{'QUERY_STRING'});
$buffer = $ENV{'QUERY_STRING'};
}
elsif ($ENV{'REQUEST_METHOD'} eq 'POST') {
# Get the input
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
# Split the name-value pairs
@pairs = split(/&/, $buffer);
}
else {
&error('request_method');
}
# For each name-value pair: #
foreach $pair (@pairs) {
# Split the pair up into individual variables. #
local($name, $value) = split(/=/, $pair);
# Decode the form encoding on the name and value variables. #
# v1.92: remove null bytes #
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$name =~ tr/\0//d;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ tr/\0//d;
# If the field name has been specified in the %Config array, it will #
# return a 1 for defined($Config{$name}}) and we should associate #
# this value with the appropriate configuration variable. If this #
# is not a configuration form field, put it into the associative #
# array %Form, appending the value with a ', ' if there is already a #
# value present. We also save the order of the form fields in the #
# @Field_Order array so we can use this order for the generic sort. #
if (defined($Config{$name})) {
$Config{$name} = $value;
}
else {
if ($Form{$name} ne '') {
$Form{$name} = "$Form{$name}, $value";
}
else {
push(@Field_Order,$name);
$Form{$name} = $value;
}
}
}
# The next six lines remove any extra spaces or new lines from the #
# configuration variables, which may have been caused if your editor #
# wraps lines after a certain length or if you used spaces between field #
# names or environment variables. #
$Config{'required'} =~ s/(\s+|\n)?,(\s+|\n)?/,/g;
$Config{'required'} =~ s/(\s+)?\n+(\s+)?//g;
$Config{'env_report'} =~ s/(\s+|\n)?,(\s+|\n)?/,/g;
$Config{'env_report'} =~ s/(\s+)?\n+(\s+)?//g;
$Config{'print_config'} =~ s/(\s+|\n)?,(\s+|\n)?/,/g;
$Config{'print_config'} =~ s/(\s+)?\n+(\s+)?//g;
$Config{'db_fields'} =~ s/(\s+|\n)?,(\s+|\n)?/,/g;
$Config{'db_fields'} =~ s/(\s+)?\n+(\s+)?//g;
# Split the configuration variables into individual field names. #
@Required = split(/,/,$Config{'required'});
@Env_Report = split(/,/,$Config{'env_report'});
@Print_Config = split(/,/,$Config{'print_config'});
@Print_DB = split(/,/,"$Config{'db_fields'},$Form{'db_fields'}");
# ACCESS CONTROL FIX: Only allow ENV variables in @valid_ENV in #
# @Env_Report for security reasons. #
foreach $env_item (@Env_Report) {
foreach $valid_item (@valid_ENV) {
if ( $env_item eq $valid_item ) { push(@temp_array, $env_item) }
}
}
@Env_Report = @temp_array;
#BSS
# This block of code strips out intentionally inserted illegal characters
# in the various email addresses fields found in the HTML form. To help
# prevent Spammers from harvesting email addresses in HTML forms, you can
# insert any number of exclaimation point, or asterisk characters within the
# email address, for example b!siet!z@in!fo*she!et!.c!om which will translate
# to bsietz@infosheet.com.
#
# Also if cc or bcc are present, separate possible multiple addresses and
# check syntax & check against recipients array
$Config{'recipient'} =~ y/[!*]//d;
if ($Config{'cc'}) {
$Config{'cc'} =~ y/[!*]//d;
@ccs = split(/,/, $Config{'cc'});
foreach $cc (@ccs) {
if (!check_email($cc,"header")) {push(@error,$cc)};
};
if (@error) { &error('no_recipient', @error) };
};
if ($Config{'bcc'}) {
$Config{'bcc'} =~ y/[!*]//d;
@bccs = split(/,/, $Config{'bcc'});
foreach $bcc (@bccs) {
if (!check_email($bcc,"header")) {push(@error,$bcc)};
};
if (@error) { &error('no_recipient', @error) };
};
if ($Config{'courtesy_our_email'}) {
$Config{'courtesy_our_email'} =~ y/[!*]//d; }
if ($Config{'faxfrom'}) {
$Config{'faxfrom'} =~ y/[!*]//d; };
if ($Config{'faxnum'}) {
$Config{'faxnum'} =~ y/[!*]//d; };
}
sub check_required {
# Localize the variables used in this subroutine. #
local($require, @error );
#BSS
# FormMail & BFormMail allows for a recipient email address in the form:
# "bsietz@infosheet.com (Brian Sietz)" so that any email received by sendmail
# would have in the header: To: Brian Sietz (bsietz@infosheet.com).
# Until Matt Wright added his security enhancements in FormMail v1.9, this
# worked ok, however the recipient check below would fail with the added
# name in parenthesis. The following two lines below remove any spaces at
# the beginning of the string, and delete all characters following a space
# if it exists. The recipient is then check against the valid recipients.
# The original recipient string remains unchanged for use in the email routines
$recipient2 = $Config{'recipient'};
$recipient2 =~ s/^\s+|\s+$//g; # remove leading & trailing spaces
$recipient2 =~ s/\(.*?\)//g; # remove (realname)
$recipient2 =~ s/(\s+|\n)?,(\s+|\n)?/,/g;
$recipient2 =~ s/^\s+|\s+$//g;
# The following insures that there were no newlines in any fields which #
# will be used in the header. #
if ($Config{'subject'} =~ /(\n|\r)/m || $Config{'email'} =~ /(\n|\r|%)/m ||
$Config{'cc'} =~ /(\n|\r)/m || $Config{'bcc'} =~ /(\n|\r|%)/m ||
$Config{'realname'} =~ /(\n|\r)/m || $recipient2 =~ /(\n|\r)/m) {
&error('invalid_headers');
}
if (!$recipient2) {
if (!defined(%Form)) { &error('bad_referer') }
else { &error('no_recipient') }
}
else {
# This block of code requires that the recipient address end with #
# a valid domain or e-mail address as defined in @recipients. #
$valid_recipient = 0;
@recipient2 = split(/,/,$recipient2);
foreach $r2 (@recipient2) {
if (!check_email($r2,"header")) { &error('no_recipient') };
};
}
# For each require field defined in the form: #
foreach $require (@Required) {
# If the required field is the email field, the syntax of the email #
# address if checked to make sure it passes a valid syntax. #
if ($require eq 'email' && !&check_email($Config{$require},"body")) {
push(@error,$require);
}
# Otherwise, if the required field is a configuration field and it #
# has no value or has been filled in with a space, send an error. #
elsif (defined($Config{$require})) {
if ($Config{$require} eq '') { push(@error,$require); }
}
# If it is a regular form field which has not been filled in or #
# filled in with a space, flag it as an error field. #
elsif (!defined($Form{$require}) || $Form{$require} eq '') {
push(@error,$require);
}
}
# If any error fields have been found, send error message to the user. #
if (@error) { &error('missing_fields', @error) }
}
sub return_html {
# Local variables used in this subroutine initialized. #
local($key,$sort_order,$sorted_field);
# Now that we have finished using form values for any e-mail related #
# reasons, we will convert all of the form fields and config values #
# to remove any cross-site scripting security holes. #
local($field);
foreach $field (keys %Config) {
$safeConfig{$field} = &clean_html($Config{$field});
}
foreach $field (keys %Form) {
$Form{$field} = &clean_html($Form{$field});
}
# If redirect option is used, print the redirectional location header. #
if ($Config{'redirect'}) {
print "Location: $safeConfig{'redirect'}\n\n";
}
# Otherwise, begin printing the response page. #
else {
# Print HTTP header and opening HTML tags. #
print "Content-type: text/html\n\n";
print "<html>\n <head>\n";
# Print out title of page #
if ($Config{'title'}) { print " <title>$safeConfig{'title'}</title>\n" }
else { print " <title>Thank You</title>\n" }
print " </head>\n <body";
# Get Body Tag Attributes #
&body_attributes;
# Close Body Tag #
print ">\n <center>\n";
# Print custom or generic title. #
if ($Config{'title'}) { print " <h1>$safeConfig{'title'}</h1>\n" }
else { print " <h1>Thank You For Filling Out This Form</h1>\n" }
print "</center>\n";
print "Below is what you submitted to $safeConfig{'recipient'} ";
print "<br>on $date<p><hr size=1 width=75\%><p>\n";
#BSS Table output for HTML (orig Don Killen)
# Also realname and email fields (orig Ashley Bass)
print "<table cellspacing=2 cellpadding=1>";
if ($Config{'realname'}) {
print "<tr><td align=right><b>Name:</b></td>";
print "<td align=left>$Config{'realname'}</td></tr>\n"
}
if ($Config{'email'}) {
print "<tr><td align=right><b>E-mail:</b></td>";
print "<td align=left>$Config{'email'}</td></tr>\n\n"
}
#BSS
# Sort alphabetically if specified: #
if ($Config{'sort'} eq 'alphabetic') {
foreach $field (sort keys %Form) {
# If the field has a value or the print blank fields option #
# is turned on, print out the form field and value. #
if ($Config{'print_blank_fields'} || $Form{$field}) {
#BSS - table output
#print "<b>$field:</b> $Form{$field}<p>\n";
print "<tr><td align=right>$field:</td>";
print "<td align=left>$Form{$field}</td></tr>\n";
#BSS
}
}
}
# If a sort order is specified, sort the form fields based on that. #
elsif ($Config{'sort'} =~ /^order:.*,.*/) {
# Set the temporary $sort_order variable to the sorting order, #
# remove extraneous line breaks and spaces, remove the order: #
# directive and split the sort fields into an array. #
$sort_order = $Config{'sort'};
$sort_order =~ s/(\s+|\n)?,(\s+|\n)?/,/g;
$sort_order =~ s/(\s+)?\n+(\s+)?//g;
$sort_order =~ s/order://;
@sorted_fields = split(/,/, $sort_order);
# For each sorted field, if it has a value or the print blank #
# fields option is turned on print the form field and value. #
foreach $sorted_field (@sorted_fields) {
if ($Config{'print_blank_fields'} || $Form{$sorted_field}) {
#BSS - table output
#print "<b>$sorted_field:</b> $Form{$sorted_field}<p>\n";
print "<tr><td align=right>$sorted_field:</td>";
print "<td align=left>$Form{$sorted_field}</td></tr>\n";
#BSS
}
}
}
# Otherwise, default to the order in which the fields were sent. #
else {
# For each form field, if it has a value or the print blank #
# fields option is turned on print the form field and value. #
foreach $field (@Field_Order) {
if ($Config{'print_blank_fields'} || $Form{$field}) {
#BSS - table output
#print "<b>$field:</b> $Form{$field}<p>\n";
print "<tr><td align=right><b>$field:</b></td>";
print "<td align=left>$Form{$field}</td></tr>\n";
#BSS
}
}
}
#BSS
print "</table><br clear=all>\n";
#BSS
print "<p><hr size=1 width=75%><p>\n";
# Check for a Return Link and print one if found. #
if ($Config{'return_link_url'} && $Config{'return_link_title'}) {
print "<ul>\n";
print "<li><a href=\"$safeConfig{'return_link_url'}\">$safeConfig{'return_link_title'}</a>\n";
print "</ul>\n";
}
# Print the page footer. #
print <<"(END HTML FOOTER)";
<hr size=1 width=75%><p>
</body>
</html>
(END HTML FOOTER)
}
}
sub send_mail {
# Localize variables used in this subroutine. #
#BSS
local ($faxservice) = @_;
local($print_config,$key,$sort_order,$sorted_field,$env_report);
# Open The Mail Program
open(MAIL,"|$mailprog -f $recipient2");
if ($faxservice) {
if ($faxservice eq 'faxaway') {
print MAIL "To: $Config{'faxnum'}\@faxaway.com\n";
print MAIL "From: $Config{'faxfrom'}\n";
}
if ( ($faxservice eq 'faxsav') ||
($faxservice eq 'netmoves') ||
($faxservice eq 'easylink') ) {
print MAIL "To: $Config{'faxnum'}\@faxmail.com\n";
print MAIL "X-STAMP: $faxstamp\n";
print MAIL "X-FAXSENDER: $Config{'faxfrom'}\n";
}
}
else {
print MAIL "To: $Config{'recipient'}\n";
print MAIL "From: $Config{'email'} ($Config{'realname'})\n";
#BSS
if ($Config{'cc'}) { print MAIL "Cc: $Config{'cc'}\n" };
if ($Config{'cc_visitor'})
{ print MAIL "Cc: $Config{'email'} ($Config{'realname'})\n"};
if ($Config{'bcc'}) { print MAIL "Bcc: $Config{'bcc'}\n" };
}
print MAIL "X-Actual-From: $xrealsender\n"; #BSS 10/08/03
# Check for Message Subject
if ($Config{'subject'}) { print MAIL "Subject: $Config{'subject'}\n\n" }
else { print MAIL "Subject: WWW Form Submission\n\n" }
print MAIL "Below is the result of your feedback form:\n";
print MAIL " It was submitted by: $Config{'realname'} ($Config{'email'})\n on $date\n";
#BSS
if ($Config{'faxservice'}) {
print MAIL "Feedback results were also faxed to: $Config{'faxnum'}\n";
}
#BSS
print MAIL "-" x 75 . "\n\n";
if (@Print_Config) {
foreach $print_config (@Print_Config) {
if ($Config{$print_config}) {
print MAIL "$print_config: $Config{$print_config}\n\n";
}
}
}
# Sort alphabetically if specified: #
if ($Config{'sort'} eq 'alphabetic') {
foreach $field (sort keys %Form) {
# If the field has a value or the print blank fields option #
# is turned on, print out the form field and value. #
if ($Config{'print_blank_fields'} || $Form{$field} ||
$Form{$field} eq '0') {
print MAIL "$field: $Form{$field}\n\n";
}
}
}
# If a sort order is specified, sort the form fields based on that. #
elsif ($Config{'sort'} =~ /^order:.*,.*/) {
# Remove extraneous line breaks and spaces, remove the order: #
# directive and split the sort fields into an array. #
$Config{'sort'} =~ s/(\s+|\n)?,(\s+|\n)?/,/g;
$Config{'sort'} =~ s/(\s+)?\n+(\s+)?//g;
$Config{'sort'} =~ s/order://;
@sorted_fields = split(/,/, $Config{'sort'});
# For each sorted field, if it has a value or the print blank #
# fields option is turned on print the form field and value. #
foreach $sorted_field (@sorted_fields) {
if ($Config{'print_blank_fields'} || $Form{$sorted_field} ||
$Form{$sorted_field} eq '0') {
print MAIL "$sorted_field: $Form{$sorted_field}\n\n";
}
}
}
# Otherwise, default to the order in which the fields were sent. #
else {
# For each form field, if it has a value or the print blank #
# fields option is turned on print the form field and value. #
foreach $field (@Field_Order) {
if ($Config{'print_blank_fields'} || $Form{$field} ||
$Form{$field} eq '0') {
print MAIL "$field: $Form{$field}\n\n";
}
}
}
print MAIL "-" x 75 . "\n\n";
# Send any specified Environment Variables to recipient. #
foreach $env_report (@Env_Report) {
if ($ENV{$env_report}) {
print MAIL "$env_report: $ENV{$env_report}\n";
}
}
close (MAIL);
}
sub check_email {
# Check both syntax of the email as well as valid recipient
# Initialize local email variable with input to subroutine. #
$email = $_[0];
$check_type = $_[1]; #BSS
local($valid_recipient,$send_to,@send_to); #BSS
&debug_log("\nChecking:$email");
$email =~ s/^\s+|\s+$//g; # remove leading & trailing spaces
$email =~ s/\(.*?\)//g; # remove (realname)
$email =~ s/(\s+|\n)?,(\s+|\n)?/,/g;
$email =~ s/^\s+|\s+$//g;
&debug_log("[$email]");
# If the e-mail address contains: #
if ($email =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/ ||
# the e-mail address contains an invalid syntax. Or, if the #
# syntax does not match the following regular expression pattern #
# it fails basic syntax verification. #
$email !~ /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z0-9]+)(\]?)$/) {
# Basic syntax requires: one or more characters before the @ sign, #
# followed by an optional '[', then any number of letters, numbers, #
# dashes or periods (valid domain/IP characters) ending in a period #
# and then 2 or 3 letters (for domain suffixes) or 1 to 3 numbers #
# (for IP addresses). An ending bracket is also allowed as it is #
# valid syntax to have an email address like: user@[255.255.255.0] #
# Return a false value, since the e-mail address did not pass valid #
# syntax. #
&debug_log("-fail");
return 0;
}
else {
# This block of code requires that the any email address used in the
# header (recipient, email, cc or bcc) end with a valid domain or
# e-mail address as defined in @recipients.
if ($check_type eq 'header') {
foreach $send_to (split(/,/,$email)) {
foreach $recipient (@recipients) {
if ($send_to =~ /$recipient$/i) {
push(@send_to,$send_to); last;
}
}
}
if ($#send_to < 0) {
&debug_log("-fail");
return 0;
}
}
# Return a true value, e-mail verification passed. #
&debug_log("-ok");
return 1;
}
}
# This was added into v1.91 to further secure the recipients array. Now, by #
# default it will assume that valid recipients include only users with #
# usernames A-Z, a-z, 0-9, _ and - that match your domain exactly. If this #
# is not what you want, you should read more detailed instructions regarding #
# the configuration of the @recipients variable in the documentation. #
sub fill_recipients {
local(@domains) = @_;
local($domain,@return_recips);
foreach $domain (@domains) {
if ($domain =~ /^\d+\.\d+\.\d+\.\d+$/) {
$domain =~ s/\./\\\./g;
push(@return_recips,'^[\w\-\.]+\@\[' . $domain . '\]');
}
else {
$domain =~ s/\./\\\./g;
$domain =~ s/\-/\\\-/g;
push(@return_recips,'^[\w\-\.]+\@' . $domain);
}
}
return @return_recips;
}
# This function will convert <, >, & and " to their HTML equivalents. #
sub clean_html {
local $value = $_[0];
$value =~ s/\&/\&/g;
$value =~ s/</\</g;
$value =~ s/>/\>/g;
$value =~ s/"/\"/g;
return $value;
}
sub body_attributes {
# Check for Background Color
if ($Config{'bgcolor'}) { print " bgcolor=\"$safeConfig{'bgcolor'}\"" }
# Check for Background Image
if ($Config{'background'}) { print " background=\"$safeConfig{'background'}\"" }
# Check for Link Color
if ($Config{'link_color'}) { print " link=\"$safeConfig{'link_color'}\"" }
# Check for Visited Link Color
if ($Config{'vlink_color'}) { print " vlink=\"$safeConfig{'vlink_color'}\"" }
# Check for Active Link Color
if ($Config{'alink_color'}) { print " alink=\"$safeConfig{'alink_color'}\"" }
# Check for Body Text Color
if ($Config{'text_color'}) { print " text=\"$safeConfig{'text_color'}\"" }
}
#############################################################################
# #
# BSS: Send courtesy email to the visitor thanking him, etc. #
# #
# Not sure if this portion of code was written by Ashley Bass or by #
# Donald Killen, but was taken from yForm #
# #
# Code is basically the same, just some variable name changes to be #
# more self explainatory. #
# #
sub send_courtesy {
if ($Config{'courtesy_reply'} && $Config{'email'})
{
open (MAIL,"|$mailprog -t -f $recipient2");
print MAIL "To: $Config{'email'} ($Config{'realname'})\n";
print MAIL "From: $Config{'courtesy_our_email'}\n";
if ($Config{'subject'}) {
print MAIL "Subject: Thanks for your $Config{'subject'}\n\n";
$subjflag = 1;
}
else {
print MAIL "Subject: Thank you - $date\n\n";
$subjflag = 0;
}
print MAIL "On $date you responded to ";
if ( $subjflag ) {
print MAIL "our\n `$Config{'subject'}` form.\n\n";
}
else {
print MAIL "a WWW form.\n\n";
}
if ($Config{'courtesy_reply_texta'}) {
print MAIL "$Config{'courtesy_reply_texta'}\n";
}
if ($Config{'courtesy_reply_textb'}) {
print MAIL "$Config{'courtesy_reply_textb'}\n\n";
}
print MAIL "Regards,\n";
print MAIL "$Config{'courtesy_who_we_are'}\n";
print MAIL "$Config{'courtesy_who_we_are2'}\n";
print MAIL "$Config{'courtesy_our_email'}\n";
print MAIL "$Config{'courtesy_our_url'}\n";
close (MAIL);
}
}
#############################################################################
# #
# BSS: append debug info to a Log file #
# This routine is helpful for finding errors, especially when altering the #
# script. Simply place a call to debug_log("xyzzy") to help trace program #
# execution. #
# #
sub debug_log {
if ($enable_debug) {
$info = $_[0];
&lockit ("BFormMail_log.lock");
open (LOGFILE, ">>BFormMail.log");
print LOGFILE "$info";
close (LOGFILE);
&unlockit ("BFormMail_log.lock");
}
}
#############################################################################
# #
# BSS: Append to a Database file #
# #
# Originally appeared in yForm written by Ashley Bass 1/29/97 #
# #
sub append_database {
local($print_db,$field);
if ($Config{'append_db'})
{
if (-w $Config{'append_db'})
{
&lockit ("$Config{'append_db'}.lock");
open (DATABASE, ">>$Config{'append_db'}");
print DATABASE "$Config{'db_delimiter'}";
print DATABASE "$date2$Config{'db_delimiter'}";
print DATABASE "$time$Config{'db_delimiter'}";
foreach $print_db (@Print_DB) {
if ($Config{$print_db}) {
$field = $Config{$print_db};
$field =~ s/\r\n/ /gs;
print DATABASE "$field";
}
if ($Form{$print_db}) {
$field = $Form{$print_db};
$field =~ s/\r\n/ /gs;
print DATABASE "$field";
};
print DATABASE "$Config{'db_delimiter'}";
};
print DATABASE "\n";
close (DATABASE);
&unlockit ("$Config{'append_db'}.lock");
}
}
}
sub lockit
{
local ($lock_file) = @_;
local ($endtime);
$endtime = 20;
$endtime = time + $endtime;
while (-e $lock_file && time < $endtime)
{
sleep(1);
}
open(LOCK_FILE, ">$lock_file") || &file_open_error ("$lock_file",
"Lock File Routine",
__FILE__, __LINE__);
# flock(LOCK_FILE, 2); # 2 exclusively locks the file
}
#######################################################################
sub unlockit
{
local ($lock_file) = @_;
# flock(LOCK_FILE, 8); # 8 unlocks the file
close(LOCK_FILE);
unlink($lock_file);
}
#######################################################################
sub file_open_error
{
local ($bad_file, $script_section, $this_file, $line_number) = @_;
print "Content-type: text/html\n\n";
&CgiDie ("I am sorry, but I was not able to access $bad_file.")
}
sub error {
# Localize variables and assign subroutine input. #
local($error,@error_fields) = @_;
local($host,$missing_field,$missing_field_list);
&debug_log("\nError:$error");
&debug_log("\nBuffer:$buffer");
if ($error eq 'bad_referer') {
if ($ENV{'HTTP_REFERER'} =~ m|^https?://([\w\.]+)|i) {
$host = $1;
my $referer = &clean_html($ENV{'HTTP_REFERER'});
print <<"(END ERROR HTML)";
Content-type: text/html
<html>
<head>
<title>Bad Referrer - Access Denied</title>
</head>
<body bgcolor=#FFFFFF text=#000000>
<center>
<table border=0 width=600 bgcolor=#9C9C9C>
<tr><th><font size=+2>Bad Referrer - Access Denied</font></th></tr>
</table>
<table border=0 width=600 bgcolor=#CFCFCF>
<tr><td>The form attempting to use
<a href="http://www.infosheet.com/iScripts.html">BFormMail</a>
resides at <tt>$referer</tt>, which is not allowed to access
this cgi script.<p>
If you are attempting to configure BFormMail to run with this form, you need
to add the following to \@referers, explained in detail in the
<a href="http://www.scriptarchive.com/readme/formmail.html">README</a> file.<p>
Add <tt>'$host'</tt> to your <tt><b>\@referers</b></tt> array.<hr size=1>
<center><font size=-1>
<a href="http://www.scriptarchive.com/formmail.html">FormMail</a> V1.92 © 1995 - 2002 Matt Wright<br>
A Free Product of <a href="http://www.scriptarchive.com/">Matt's Script Archive, Inc.</a>
</font></center>
</td></tr>
</table>
</center>
</body>
</html>
(END ERROR HTML)
}
else {
print <<"(END ERROR HTML)";
Content-type: text/html
<html>
<head>
<title>BFormMail v2.2.192</title>
</head>
<body bgcolor=#FFFFFF text=#000000>
<center>
<table border=0 width=600 bgcolor=#9C9C9C>
<tr><th><font size=+2>FormMail -- BFormMail</font></th></tr>
</table>
<table border=0 width=600 bgcolor=#CFCFCF>
<tr><th><tt><font size=+1>Copyright 1995 - 2002 Matt Wright<br>
Version 1.92 - Released April 21, 2002<br>
A Free Product of <a href="http://www.scriptarchive.com/">Matt's Script Archive,
Inc.</a></font></tt></th></tr>
</table>
</center>
</body>
</html>
(END ERROR HTML)
}
}
elsif ($error eq 'request_method') {
print <<"(END ERROR HTML)";
Content-type: text/html
<html>
<head>
<title>Error: Request Method</title>
</head>
<body bgcolor=#FFFFFF text=#000000>
<center>
<table border=0 width=600 bgcolor=#9C9C9C>
<tr><th><font size=+2>Error: Request Method</font></th></tr>
</table>
<table border=0 width=600 bgcolor=#CFCFCF>
<tr><td>The Request Method of the Form you submitted did not match
either <tt>GET</tt> or <tt>POST</tt>. Please check the form and make sure the
<tt>method=</tt> statement is in upper case and matches <tt>GET</tt> or <tt>POST</tt>.<p>
<center><font size=-1>
<a href="http://www.scriptarchive.com/formmail.html">FormMail</a> V1.92 © 1995 - 2001 Matt Wright<br>
A Free Product of <a href="http://www.scriptarchive.com/">Matt's Script Archive, Inc.</a>
</font></center>
</td></tr>
</table>
</center>
</body>
</html>
(END ERROR HTML)
}
elsif ($error eq 'no_recipient') {
print <<"(END ERROR HTML)";
Content-type: text/html
<html>
<head>
<title>Error: Bad/No Recipient</title>
</head>
<body bgcolor=#FFFFFF text=#000000>
<center>
<table border=0 width=600 bgcolor=#9C9C9C>
<tr><th><font size=+2>Error: Bad/No Recipient, cc or bcc</font></th></tr>
</table>
<table border=0 width=600 bgcolor=#CFCFCF>
<tr><td>There was no recipient or an invalid recipient, cc or bcc specified in the data sent to BFormMail. Please
make sure you have filled in the <tt>recipient</tt>, <tt>cc</tt>, or <tt>bcc</tt> form field with an e-mail
address that has been configured in <tt>\@recipients</tt>. More information on filling in <tt>recipient</tt> form fields and variables can be
found in the README file.<hr size=1>
<center><font size=-1>
<a href="http://www.scriptarchive.com/formmail.html">FormMail</a> V1.92 © 1995 - 2002 Matt Wright<br>
A Free Product of <a href="http://www.scriptarchive.com/">Matt's Script Archive, Inc.</a>
</font></center>
</td></tr>
</table>
</center>
</body>
</html>
(END ERROR HTML)
}
elsif ($error eq 'missing_fields') {
if ($Config{'missing_fields_redirect'}) {
print "Location: $Config{'missing_fields_redirect'}\n\n";
}
else {
foreach $missing_field (@error_fields) {
$missing_field_list .= " <li>$missing_field\n";
}
print <<"(END ERROR HTML)";
Content-type: text/html
<html>
<head>
<title>Error: Blank Fields</title>
</head>
<center>
<table border=0 width=600 bgcolor=#9C9C9C>
<tr><th><font size=+2>Error: Blank Fields</font></th></tr>
</table>
<table border=0 width=600 bgcolor=#CFCFCF>
<tr><td>The following fields were left blank in your submission form:<p>
<ul>
$missing_field_list
</ul><br>
These fields must be filled in before you can successfully submit the form.<p>
Please use your browser's back button to return to the form and try again.<hr size=1>
<center><font size=-1>
</font></center>
</td></tr>
</table>
</center>
</body>
</html>
(END ERROR HTML)
}
}
exit;
}
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:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
396:
397:
398:
399:
400:
401:
402:
403:
404:
405:
406:
407:
408:
409:
410:
411:
412:
413:
414:
415:
416:
417:
418:
419:
420:
421:
422:
423:
424:
425:
426:
427:
428:
429:
430:
431:
432:
433:
434:
435:
436:
437:
438:
439:
440:
441:
442:
443:
444:
445:
446:
447:
448:
449:
450:
451:
452:
453:
454:
455:
456:
457:
458:
459:
460:
461:
462:
463:
464:
465:
466:
467:
468:
469:
470:
471:
472:
473:
474:
475:
476:
477:
478:
479:
480:
481:
482:
483:
484:
485:
486:
487:
488:
489:
490:
491:
492:
493:
494:
495:
496:
497:
498:
499:
500:
501:
502:
503:
504:
505:
506:
507:
508:
509:
510:
511:
512:
513:
514:
515:
516:
517:
518:
519:
520:
521:
522:
523:
524:
525:
526:
527:
528:
529:
530:
531:
532:
533:
534:
535:
536:
537:
538:
539:
540:
541:
542:
543:
544:
545:
546:
547:
548:
549:
550:
551:
552:
553:
554:
555:
556:
557:
558:
559:
560:
561:
562:
563:
564:
565:
566:
567:
568:
569:
570:
571:
572:
573:
574:
575:
576:
577:
578:
579:
580:
581:
582:
583:
584:
585:
586:
587:
588:
589:
590:
591:
592:
593:
594:
595:
596:
597:
598:
599:
600:
601:
602:
603:
604:
605:
606:
607:
608:
609:
610:
611:
612:
613:
614:
615:
616:
617:
618:
619:
620:
621:
622:
623:
624:
625:
626:
627:
628:
629:
630:
631:
632:
633:
634:
635:
636:
637:
638:
639:
640:
641:
642:
643:
644:
645:
646:
647:
648:
649:
650:
651:
652:
653:
654:
655:
656:
657:
658:
659:
660:
661:
662:
663:
664:
665:
666:
667:
668:
669:
670:
671:
672:
673:
674:
675:
676:
677:
678:
679:
680:
681:
682:
683:
684:
685:
686:
687:
688:
689:
690:
691:
692:
693:
694:
695:
696:
697:
698:
699:
700:
701:
702:
703:
704:
705:
706:
707:
708:
709:
710:
711:
712:
713:
714:
715:
716:
717:
718:
719:
720:
721:
722:
723:
724:
725:
726:
727:
728:
729:
730:
731:
732:
733:
734:
735:
736:
737:
738:
739:
740:
741:
742:
743:
744:
745:
746:
747:
748:
749:
750:
751:
752:
753:
754:
755:
756:
757:
758:
759:
760:
761:
762:
763:
764:
765:
766:
767:
768:
769:
770:
771:
772:
773:
774:
775:
776:
777:
778:
779:
780:
781:
782:
783:
784:
785:
786:
787:
788:
789:
790:
791:
792:
793:
794:
795:
796:
797:
798:
799:
800:
801:
802:
803:
804:
805:
806:
807:
808:
809:
810:
811:
812:
813:
814:
815:
816:
817:
818:
819:
820:
821:
822:
823:
824:
825:
826:
827:
828:
829:
830:
831:
832:
833:
834:
835:
836:
837:
838:
839:
840:
841:
842:
843:
844:
845:
846:
847:
848:
849:
850:
851:
852:
853:
854:
855:
856:
857:
858:
859:
860:
861:
862:
863:
864:
865:
866:
867:
868:
869:
870:
871:
872:
873:
874:
875:
876:
877:
878:
879:
880:
881:
882:
883:
884:
885:
886:
887:
888:
889:
890:
891:
892:
893:
894:
895:
896:
897:
898:
899:
900:
901:
902:
903:
904:
905:
906:
907:
908:
909:
910:
911:
912:
913:
914:
915:
916:
917:
918:
919:
920:
921:
922:
923:
924:
925:
926:
927:
928:
929:
930:
931:
932:
933:
934:
935:
936:
937:
938:
939:
940:
941:
942:
943:
944:
945:
946:
947:
948:
949:
950:
951:
952:
953:
954:
955:
956:
957:
958:
959:
960:
961:
962:
963:
964:
965:
966:
967:
968:
969:
970:
971:
972:
973:
974:
975:
976:
977:
978:
979:
980:
981:
982:
983:
984:
985:
986:
987:
988:
989:
990:
991:
992:
993:
994:
995:
996:
997:
998:
999:
1000:
1001:
1002:
1003:
1004:
1005:
1006:
1007:
1008:
1009:
1010:
1011:
1012:
1013:
1014:
1015:
1016:
1017:
1018:
1019:
1020:
1021:
1022:
1023:
1024:
1025:
1026:
1027:
1028:
1029:
1030:
1031:
1032:
1033:
1034:
1035:
1036:
1037:
1038:
1039:
1040:
1041:
1042:
1043:
1044:
1045:
1046:
1047:
1048:
1049:
1050:
1051:
1052:
1053:
1054:
1055:
1056:
1057:
1058:
1059:
1060:
1061:
1062:
1063:
1064:
1065:
1066:
1067:
1068:
1069:
1070:
1071:
1072:
1073:
1074:
1075:
1076:
1077:
1078:
1079:
1080:
1081:
1082:
1083:
1084:
1085:
1086:
1087:
1088:
1089:
1090:
1091:
1092:
1093:
1094:
1095:
1096:
1097:
1098:
1099:
1100:
1101:
1102:
1103:
1104:
1105:
1106:
1107:
1108:
1109:
1110:
1111:
1112:
1113:
1114:
1115:
1116:
1117:
1118:
1119:
1120:
1121:
1122:
1123:
1124:
1125:
1126:
1127:
1128:
1129:
1130:
1131:
1132:
1133:
1134:
1135:
1136:
1137:
1138:
1139:
1140:
1141:
1142:
1143:
1144:
1145:
1146:
1147:
1148:
1149:
1150:
1151:
1152:
1153:
1154:
1155:
1156:
1157:
1158:
1159:
1160:
1161:
1162:
1163:
1164:
1165:
1166:
1167:
1168:
1169:
1170:
1171:
1172:
1173:
1174:
1175:
1176:
1177:
1178:
1179:
1180:
1181:
1182:
1183:
1184:
1185:
1186:
1187:
1188:
1189:
1190:
1191:
1192:
1193:
1194:
1195:
1196:
1197:
1198:
1199:
1200:
1201:
1202:
1203:
1204:
1205:
1206:
1207:
1208:
1209:
1210:
1211:
1212:
1213:
1214:
1215:
1216:
1217:
1218:
1219:
1220:
1221:
1222:
1223:
1224:
1225:
1226:
1227:
1228:
1229:
1230:
1231:
1232:
1233:
1234:
1235:
1236:
1237:
1238:
1239:
1240:
1241:
1242:
1243:
1244:
1245:
1246:
1247:
1248:
1249:
1250:
1251:
1252:
1253:
1254:
by: FishMongerPosted on 2008-06-07 at 09:51:58ID: 21736122
The type of html element used in the form does not get sent to the script, so there's no way for the script to know if you're using a radio button, or checkbox, or textfield. The script only sees name/value pairs. There must be a problem in how you coded the checkbox fields. Can you post the code for your form so that we ca see if we can spot the problem?