Link to home
Start Free TrialLog in
Avatar of Rowby Goren
Rowby GorenFlag for United States of America

asked on

Adding incremental numbers to email handler

Hello Experts!

I need to add the following features to a standard email handler form. (For example, the Matt Scripts email handler or any similar one.)

1)  Every time a person submits the email I want the a number to be generated.  That number needs to be added to a HTML Thank You Page, an auto respond email to the visitor, and written along with the other form data to a text file on the web server.

2)  There is no 2.  That's it!

Let's say the number counter starts a 1000.  THe first email would start at 1000, the next time the submit button is hit by the next visitor the number 1001 is generated and so on.

I think that covers it.

Thanks

Rowby
Avatar of maneshr
maneshr

rowby,

"...Every time a person submits the email I want the a number to be generated.  That number needs to  be added to a HTML Thank You Page, an auto respond email to the visitor, and written along with the  other form data to a text file on the web server....."

Can you pl. post your current code here? Can you post the URL where one can see this code in action?

That will help you get a more accurate answer, faster.


Avatar of Rowby Goren

ASKER

Yes I guess that's a good idea.  

At the bottom of this comment you will see an UNMODIFIED formmail script directly from Matt's Script archives.  I have increased the Experts Points because I realize it's best to have the expert(s) here make the whole thing work. :)  (IF it's not enuf points, let me know and I will increase it again.)

This form will be for a parking lot site near LAX.  The actual web site it will appear on is http://www.laxautopark.com.  I'm the Webmaster.  There is NO form there now.  

An example of a non-parking lot site (but one that includes an incremental counter) can be found at one of my client's sites located at:  (Although this does NOT use perl):

http://www.foxrentacar.com/rates_reservations.html

Go ahead and make a test reservation at Fox Rent A Car.  After you hit the submit you will be taken to:

http://www.foxrentacar.com/rates_reservations.html?action=calcrate

Go ahead and fill the reservation.  Just use TEST and TEST for the first and last name. The reservation people will know that this is not a real reservation when they see TEST and TEST -- I use it all the time for testing.

After you hit the submit button you will be taken to a thank you page -- where you will see the incremental CONFIRMATION NUMBER.

So from the above you can see how a reservation number is generated.  

Also you can look at one of my client's competitor's sites.

http://airportparkinglots.com/losangelesairportparking/index.html   This form uses perl.

Using airportparkinglots.com as our actual example, the fields I would like to capture would be:

firstname, lastname, departure date - month, day (forget year), departure time a.m or p.m., return date - month, day (forget year), email address (for the autoresponder), and zip code.

However it does NOT have an incremental reservation number -- so that would have to be added.

When you submit this form you are taken to a thank you page that shows the reservations etc.

One thing that we do NOT need or want in the perl script is the calculation of the parking lot fees.  

I think that covers it all. And now below, directly from Matt's script archives is his unmodified formail script:  You don't have to use it, but at least it's a starting point:

#!/usr/bin/perl
##############################################################################
# FormMail                        Version 1.9                                #
# Copyright 1995-2001 Matt Wright mattw@worldwidemart.com                    #
# Created 06/09/95                Last Modified 08/03/01                     #
# Matt's Script Archive, Inc.:    http://www.worldwidemart.com/scripts/      #
##############################################################################
# COPYRIGHT NOTICE                                                           #
# Copyright 1995-2001 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           #
##############################################################################
# Define Variables                                                           #
#       Detailed Information Found In README File.                          #

# $mailprog defines the location of your sendmail program on your unix       #
# system.                                                                    #

$mailprog = '/usr/lib/sendmail';

# @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.        #

@referers = ('worldwidemart.com','206.31.72.203');

# @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 = @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');

# Done                                                                       #
##############################################################################

# Check Referring URL
&check_url;

# Retrieve Date
&get_date;

# Parse Form Contents
&parse_form;

# Check Required Fields
&check_required;

# Send E-Mail
&send_mail;

# Return HTML Page or Redirect User
&return_html;

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;

    # Format the date.                                                       #
    $date = "$days[$wday], $months[$mon] $mday, $year at $time";

}

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','');

    # 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'});
    }
    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.          #
        $name =~ tr/+/ /;
        $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

        $value =~ tr/+/ /;
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

        # If they try to include server side includes, erase them, so they
        # aren't a security risk if the html gets returned.  Another
        # security hole plugged up.
        $value =~ s/<!--(.|\n)*-->//g;

        # 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} && $value) {
                $Form{$name} = "$Form{$name}, $value";
            }
            elsif ($value) {
                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;

    # Split the configuration variables into individual field names.         #
    @Required = split(/,/,$Config{'required'});
    @Env_Report = split(/,/,$Config{'env_report'});
    @Print_Config = split(/,/,$Config{'print_config'});

    # 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;
}

