Salü,
ich mache gerade meine ersten gehversuche mit der Verwendung von CGI ohne ne Ahnung zu haben. Ich will einfach nur ein Formular von einer website an meine Mail gesendet wissen. Also, kurz ins Internet, kein Problem, Script gefunden, eingebunden und läuft!
Aber:
Wenn in dem Formularfeld „submit_by“, das die Absenderadresse enthält, keine Eintragung ist, dann wird kein Mail gesendet, sondern nur ein Eintrag in die Logfile vorgenommen. Wenn dieses Feld ausgefüllt ist bekomme ich die Daten per mail, und der „Ausfüller“ bekommt ne bestätigung. Da ich aber auch Anonyme EIngaben zulassen will, srich ohne e-mailadresse, wäre es gut, wenn ich immer eine Mail bekomme, und das Script nicht auf die Eingabe der Ansenderadresse bestehen würde.
Also anbei ist das Script, und ich hoffe ihr könnt mir helfen.
Besten Dank, Peter.
#@okaydomains=(„http://mydomain.com“, "http://www.mydomain.com");
#SMTP_SERVER: indicates the name of the host acting as the e-mail
gateway. „localhost“ should work on most systems.
#$SMTP_SERVER=„localhost“;
#OR IF SMTP IS UNAVAILABLE TO YOU, USE SEND_MAIL-
BUT NOT BOTH!
$SEND_MAIL="/bin/sendmail -t";
$lockfile="/tmp/bnbform.lck";
$SD=&sys_date;
$ST=&sys_time;
&decode_vars;
&valid_page;
if ($fields{‚countfile‘} ne „“) { &get_number; }
&valid_data;
&write_data;
if ($fields{‚automessage‘} ne „“) { &answer_back; }
if ($fields{‚ok_url‘} ne „“){
print „Location: $fields{‚ok_url‘}\n\n“; exit;
}
else { &thank_you; }
##################################################################
sub write_data
{
if ($fields{‚submit_by‘} ne „“) {
if (&valid_address == 0) {
&bad_email;
exit;
}
}
if ($fields{‚submit_by‘} ne „“ && $fields{‚emailfile‘} ne „“) {
open (EMF,">>$fields{‚emailfile‘}");
print EMF „$fields{‚submit_by‘}\n“;
close (EMF);
}
if ($fields{‚submit_to‘} ne „“) {
$msgtext="";
$msgtext .= „On $SD at $ST,\n“;
$msgtext .= „The following information was submitted:\n“;
$msgtext .= „From Host: $ENV{‚REMOTE_ADDR‘}\n“;
}
if ($fields{‚outputfile‘} ne „“) {
&get_the_lock;
open(OUT_FILE,">>$fields{‚outputfile‘}");
}
foreach $to_print (@sortlist) {
if ($fields{‚outputfile‘} ne „“)
{ print OUT_FILE „$fields{$to_print}|“; }
if ($fields{‚submit_to‘} ne „“)
{ $msgtext .= „$to_print = $fields{$to_print}\n“; }
}
if ($fields{‚outputfile‘} ne „“) {
print OUT_FILE „$SD|$ST|\n“;
close(OUT_FILE);
&drop_the_lock;
}
foreach $to_get (@recipients) {
$mailresult=&sendmail($fields{submit_by}, $fields{submit_by}, $to_get, $SMTP_SERVER, $fields{form_id}, $msgtext);
if ($mailresult ne „1“) {
print „Content-type: text/html\n\n“;
print „MAIL NOT SENT. SMTP ERROR: $mailcodes{’$mailresult’}\n“;
exit
}
}
foreach $to_cc (@cc_tos) {
$mailresult=&sendmail($fields{submit_by}, $fields{submit_by}, $to_cc, $SMTP_SERVER, $fields{form_id}, $msgtext);
if ($mailresult ne „1“) {
print „Content-type: text/html\n\n“;
print „MAIL NOT SENT. SMTP ERROR: $mailcodes{’$mailresult’}\n“;
exit
}
}
}
##################################################################
sub decode_vars
{
$i=0;
read(STDIN,$temp,$ENV{‚CONTENT_LENGTH‘});
@pairs=split(/&/,$temp);
foreach $item(@pairs) {
($key,$content)=split(/=/,$item,2);
$content=~tr/+/ /;
$content=~s/%(…)/pack(„c“,hex($1))/ge;
$content=~s/\t/ /g;
$content=~s/\0//g; #strip nulls
$fields{$key}=$content;
if ($key eq „data_order“) {
$content=~s/\012//g;
$content=~s/\015//g;
$content=~s/ //g;
$content=~s/ //g;
@sortlist=split(/,/,$content);
}
if ($key eq „required“) {
$content=~s/\012//g;
$content=~s/\015//g;
$content=~s/ //g;
@mandatory=split(/,/,$content);
}
if ($key eq „submit_to“) {
$content=~s/\012//g;
$content=~s/\015//g;
$content=~s/ //g;
@recipients=split(/,/,$content);
}
if ($key eq „cc_to“) {
$content=~s/\012//g;
$content=~s/\015//g;
$content=~s/ //g;
@cc_tos=split(/,/,$content);
}
}
if (
( ($fields{automessage}=~ /^([-/\w.]+)$/ || $fields{automessage} eq „“) &&
($fields{countfile}=~ /^([-/\w.]+)$/ || $fields{countfile} eq „“) &&
($fields{emailfile}=~ /^([-/\w.]+)$/ || $fields{emailfile} eq „“) &&
($fields{outputfile}=~ /^([-/\w.]+)$/ || $fields{outputfile} eq „“) )
) {$donothing=0;}
else {
print „Content-type: text/html\n\n sorry, invalid characters…\n“;
exit;
}
if ($fields{automessage} ne „“) {$fields{automessage} .= „.baut“;}
if ($fields{countfile} ne „“) {$fields{countfile} .= „.bcnt“;}
if ($fields{emailfile} ne „“) {$fields{emailfile} .= „.bemf“;}
if ($fields{outputfile} ne „“) {$fields{outputfile} .= „.bout“;}
}
##################################################################
sub valid_data
{
if ($fields{‚data_order‘} eq „“) #make sure we have work to do!
{
print „Content-type: text/html\n\n“;
print NO data_order list SPECIFIED!
__W1__
exit;
}
foreach $to_check (@mandatory) #test all required fields, bail on 1st bad
{
if ($fields{$to_check} eq „“) {
if ($fields{‚not_ok_url‘} ne „“) {
print „Location: $fields{‚not_ok_url‘}\n\n“;
exit;
}
else { &try_again; }
}
}
}
##################################################################
sub thank_you
{
print „Content-type: text/html\n\n“;
print
Thank you!
Your information has been sent and I will be in touch
with you as soon as I can
Here is the information you provided:
__W2__
foreach $itm (@sortlist) {
print
__W2A__
}
__W2B__
exit;
}
##################################################################
sub try_again
{
print „Content-type: text/html\n\n“;
print Missing Data!
Please press the back button and fill in
all required fields!
__W3__
exit;
}
##################################################################
sub answer_back
{
$subject = „Thank you“;
$msgtext="";
if ($fields{‚automessage‘} ne „“) {
open (AM,") {
chop $_;
$msgtext .= „$_\n“;
}
close(AM);
}
else {
$msgtext =) {
if ($thisnum eq „“) { $thisnum = 0;}
$newnum = $thisnum + 1;
}
close(COUNTER);
open(COUNTER,">$fields{‚countfile‘}");
print COUNTER „$newnum“;
close (COUNTER);
$fields{‚counter‘}=$newnum
}
##################################################################
sub valid_address
{
$testmail = $fields{‚submit_by‘};
if ($testmail =~/ /)
{ return 0; }
if ($testmail =~ /(@.*@)|(..)|(@.)|(.@)|(^.)/ ||
$testmail !~ /^.+@([?)[a-zA-Z0-9-.]+.([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$/)
{ return 0; }
else { return 1; }
}
##################################################################
sub bad_email
{
print
SORRY! Your request could not be processed because of an
improperly formatted e-mail address. Please use your browser’s
back button to return to the form entry page.
__STOP_OF_BADMAIL__
}
sub get_the_lock
{
local ($endtime);
$endtime = 60;
$endtime = time + $endtime;
while (-e $lockfile && time $lockfile");
}
sub drop_the_lock
{
close($lockfile);
unlink($lockfile);
}
##################################################################
sub valid_page
{
if (@okaydomains == 0)
{return;}
$DOMAIN_OK=0;
$RF=$ENV{‚HTTP_REFERER‘};
$RF=~tr/A-Z/a-z/;
foreach $ts (@okaydomains) {
if ($RF =~ /$ts/)
{ $DOMAIN_OK=1; }
}
if ( $DOMAIN_OK == 0) {
print „Content-type: text/html\n\n Sorry…Cant run from here!“;
exit;
}
}
###################################################################
###################################################################
sub sendmail {
error codes below for those who bother to check result codes
1 success
-1 $smtphost unknown
-2 socket() failed
-3 connect() failed
-4 service not available
-5 unspecified communication error
-6 local user $to unknown on host $smtp
-7 transmission of message failed
-8 argument $to empty
Sample call:
&sendmail($from, $reply, $to, $smtp, $subject, $message );
Note that there are several commands for cleaning up possible bad inputs - if you
are hard coding things from a library file, so of those are unnecesssary
my ($fromaddr, $replyaddr, $to, $smtp, $subject, $message) = @_;
$to =~ s/[\t]+/, /g; # pack spaces and add comma
$fromaddr =~ s/.*/$1/; # get from email address
$replyaddr =~ s/.*/$1/; # get reply email address
$replyaddr =~ s/^([^\s]+).*/$1/; # use first address
$message =~ s/^./../gm; # handle . as first character
$message =~ s/\r\n/\n/g; # handle line ending
$message =~ s/\n/\r\n/g;
$smtp =~ s/^\s+//g; # remove spaces around $smtp
$smtp =~ s/\s+$//g;
if (!$to)
{
return(-8);
}
if ($SMTP_SERVER ne „“)
{
my($proto) = (getprotobyname(‚tcp‘))[2];
my($port) = (getservbyname(‚smtp‘, ‚tcp‘))[2];
my($smtpaddr) = ($smtp =~
/^(\d{1,3}).(\d{1,3}).(\d{1,3}).(\d{1,3})$/)
? pack(‚C4‘,$1,$2,$3,$4)
: (gethostbyname($smtp))[4];
if (!defined($smtpaddr))
{
return(-1);
}
if (!socket(MAIL, AF_INET, SOCK_STREAM, $proto))
{
return(-2);
}
if (!connect(MAIL, pack(‚Sna4x8‘, AF_INET, $port, $smtpaddr)))
{
return(-3);
}
my($oldfh) = select(MAIL);
$| = 1;
select($oldfh);
$_ = ;
if (/^[45]/)
{
close(MAIL);
return(-4);
}
print MAIL „helo $SMTP_SERVER\r\n“;
$_ = ;
if (/^[45]/)
{
close(MAIL);
return(-5);
}
print MAIL „mail from: \r\n“;
$_ = ;
if (/^[45]/)
{
close(MAIL);
return(-5);
}
foreach (split(/, /, $to))
{
print MAIL „rcpt to: \r\n“;
$_ = ;
if (/^[45]/)
{
close(MAIL);
return(-6);
}
}
print MAIL „data\r\n“;
$_ = ;
if (/^[45]/)
{
close MAIL;
return(-5);
}
}
if ($SEND_MAIL ne „“)
{
open (MAIL,"| $SEND_MAIL");
}
print MAIL „To: $to\n“;
print MAIL „From: $fromaddr\n“;
print MAIL „Reply-to: $replyaddr\n“ if $replyaddr;
print MAIL „X-Mailer: Perl Powered Socket Mailer\n“;
print MAIL „Subject: $subject\n\n“;
print MAIL „$message“;
print MAIL „\n.\n“;
if ($SMTP_SERVER ne „“)
{
$_ = ;
if (/^[45]/)
{
close(MAIL);
return(-7);
}
print MAIL „quit\r\n“;
$_ = ;
}
close(MAIL);
return(1);
}
sub sys_date
{
%mn = (‚Jan‘,‚01‘, ‚Feb‘,‚02‘, ‚Mar‘,‚03‘, ‚Apr‘,‚04‘,
‚May‘,‚05‘, ‚Jun‘,‚06‘, ‚Jul‘,‚07‘, ‚Aug‘,‚08‘,
‚Sep‘,‚09‘, ‚Oct‘,‚10‘, ‚Nov‘,‚11‘, ‚Dec‘,‚12‘ );
$sydate=localtime(time);
($day, $month, $num, $time, $year) = split(/\s+/,$sydate);
$zl=length($num);
if ($zl == 1)
{ $num = „0$num“;}
$yyyymmdd="$year-$mn{$month}-$num";
return $yyyymmdd;
}
sub sys_time
{
$sydate=localtime(time);
($day, $month, $num, $time, $year) = split(/\s+/,$sydate);
return $time;
}