#!/usr/bin/perl ################################# Read Me ############################## # # # Program: opt_in.cgi # # # # This program will # # # ########################################################################## ############################# Path Variables ########################### # Base path to program domain. $public = "/someplace/far/away"; # Carmine's address. $other= 'joe@schmoe.net'; # Name of footer file. $foot = "/foot.html"; # Name of header file. $head = "/head.html"; ########################################################################## use CGI qw(:standard :html3); use DBI(); use Net::SMTP; use Socket; # If input is ok, proceed. if (aok()) { # Add client to database and send notification with opt out link. opt_in(); # If there's a comment give success page. if ($comment) { print "\n

Hello $name

\n

Thank you for your comment, it reads as follows:
\n

$comment

"; piece($foot); } # If no comment no content. else { print "Content-Type: text/html\nStatus: 204 No Content\n\n"; }} # If there's a comment or extra fields mail them to gabe. if ($comment || $xtra) { mail_stuf('comment@webzen.com', $email, $subject, "$xtra$comment"); # If this form is from webzen mail one to moe also. # if ($ENV{HTTP_REFERER} =~ m<^http://www\.someplace.com/.*>) { mail_stuf($other, $email, $subject, "$xtra$comment"); } } exit 0; ########################################################################## ########################################################################## # Check the input data. sub aok { # If direct hit redirect to main site. if (!param()) { print "Location: http://www.someplace.com\n\n"; return undef; } # Get the local variables. $email = param('email'); $site = param('site'); $type = param('type'); $in = param('function'); $subject = "$site.com"; if (param('subject')) { $comment = "\nRe: "; $comment .= param('subject'); $comment .= "\n\n"; } if (param('name')) { $comment .= "\nName: "; $comment .= param('name'); $comment .= "\n\n"; } if (param('comment')) { $comment .= param('comment'); } # Check for good data. if (!$site || !$type || !good_address($email)) { return undef; } # Add any extra info put on the form. if (param('xtra') eq "xtra") { xtra_stuf(); } # Get the IP address. $ip = remote_addr(); # Set the date. $date = `date '+%D'`; # Get this far, everythings ok. return 1; } ########################################################################## # The paths to the particular header is built. sub build_paths { if (!$site) { $site = 'generic'; } $foot = "$public$site$foot"; $head = "$public$site$head"; } ########################################################################## # Check for the existance of address. sub found { (my $dbh) = @_; my $ret_val = undef; my $sth; # Print sql statement for active list member. $sth = $dbh->prepare("select 'x' from opt_in where email=\'$email\' and type=\'$type\'"); $sth->execute(); # If a row exists for this surfer return 1 (success). if ($sth->rows gt 0) { $ret_val = 1; $active = 1; } # Else print sql statement for inactive list member. else { $sth = $dbh->prepare("select 'x' from opt_in where email=\'$email\' and type=\'NULL\'"); $sth->execute(); # If a row does not exist for this surfer return 2 (success). if ($sth->rows gt 0) { $ret_val = 1; }} # Clean up $sth->finish(); # Else return 1 (success). return $ret_val; } ########################################################################## # The e-mail address is checked for an "@", a "." and no spaces. sub get_id { my $dbh = shift; # Prepare and execute sql statement. my $sth = $dbh->prepare("select id from opt_in where email=\'$email\' and type=\'$type\'"); $sth->execute(); # Build and return id number.. my $ref = $sth->fetchrow_hashref(); $temp = 776869 + $ref->{'id'}; $sth->finish(); my $id = "012"; $id .= $temp; $id .= "345"; return $id; } ########################################################################## # The e-mail address is checked for an "@", a "." and no spaces. sub good_address { my $email = shift; ((index($email,"@") ne -1) && (index($email,".") ne -1) && (index($email," " ) eq -1))? return 1: return undef; } ########################################################################## # The results are mailed if selected (disabled). sub mail_stuf { (my $to, my $from, my $subject, my $comment) = @_; $comment =~ s/([\!|\#|\;])//g; # Connect to SMTP and mail. $smtp = Net::SMTP->new('mail'); $smtp->mail($from); $smtp->to($to); $smtp->data(); $smtp->datasend("To: <$to>\nSubject: $subject\n$comment"); # Close $smtp->dataend(); $smtp->quit(); } ########################################################################## # The page for a remote opt in. sub opt_in { my $stmt; ($name, undef) = split(/@/, $email); # Connect to the database. my $dbh = DBI->connect("DBI:mysql:database=my_db;host=localhost", "root", "", {'RaiseError' => 1}); if (!found($dbh)) { if (!$in) { $type = "NULL"; } $stmt = "insert into opt_in (email, type, domain, date, ip) values (\'$email\', \'$type\', \'$site\', \'$date\', \'$ip\')"; } elsif ($in && $active) { $stmt = "update opt_in set domain=\'$site\', date=\'$date\', ip=\'$ip\' where (email=\'$email\' and type=\'$type\')"; } elsif ($in) { $stmt = "update opt_in set domain=\'$site\', date=\'$date\', ip=\'$ip\', type=\'$type\' where (email=\'$email\' and type=\'NULL\')"; } if ($stmt) { $dbh->do($stmt); } # If successful print sucess message and mail confirmation. if ($comment) { build_paths(); piece($head); if ($in) { print "\n

Welcome $name, you have been added to
\Someplace's opt-in mail list, The Foobar'ed.

\n

You will receive an email confirmation.

\n

Thank you.

\n\n

Someplace


"; }} if ($in) { $id = get_id($dbh); my $welcome = "\nHello, $name\n\nYou have been added to Someplace's opt-in elist, The FooBar'ed. \n\nThe FooBar'ed is published occassionally.\n\nIf this subscription is an error click below and you will be removed.\nhttp://www.someplace.com/cgi-bin/foobar/option.cgi?$id\n \nThank you\n\n--\nGabriel Zappia, President\nWebZen, Inc.\n(207) 799-5221\n\nhttp://www.someplace.com"; mail_stuf($email, "joe@boo.com", "FooBar'ed confirmation", $welcome); } # Clean up $dbh->disconnect(); } ########################################################################## # A piec of html is grabbed from file and sent to stdout. sub piece { my $segment = shift; # Open the file. if (open (text1, $segment)) { # Prime line and print out the file. my $line = ; while ($line ne "") { print ($line,"\n") ; $line = ; }} # Close and exit. close text1; } ########################################################################## # This will concatenate any extra fields into an email to gabe. sub xtra_stuf { $xtra = undef; my %supres = ( "comment" => 1, "email" => 1, "type" => 1, "site" => 1, "xtra" => 1); ($name, undef) = split(/@/, $email); # If all is selected ignore the other 4 checkboxes. if (param('all')) { $supres{looksmart} = 1; $supres{odp} = 1; $supres{snap} = 1; $supres{yahoo} = 1; } # Reset the subject. $subject = "Inquiry from $name regarding $site.com"; # Build the extra fields string. for (param()) { if (!exists($supres{$_})) { $xtra_field = param($_); $xtra = "$xtra\n$_: $xtra_field"; }} # Return the xtra string. $xtra = "\n *** Original Message Follows *** \n$xtra\n\n"; } ########################################################################## ##########################################################################