sub check_required {

    # Localize the variables used in this subroutine.                        #
    local($require, @error);

    if ($Config{'subject'} =~ /(\n|\r)/m ||
        $Config{'recipient'} =~ /(\n|\r)/m) {
        &error('no_recipient');
    }

    if (!$Config{'recipient'}) {
        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;
        foreach $send_to (split(/,/,$Config{'recipient'})) {
            foreach $recipient (@recipients) {
                if ($send_to =~ /$recipient$/i) {
                    push(@send_to,$send_to); last;
                }
            }
        }
        if ($#send_to < 0) { &error('no_recipient') }
        $Config{'recipient'} = join(',',@send_to);
    }

    # 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})) {
            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}) {
                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 (!$Form{$require}) {
            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);

    # If redirect option is used, print the redirectional location header.   #
    if ($Config{'redirect'}) {
        print "Location: $Config{'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>$Config{'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>$Config{'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 $Config{'recipient'} on ";
        print "$date<p><hr size=1 width=75\%><p>\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}) {
                    print "<b>$field:</b> $Form{$field}<p>\n";
                }
            }
        }

        # 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}) {
                    print "<b>$sorted_field:</b> $Form{$sorted_field}<p>\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}) {
                    print "<b>$field:</b> $Form{$field}<p>\n";
                }
            }
        }

        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=\"$Config{'return_link_url'}\">$Config{'return_link_title'}</a>\n";
            print "</ul>\n";
        }

        # Print the page footer.                                             #
        print <<"(END HTML FOOTER)";
        <hr size=1 width=75%><p>
        <center><font size=-1><a href="http://www.worldwidemart.com/scripts/formmail.shtml">FormMail</a> V1.9 &copy; 1995 - 2001  Matt Wright<br>
A Free Product of <a href="http://www.worldwidemart.com/scripts/">Matt's Script Archive, Inc.</a></font></center>
        </body>
       </html>
(END HTML FOOTER)
    }
}

sub send_mail {
    # Localize variables used in this subroutine.                            #
    local($print_config,$key,$sort_order,$sorted_field,$env_report);

    # Open The Mail Program
    open(MAIL,"|$mailprog -t");

    print MAIL "To: $Config{'recipient'}\n";
    print MAIL "From: $Config{'email'} ($Config{'realname'})\n";

    # 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.  It was submitted by\n";
    print MAIL "$Config{'realname'} ($Config{'email'}) on $date\n";
    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 {
    # Initialize local email variable with input to subroutine.              #
    $email = $_[0];

    # 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.                                                            #
        return 0;
    }

    else {

        # Return a true value, e-mail verification passed.                   #
        return 1;
    }
}

sub body_attributes {
    # Check for Background Color
    if ($Config{'bgcolor'}) { print " bgcolor=\"$Config{'bgcolor'}\"" }

    # Check for Background Image
    if ($Config{'background'}) { print " background=\"$Config{'background'}\"" }

    # Check for Link Color
    if ($Config{'link_color'}) { print " link=\"$Config{'link_color'}\"" }

    # Check for Visited Link Color
    if ($Config{'vlink_color'}) { print " vlink=\"$Config{'vlink_color'}\"" }

    # Check for Active Link Color
    if ($Config{'alink_color'}) { print " alink=\"$Config{'alink_color'}\"" }

    # Check for Body Text Color
    if ($Config{'text_color'}) { print " text=\"$Config{'text_color'}\"" }
}

sub error {
    # Localize variables and assign subroutine input.                        #
    local($error,@error_fields) = @_;
    local($host,$missing_field,$missing_field_list);

    if ($error eq 'bad_referer') {
        if ($ENV{'HTTP_REFERER'} =~ m|^https?://([\w\.]+)|i) {
            $host = $1;
            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.worldwidemart.com/scripts/formmail.shtml">FormMail</a>
     resides at <tt>$ENV{'HTTP_REFERER'}</tt>, which is not allowed to access
     this cgi script.<p>

     If you are attempting to configure FormMail to run with this form, you need
     to add the following to \@referers, explained in detail in the README 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.worldwidemart.com/scripts/formmail.shtml">FormMail</a> V1.9 &copy; 1995 - 2001  Matt Wright<br>
      A Free Product of <a href="http://www.worldwidemart.com/scripts/">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>FormMail v1.9</title>
 </head>
 <body bgcolor=#FFFFFF text=#000000>
  <center>
   <table border=0 width=600 bgcolor=#9C9C9C>
    <tr><th><font size=+2>FormMail</font></th></tr>
   </table>
   <table border=0 width=600 bgcolor=#CFCFCF>
    <tr><th><tt><font size=+1>Copyright 1995 - 2001 Matt Wright<br>
        Version 1.9 - Released August 3, 2001<br>
        A Free Product of <a href="http://www.worldwidemart.com/scripts/">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.worldwidemart.com/scripts/formmail.shtml">FormMail</a> V1.9 &copy; 1995 - 2001  Matt Wright<br>
      A Free Product of <a href="http://www.worldwidemart.com/scripts/">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</font></th></tr>
   </table>
   <table border=0 width=600 bgcolor=#CFCFCF>
    <tr><td>There was no recipient or an invalid recipient specified in the data sent to FormMail.  Please
     make sure you have filled in the <tt>recipient</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.worldwidemart.com/scripts/formmail.shtml">FormMail</a> V1.9 &copy; 1995 - 2001  Matt Wright<br>
      A Free Product of <a href="http://www.worldwidemart.com/scripts/">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>
      <a href="http://www.worldwidemart.com/scripts/formmail.shtml">FormMail</a> V1.9 &copy; 1995 - 2001  Matt Wright<br>
      A Free Product of <a href="http://www.worldwidemart.com/scripts/">Matt's Script Archive, Inc.</a>
     </font></center>
    </td></tr>
   </table>
  </center>
 </body>
</html>
(END ERROR HTML)
        }
    }

    exit;
}




rowby,

"..The actual web site it will appear on is http://www.laxautopark.com. I'm the  Webmaster.  There is NO form there now.  ...."

Thanks for providing the info, albeit too much of it.

Let me know if my understanding is right.

* You are the Webmaster of http://www.laxautopark.com & want to write some custom Perl code for the site.
* On this page you have a button "Car Rentals" which points to http://www.foxrentacar.com
* When users reach this page & click on "Rates & Reservations" they are taken to http://www.foxrentacar.com/rates_reservations.html
* After competing the infor and clicking on the "Book it! (Only click once)" button you are currently sending out an email to the customer, with a copy to the rental company & showing a Thank you page to the customer. This same info is also written to a text file on your server.
* For the above you are using the exact script that you posted above.
* Now you want this script modified to have a counter (starting from 1000) included in the Thank you page, email to customer, email to Rental company & saved in the text file.


Thanks,
Hi  I see some clarification is necessary :)

1)  Yes, I am the webmaster for laxautopark.com and need to write some custome perl for that site.


2)  Foxrentacar.com has nothing to do with the form I need. I only included it as an example of a form (non-cgi) that uses a confirmation numbering system.  You can use the form on foxrentacar.com to see how that site makes it work -- as long as you use TEST for  your first and last name.  There will be NO links to or from foxrentacar.com for the script I am requesting.


3)  "* For the above you are using the exact script that you posted above."   No, we do not have a perl script written yet.  (The foxrentacar site uses a non-perl script.)


4)  I need Matt's formail script modified (or you can start from scratch if that is easier) to have a counter (starting from 1000) included in the Thank you

5)  Fields I need saved would be firstname, lastname, departure date - month, day (forget year), departure time a.m or p.m., return date
- month, day (forget year), email address (for the autoresponder), and zip code.

I hope that covers everthing -- if not, I'm here to answer your questions and clarify further.

Thanks

ROwby




rowby,

"..2) Foxrentacar.com has nothing to do with the form I need..,"

So then can you tell me which button, when clicked, will bring up this new HTML form?

Also, can you send me this new HTML form?

"..No, we do not have a perl  script written yet. ..."

Aha!! So you need a custom script (Matt's or from scratch)

".. There will be  NO links to or from foxrentacar.com for the script I am requesting...."

While its good to have a URL to see similar functionality, here the fox URL was confusing. I will *completely* ignore this URL.

"..Fields I need saved would be firstname, lastname, departure date - month, day (forget year), departure
                     time a.m or p.m., return date
                     - month, day (forget year), email address (for the autoresponder), and zip code...."

This is very useful info.

Hi,

I will create an HTML verison of the form within an hour or two and put it on the server and post it here.

THanks!

Rowby
rowby,

"..eate an HTML verison of the form within an hour or two a..."

Excellent!!! I will then look at it and post any further questions that i might have.

Thanks,
Hi,  
I put up a non-public HTML page for you to look at.

http://www.laxautopark.com/content/booking.htm

After the submit button is pushed the visitor will be taken to a Thank You page.

The following is an HTML verion of the Thank You page.

http://www.laxautopark.com/content/booking-thankyou.htm

The above is a "real" HTML page, but I assume it would have to be generated as HTML in the perl script.  

By the way, this server has the ability to have PHP enabled scripting too, so if you know PHP and would prefer to use PHP for the Thank Y ou page, that would be fine.

The same info that is on the Thank You page would go to:

1)  Customer's email address that they included in the form.
2)  A copy to the laxautopark.
3)  A text file on the server -- comma delimiated.


Thanks!

Rowby
rowby,

"..http://www.laxautopark.com/content/booking.htm..."

Excellent!! I will write the script to do the things you want. However, i will not put in any code for data validations, but put a placeholder there, which you can fill in later.

"..http://www.laxautopark.com/content/booking-thankyou.htm..."

Good to have this page for reference. i will output the HTML per this page.

".., this server has the ability to have PHP en..."

i will be excusively using Perl for this script.

"..Customer's email address that they included in the form...."

What operating system are you on? Do you have the SMTP Perl module on your server? What MTA do you have on your server?

"..A text file on the server -- comma delimiated...."

i am assuming each new entry will be appended to the file, right?

Let me know.
Operating system: Unix  Specifically: Cobalt Linux RaQ4
Hosting Appliance.  

Yes, the server has the SMTP Perl module.

Not sure what you mean by MTA.  If you can tell me more of what you mean I'll ask the hosting company.

Thanks again:

Rowby
rowby,

"..Yes, the server has the SMTP Perl module. ..."

Please keep the mailhost name for the SMTP server handy with you. You will need it with the final code.

"..Not sure what you mean by MTA.  If you can tell me more of what you mean I'll ask the hosting company...."

MTA = Message Transfer Agent.

In a nutshell do you have sendmail installed on your server? If so, can you get the full path to sendmail from your hosting co.?

Let me know.
Yes, sendmail is installed.  Here's the full path:

/usr/sbin/sendmail

Thanks again!


Rowby
rowby,

"../usr/sbin/sendmail.."

Super!!! Couldn't have asked for a better news.

Based on all the input you have provided, i will write a fresh new script to do the foll.

* Get user input from the HTML form
* Allow various user validations (placeholder).
* Increment counter.
* Show user a HTML page (based on the sample above) with the counter.
* Email user, with a copy to any other email id you want, both with the counter.
* Append the info in a comma-delimited file.

Let me know if i have missed anything here.
Hi,  
I put up a non-public HTML page for you to look at.

http://www.laxautopark.com/content/booking.htm

After the submit button is pushed the visitor will be taken to a Thank You page.

The following is an HTML verion of the Thank You page.

http://www.laxautopark.com/content/booking-thankyou.htm

The above is a "real" HTML page, but I assume it would have to be generated as HTML in the perl script.  

By the way, this server has the ability to have PHP enabled scripting too, so if you know PHP and would prefer to use PHP for the Thank Y ou page, that would be fine.

The same info that is on the Thank You page would go to:

1)  Customer's email address that they included in the form.
2)  A copy to the laxautopark.
3)  A text file on the server -- comma delimiated.


Thanks!

Rowby
Hi,  
I put up a non-public HTML page for you to look at.

http://www.laxautopark.com/content/booking.htm

After the submit button is pushed the visitor will be taken to a Thank You page.

The following is an HTML verion of the Thank You page.

http://www.laxautopark.com/content/booking-thankyou.htm

The above is a "real" HTML page, but I assume it would have to be generated as HTML in the perl script.  

By the way, this server has the ability to have PHP enabled scripting too, so if you know PHP and would prefer to use PHP for the Thank Y ou page, that would be fine.

The same info that is on the Thank You page would go to:

1)  Customer's email address that they included in the form.
2)  A copy to the laxautopark.
3)  A text file on the server -- comma delimiated.


Thanks!

Rowby
You have everything correct.  

I'll be gone for a few hours -- so in case you have any questions, I can't reply for a few hours.

Thanks


Rowbhy
rowby,

Here is the first working version of the Perl script that will be called by the HTML page you created.

The only thing that it does is automatically increment the counter  & show the HTML output.
i want you to try this on your server and let me know how it works.

If all is ok, then i will complete the email & write to comma-delimited parts.

NOTE: i have commented the code so that you will find it easier to understand the same.

Let me know.
===========parkcgi.pl
#!/usr/local/bin/perl

##     Disable output buffering
$|++;

##     Print the MIME header.
print "Content-type: text/html\n\n";

use CGI;
use Net::SMTP;

##     Full path to the sendmail file.
$mailprog ="/usr/lib/sendmail";

##     Full path to the counter file.
$ctr_file='/tmp/ctr';

##     Hard-coded from email id
$from='rowby@rowby.com';

##     Hard-coded of the Rental company
$cc='fox@rental.com';

##     Create a new CGI object
$query=new CGI;

##     Read the incoming HTML form elements.
foreach ($query->param){
     $$_=$query->param($_);
}

##     Placeholder for doing all data validations here

##     End of placeholder for doing all data validations here

##     Now that data validation is completed, successfully, we will increment the counter.
##     Check if the counter file exists.
if (open(CTR,$ctr_file)){     ##     Exists. Use it!!
     ##     Open the file with a shared lock, to prevent simultaneous access.
     flock(CTR,1) || die $!;
     $counter=<CTR>;     ##     Read the counter.
     chomp($counter);     ##     Remove the newline character.
}else{     ##     Does not exist. Create one!!
     $counter=1000;     ##     Lets start from this number.
}

close(CTR);

##     Increment the counter.
$counter++;

##     Now write this new value back to the file.
##     But remember to lock this file for exculsive use, to prevent simultaneous access.
open(CTR,"> $ctr_file")|| die $!;
flock(CTR,2) || die $!;
print CTR     $counter."\n";
close(CTR);

##     Start sending out the emails!!
##     End of sending out the emails!!

##     Now that we have sent the email out, lets print the HTML page.
print qq{
<p align="center"><font face="Arial, Helvetica, sans-serif" size="3"><b>Thank
You for your Parking Reservation</b></font>
<p align="center"><font face="Arial, Helvetica, sans-serif" size="3">Please
print this page out for your reference.</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">We
have emailed a confirmation email to the address you provided in
your form.</font>
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left"><b><font face="Arial, Helvetica, sans-serif">CONFIRMATION
NUMBER: $counter</font></b>
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Name:
$FirstName $LastName</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Departure
date: $DepartMonth $DepartDay, $yeardropoff, $DepartHour:$DepartMinute $DepartDT</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Return
date: $ReturnMonth $ReturnDay, $yeardropoff, $ReturnHour:$ReturnMinute $ReturnDT</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Email
address: $Email</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Zip
code: $Zip</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Corporate
code: $TACode</font>
<p align="left">
<p align="left">
<p align="left">
<p align="center"><br>
</p>
};
Hi am at a client's tonight. I'll incorporate your code in the morning.

THanks for the quick response!

Rowby
Avatar of ozo
                 ##     Now write this new value back to the file.
                  ##     But remember to lock this file for exculsive use, to prevent simultaneous access.
                  open(CTR,"> $ctr_file")|| die $!;
Careful, at this point an empty file has been written,
Someone could read it now before it is locked
                  flock(CTR,2) || die $!;
                  print CTR     $counter."\n";
Hi,

Got your fix.  Will incorporate it when I get to the office today.  And we can check it live.

Rowby
Hi,

The script appears to be working fine!  I can't check the email because I won't be at fox until Wednesday.

Should I modify the script with ozo's snippet?

From: ozo  Date: 11/19/2001 11:10PM PST  
                 ##     Now write this new value back to the file.
                 ##     But remember to lock this file for exculsive use, to prevent simultaneous access.
                 open(CTR,"> $ctr_file")|| die $!;
Careful, at this point an empty file has been written,
Someone could read it now before it is locked
                 flock(CTR,2) || die $!;
                 print CTR     $counter."\n";  
====================================

Here is the link to the current draft of the form:

http://www.laxautopark.com/content/booking.htm

When I return to the fox office tomorrow I will do the proper links to the form fields.

And assuming it all works excellently as it is now, I will gratefully award maneshr the points.
rowby,

"..The script appears to be working fine! ..."

Excellent!! I have posted the entire code below.

NOTE: Remember to change the directory path, email ids and other server specific settings as per your servers settings.

"..Should I modify the script with ozo's snippet?...."

If you dont mind, let me post my entire code & then you can decide whether or not to do that.

"..When I return to the fox office tomorrow I will do the proper links to the form fields...."

The following script does all the things you want. I have tested this code & can confirm that it works fine.

NOTE: i have commented the code throughly, so that you will find it easier to understand & maintain the same.

==========parkcgi.pl
#!/usr/local/bin/perl

##      Disable output buffering
$|++;

##      Print the MIME header.
print "Content-type: text/html\n\n";

use CGI;

##      Full path to the sendmail file.
$mailprog ="/usr/lib/sendmail";

##      Full path to the comma-delimited output file.
$out_file='/tmp/comma_out';

##      Full path to the counter file.
$ctr_file='/tmp/ctr';

##      Hard-coded from email id
$from='rowby@rowby.com';

##      Hard-coded of the Rental company
$cc='fox_rental@fox.com';

##      Create a new CGI object
$query=new CGI;

##      Read the incoming HTML form elements.
foreach ($query->param){
      $$_=$query->param($_);
}

##      Set default value for Corporate Code
$TACode='None' if (!($TACode));

##      Placeholder for doing all data validations here

##      End of placeholder for doing all data validations here

##      Now that data validation is completed, successfully, we will increment the counter.
##      Check if the counter file exists.
if (open(CTR,$ctr_file)){      ##      Exists. Use it!!
      ##      Open the file with a shared lock, to prevent simultaneous access.
      flock(CTR,1) || die $!;
      $counter=<CTR>;      ##      Read the counter.
      chomp($counter);      ##      Remove the newline character.
}else{      ##      Does not exist. Create one!!
      $counter=1000;      ##      Lets start from this number.
}

close(CTR);

##      Increment the counter.
$counter++;

##      Now write this new value back to the file.
open(CTR,"> $ctr_file")|| die $!;
##      But remember to lock this file for exculsive use, to prevent simultaneous access.
flock(CTR,2) || die $!;
print CTR      $counter."\n";
close(CTR);

##      Now write this new record to the comma-delimited file.
open(DELIM,">> $out_file")|| die $!;
##      But remember to lock this file for exculsive use, to prevent simultaneous access.
flock(DELIM,2) || die $!;

print DELIM join(',',$counter,$FirstName,$LastName,$DepartMonth,$DepartDay,$DepartHour.':'.$DepartMinute.' '.$DepartDT,$ReturnMonth,$ReturnDay,$ReturnHour.':'.$ReturnMinute.' '.$ReturnDT,$Email,$Zip)."\n";

close(DELIM);

##      Start sending out the emails!!
open(MAIL, "| $mailprog -t ") || die $!;
print MAIL "To: $to\n";
print MAIL "From: $from\n";
print MAIL "CC: $cc\n";
print MAIL "Subject: Confirmation e-mail from Rowby (# $counter)!\n";
print MAIL qq{

Thank You for your Parking Reservation

Please print this page out for your reference.

We have emailed a confirmation email to the address you provided in your form.

CONFIRMATION NUMBER: $counter

Name: $FirstName $LastName

Departure date: $DepartMonth $DepartDay, $yeardropoff, $DepartHour:$DepartMinute $DepartDT

Return date: $ReturnMonth $ReturnDay, $yeardropoff, $ReturnHour:$ReturnMinute $ReturnDT

Email address: $Email

Zip code: $Zip

Corporate code: $TACode
};

close(MAIL);

##      Now that we have sent the email out, lets print the HTML page.
print qq{
<p align="center"><font face="Arial, Helvetica, sans-serif" size="3"><b>Thank
You for your Parking Reservation</b></font>
<p align="center"><font face="Arial, Helvetica, sans-serif" size="3">Please
print this page out for your reference.</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">We
have emailed a confirmation email to the address you provided in
your form.</font>
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left"><b><font face="Arial, Helvetica, sans-serif">CONFIRMATION
NUMBER: $counter</font></b>
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Name:
$FirstName $LastName</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Departure
date: $DepartMonth $DepartDay, $yeardropoff, $DepartHour:$DepartMinute $DepartDT</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Return
date: $ReturnMonth $ReturnDay, $yeardropoff, $ReturnHour:$ReturnMinute $ReturnDT</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Email
address: $Email</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Zip
code: $Zip</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Corporate
code: $TACode</font>
<p align="left">
<p align="left">
<p align="left">
<p align="center"><br>
</p>
};
Added your code. It's working fine.  I'll confirm the emails when I get to the office on Wednesday.  

Thanks again.  We're getting there (or are already there!)

Rowby
rowby,

"... It's working fine.  "

Excellent!! Great news.

"...I'll confirm the emails when I get to the office on Wednesday. ..."

No problem. Take your time, but do let me know.

"..Thanks again.  We're getting there (or are already there!)..."

You're welcome.

Looking forward to your reply.

Thanks,
Client did a test and commented that a customer can put in a date that is past and the confirmation will still come up.

Is this something that could be handled in perl -- or is it a javascript function?

(I would prefer it be in perl if possible.)

Rowby
rowby,

"..a date that is past and the confirmation  will still come up...."

Yes. Please refer to my earlier comments on data validations.

The script only has placeholders for validations. You will have to add the validations.

"...Is this something that could be handled in perl -- or is it a javascript function?..."

Can be done in Javascript or Perl.

"..(I would prefer it be in perl if possible.)..."

Absolutely agree. i would prefer that too. That way the business logic is in one single location & you are not tied in to various browsers and other issues, as you would be if you were to use Javascript.

Hope that helps.
Good!
Hi,

Here at the client's office.  For some reason the emails are not being sent to the visitor and to the client.

Here is the current version of the script.  Note that I changed the location to perl and modified the email addresses.  

Also (and maybe this has something to do with the problem), where is the tmp folder so I can look at the comma-deliminated file.  Do I have to create that folder?

Thanks!

Rowby


====

#!/usr/bin/perl

##     Disable output buffering
$|++;

##     Print the MIME header.
print "Content-type: text/html\n\n";

use CGI;

##     Full path to the sendmail file.
$mailprog ="/usr/lib/sendmail";

##     Full path to the comma-delimited output file.
$out_file='/tmp/comma_out';

##     Full path to the counter file.
$ctr_file='/tmp/ctr';

##     Hard-coded from email id
$from='service@laxautopark.com';

##     Hard-coded of the Rental company
$cc='service@laxautopark.com';

##     Create a new CGI object
$query=new CGI;

##     Read the incoming HTML form elements.
foreach ($query->param){
     $$_=$query->param($_);
}

##     Set default value for Corporate Code
$TACode='None' if (!($TACode));

##     Placeholder for doing all data validations here

##     End of placeholder for doing all data validations here

##     Now that data validation is completed, successfully, we will increment the counter.
##     Check if the counter file exists.
if (open(CTR,$ctr_file)){     ##     Exists. Use it!!
     ##     Open the file with a shared lock, to prevent simultaneous access.
     flock(CTR,1) || die $!;
     $counter=<CTR>;     ##     Read the counter.
     chomp($counter);     ##     Remove the newline character.
}else{     ##     Does not exist. Create one!!
     $counter=1000;     ##     Lets start from this number.
}

close(CTR);

##     Increment the counter.
$counter++;

##     Now write this new value back to the file.
open(CTR,"> $ctr_file")|| die $!;
##     But remember to lock this file for exculsive use, to prevent simultaneous access.
flock(CTR,2) || die $!;
print CTR     $counter."\n";
close(CTR);

##     Now write this new record to the comma-delimited file.
open(DELIM,">> $out_file")|| die $!;
##     But remember to lock this file for exculsive use, to prevent simultaneous access.
flock(DELIM,2) || die $!;

print DELIM join(',',$counter,$FirstName,$LastName,$DepartMonth,$DepartDay,$DepartHour.':'.$DepartMinute.'
'.$DepartDT,$ReturnMonth,$ReturnDay,$ReturnHour.':'.$ReturnMinute.' '.$ReturnDT,$Email,$Zip)."\n";

close(DELIM);

##     Start sending out the emails!!
open(MAIL, "| $mailprog -t ") || die $!;
print MAIL "To: $to\n";
print MAIL "From: $from\n";
print MAIL "CC: $cc\n";
print MAIL "Subject: Confirmation e-mail from Rowby (# $counter)!\n";
print MAIL qq{

Thank You for your Parking Reservation

Please print this page out for your reference.

We have emailed a confirmation email to the address you provided in your form.

CONFIRMATION NUMBER: $counter

Name: $FirstName $LastName

Departure date: $DepartMonth $DepartDay, $yeardropoff, $DepartHour:$DepartMinute $DepartDT

Return date: $ReturnMonth $ReturnDay, $yeardropoff, $ReturnHour:$ReturnMinute $ReturnDT

Email address: $Email

Zip code: $Zip

Corporate code: $TACode
};

close(MAIL);

##     Now that we have sent the email out, lets print the HTML page.
print qq{
<p align="center"><font face="Arial, Helvetica, sans-serif" size="3"><b>Thank
You for your Parking Reservation</b></font>
<p align="center"><font face="Arial, Helvetica, sans-serif" size="3">Please
print this page out for your reference.</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">We
have emailed a confirmation email to the address you provided in
your form.</font>
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left"><b><font face="Arial, Helvetica, sans-serif">CONFIRMATION
NUMBER: $counter</font></b>
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Name:
$FirstName $LastName</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Departure
date: $DepartMonth $DepartDay, $yeardropoff, $DepartHour:$DepartMinute $DepartDT</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Return
date: $ReturnMonth $ReturnDay, $yeardropoff, $ReturnHour:$ReturnMinute $ReturnDT</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Email
address: $Email</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Zip
code: $Zip</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Corporate
code: $TACode</font>
<p align="left">
<p align="left">
<p align="left">
<p align="center"><br>
</p>
};
rowby,

".. For some reason the emails are not being sent to the visitor and to the  client...."

I am not sure why this happens, but i when i tested this same script on my server (with my email ids) it worked just super. Let me know if you have an email id (hotmail or yahoo etc..) that i can enter on the form and send out the email.

That way you should be able to confirm my observations.

".. where is the tmp folder so I can look at  the comma-deliminated file.  Do I have to create that folder?..."

The tmp folder is where the files are stored. It can be *any* folder on the server that you want.

It is meant to be customized, like you changed the $from & $cc variables.

Hope that clarfies things.
Hi

I just set up a hotmail account called foxrowby@hotmail.com

I'll also set up that temporary directory variable.

Thanks

Rowby
rowby,

"..I just set up a hotmail account called foxrowby@hotmail.com.."

Look out for an email from maneshr@ee.com in your hotmail Inbox.

Let me know how it goes.
Make that 2 emails, with conf # 1001 & 1002.
Yes, both emails are in the hotmail box.

Maybe it has to do with my comma_out file.  I'll set up the proper path to that and see if it fixes the problem.

Rowby
rowby,

"..Yes, both emails are in the hotmail box..."

As expected.

"..  I'll set up the proper path to that and see if it fixes  the problem.."

Sure. Hope you get the script working on your server soon.

Thanks,

HI,

Yes, just checked and the reservations are it is getting written to the text file.

This seems like a server issue. I'll contact the hosting company.

And I'll report back here.

Rowby
ASKER CERTIFIED SOLUTION
Avatar of maneshr
maneshr

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Thank you. I will continue to pose any updates (regarding the server issue) here, if Experts Exchange allows it.

I may want some additonal features added to this script on Monday and will post a new question here for you.

Happy Thanksgiving Maneshr!

Rowby
rowby,

"..Thank you. .."

You're welcome.

".. if Experts Exchange allows it...."
Yes. EE does allow comments to be added to questions that have been closed.

"..will post a new question here  for you.."

Sure. Looking forward to the same.

"..Happy Thanksgiving Maneshr!..."

Happy Thanksgiving to your too :-)

Rgds,
Before I contacted the hosting company I tried out another email program (bignose bird's email program).  It resulted in the same problem regarding sndmail.  The bignose bird email program had an option to use localhost instead of sendmail and that worked fine -- sending out both the confirmation email and an email to the laxautopark.com.

How can I modify your reservation.cgi script to use "localhost" instead of sndmail.

Rowby

Here is the specific code in the bignosebird form that worked for laxautopark.com's emails:


====================================================
#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="/usr/lib/sendmail -t";
if( 0 ){
#maneshr, you should know better than to give rowby code that can corrupt the counter.
#Please change
                  ##     Now that data validation is completed, successfully, we will increment the counter.
                  ##     Check if the counter file exists.
                  if (open(CTR,$ctr_file)){     ##     Exists. Use it!!
                      ##     Open the file with a shared lock, to prevent simultaneous access.
                      flock(CTR,1) || die $!;
                      $counter=<CTR>;     ##     Read the counter.
                      chomp($counter);     ##     Remove the newline character.
                  }else{     ##     Does not exist. Create one!!
                      $counter=1000;     ##     Lets start from this number.
                  }

                  close(CTR);
                  ##     Increment the counter.
                  $counter++;

                  ##     Now write this new value back to the file.
                  open(CTR,"> $ctr_file")|| die $!;
                  ##     But remember to lock this file for exculsive use, to prevent simultaneous access.
                  #sleep 2; # here we are vulnerable
                  flock(CTR,2) || die $!;
                  print CTR     $counter."\n";
                  close(CTR);

}else{
#to something safer, like:

                  ##     Now that data validation is completed, successfully, we will increment the counter.
                  ##     Check if the counter file exists.
                  if (open(CTR,"+<$ctr_file")){     ##     Exists. Use it!!
                      ##     Open the file with a exclusive lock, to prevent simultaneous access.
                      flock(CTR,2) || die $!;
                      $counter=<CTR>;     ##     Read the counter.
                      chomp($counter);     ##     Remove the newline character.
                  }else{     ##     Does not exist. Create one!!
                      open(CTR,"+>$ctr_file");
                      flock(CTR,2) || die $!;
                      $counter=1000;     ##     Lets start from this number.
                  }


                  ##     Increment the counter.
                  $counter++;

                  ##     Now write this new value back to the file.

                  seek CTR,0,0;
                  ##     But remember to lock this file for exculsive use, to prevent simultaneous access.
                  print CTR     $counter."\n";
                  close(CTR);
}
ozo,

"..#maneshr, you should know better than to give rowby code that can corrupt the counter..."

Your majesty, Thanks for your comments.

Hope rowby finds it useful.

Rgds,
Ah, I have witnessed an exchange between Ye Experts.

I will modify the code.

Sill am awaiting what I need to do to switch from SNDMAIL to "local host" -- which might have been missed due to the last couple of exchanges between ozo and maneshr.

Below is a copy and paste of my recent comment:

Before I contacted the hosting company I tried out another email program (bignose bird's email program).
 It resulted in the same problem regarding sndmail.  The bignose bird email program had an option to
use localhost instead of sendmail and that worked fine -- sending out both the confirmation email and
an email to the laxautopark.com.

How can I modify your reservation.cgi script to use "localhost" instead of sndmail.

Here is the specific code in the bignosebird form that worked for laxautopark.com's emails:


====================================================
#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="/usr/lib/sendmail -t";

Before I contacted the hosting company I tried out another email program (bignose bird's email program).  It resulted in the same problem regarding sndmail.  The bignose bird email program had an option to use localhost instead of sendmail and that worked fine -- sending out both the confirmation email and an email to the laxautopark.com.

How can I modify your reservation.cgi script to use "localhost" instead of sndmail.

Rowby

Before I contacted the hosting company I tried out another email program (bignose bird's email program).  It resulted in the same problem regarding sndmail.  The bignose bird email program had an option to use localhost instead of sendmail and that worked fine -- sending out both the confirmation email and an email to the laxautopark.com.

How can I modify your reservation.cgi script to use "localhost" instead of sndmail.

Rowby

Could you repost the script. I don't know much about perl, but it appears that  the version here on Experts Exchange apparenlty does not define $to.

I may be 100 percent wrong, but maybe that is the problem.

Rowby
Hi  maneshr

Can you clarify the problem I am having with sndmail - perhaps if you can modify the script to use "localhost" -- if that is even possible.

Also it appears that the version of the script I am using does not devine $to.  Maybe that is the problem.

THanks

Rowby
rowby,

".. The bignose bird email program had an option to
                     use localhost instead of sendmail and that worked fine -- sending out both the confirmation email and
                     an email to the laxautopark.com.

                     How can I modify your reservation.cgi script to use "localhost" instead of sndmail....."

i have not seen the bignosebird script. Therefore, i am not sure what is the nature, & extent, of the changes required.

Hence i would suggest you post a new question to address this new script.

That way you will have more experts look at it and try to suggest solutions.

Hope that helps.
Hi,

Will do!

Rowby
Here's the final version that is working now, with a slight modification by myself:  (I will later add modifications suggested by Ozo.

#!/usr/bin/perl

##     Disable output buffering
$|++;

##     Print the MIME header.
print "Content-type: text/html\n\n";

use CGI;

##     Full path to the sendmail file.
$mailprog ="/usr/sbin/sendmail";


##     Full path to the comma-delimited output file.
$out_file='/tmp/comma_out';

##     Full path to the counter file.
$ctr_file='/tmp/ctr';

##     Hard-coded from email id
$from='rowby@rowby.com';

##     Hard-coded of the Rental company
$cc='rowby@rowby.com';

##     Create a new CGI object
$query=new CGI;

##     Read the incoming HTML form elements.
foreach ($query->param){
  $$_=$query->param($_);
}

##     Set default value for Corporate Code
$TACode='None' if (!($TACode));

##     Placeholder for doing all data validations here

##     End of placeholder for doing all data validations here

##     Now that data validation is completed, successfully, we will increment the counter.
##     Check if the counter file exists.
if (open(CTR,$ctr_file)){     ##     Exists. Use it!!
  ##     Open the file with a shared lock, to prevent simultaneous access.
  flock(CTR,1) || die $!;
  $counter=<CTR>;     ##     Read the counter.
  chomp($counter);     ##     Remove the newline character.
}else{     ##     Does not exist. Create one!!
  $counter=1000;     ##     Lets start from this number.
}

close(CTR);

##     Increment the counter.
$counter++;

##     Now write this new value back to the file.
open(CTR,"> $ctr_file")|| die $!;
##     But remember to lock this file for exculsive use, to prevent simultaneous access.
flock(CTR,2) || die $!;
print CTR     $counter."\n";
close(CTR);

##     Now write this new record to the comma-delimited file.
open(DELIM,">> $out_file")|| die $!;
##     But remember to lock this file for exculsive use, to prevent simultaneous access.
flock(DELIM,2) || die $!;

print DELIM join(',',$counter,$FirstName,$LastName,$DepartMonth,$DepartDay,$DepartHour.':'.$DepartMinute.'



'.$DepartDT,$ReturnMonth,$ReturnDay,$ReturnHour.':'.$ReturnMinute.' '.$ReturnDT,$Email,$Zip)."\n";

close(DELIM);

##     Start sending out the emails!!
open(MAIL, "| $mailprog -t ") || die $!;
print MAIL "To: $Email\n";
print MAIL "From: $from\n";
print MAIL "Subject: Confirmation e-mail from Rowby (# $counter)!\n";
print MAIL qq{

Thank You for your Parking Reservation

Please print this page out for your reference.

We have emailed a confirmation email to the address you provided in your form.

CONFIRMATION NUMBER: $counter

Name: $FirstName $LastName

Departure date: $DepartMonth $DepartDay, $yeardropoff, $DepartHour:$DepartMinute $DepartDT

Return date: $ReturnMonth $ReturnDay, $yeardropoff, $ReturnHour:$ReturnMinute $ReturnDT

Email address: $Email

Zip code: $Zip

Corporate code: $TACode
};

close(MAIL);

### rowby added below

##     Start sending out the emails!!
open(MAIL, "| $mailprog -t ") || die $!;
print MAIL "To: rowby\@rowby.com\n";
print MAIL "From: $from\n";
print MAIL "Subject: To LAX Reservation Dept (# $counter)!\n";
print MAIL qq{

Thank You for your Parking Reservation

Please print this page out for your reference.

We have emailed a confirmation email to the address you provided in your form.

CONFIRMATION NUMBER: $counter

Name: $FirstName $LastName

Departure date: $DepartMonth $DepartDay, $yeardropoff, $DepartHour:$DepartMinute $DepartDT

Return date: $ReturnMonth $ReturnDay, $yeardropoff, $ReturnHour:$ReturnMinute $ReturnDT

Email address: $Email

Zip code: $Zip

Corporate code: $TACode
};

close(MAIL);
###  end of rowby

##     Now that we have sent the email out, lets print the HTML page.
print qq{
<p align="center"><font face="Arial, Helvetica, sans-serif" size="3"><b>Thank
You for your Parking Reservation</b></font>
<p align="center"><font face="Arial, Helvetica, sans-serif" size="3">Please
print this page out for your reference.</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">We
have emailed a confirmation email to the address you provided in
your form.</font>
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left"><b><font face="Arial, Helvetica, sans-serif">CONFIRMATION
NUMBER: $counter</font></b>
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left">
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Name:
$FirstName $LastName</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Departure
date: $DepartMonth $DepartDay, $yeardropoff, $DepartHour:$DepartMinute $DepartDT</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Return
date: $ReturnMonth $ReturnDay, $yeardropoff, $ReturnHour:$ReturnMinute $ReturnDT</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Email
address: $Email</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Zip
code: $Zip</font>
<p align="left"><font face="Arial, Helvetica, sans-serif" size="3">Corporate
code: $TACode</font>
<p align="left">
<p align="left">
<p align="left">
<p align="center"><br>
</p>
};