Solved

Attach a non-specific file type to an e-mail

Posted on 2000-04-04
6
212 Views
Last Modified: 2013-12-03
I am allowing the user to upload a file that will be attached to a form.  I want to allow this file to be any type.  How would I achieve this?  I was thinking of using MIME::Lite or MIME::Entity.

Please be specific in the exact coding of this.  I am still pretty new at Perl.  Thanks.
0
Comment
Question by:Benny00
  • 3
  • 2
6 Comments
 
LVL 3

Expert Comment

by:alien_life_form
ID: 2684143
Greetings.

If we're talking file upload through a  web form, you do not need to attach it via MIME. CGI.pm supplies a perfectly usable file upload field that can be used for this purpose.

You generate it like this:

print $query->start_multipart_form(...);

print $query->filefield(-name=>'uploaded_file',
                           -default=>'starting value',
                            -size=>50,
                            -maxlength=>80);
       
....

After that, the name of the field can be used like a file handle:

$filename = $query->param('uploaded_file');

while (<$filename>) {
  print;
}

You can desume type information thusly:

$filename = $query->param('uploaded_file');
$type = $query->uploadInfo($filename)->{'Content-Type'};


If, after the fact, you want to mail the uploaded file, yoou can indeed use MIME::Lite:

### Create a new multipart message:
$msg = MIME::Lite->new(
       From    =>'me@myhost.com',
       To      =>'you@yourhost.com',
       Cc      =>'some@other.com, some@more.com',
       Subject =>'A message with 2 parts...',
       Type    =>'multipart/mixed'

msg->attach(Type     =>'TEXT',  
            Data     =>"Here's the GIF file you wanted"
);  
msg->attach(Type     =>'image/gif',
            Path     =>'aaa000123.gif',
            Filename =>'logo.gif'
);

(Note: $fileame, as supplied by CGI.pm, has an - undocumented - method, $filename->tmpFileName(), that will give you the pathname of the temporary file that CGI itself  uses internally, and this can be handy in this predicamente)

You will use as type the info you gleaned from the upload form (or application/octet-stream in default). To actually send the message, you can get it in printable form as:

$str=$msg->as_string();

and then print it to a stream that you obtained with (say) Mail::Send.

Or, you can use the supplied $msg->send() that uses some heuristics to figure out how to send a message - you will have to trust the said heuristics, though.
Speaking from experience, you'll find out that uploading large files this way is quite inefficient. CGI.pm gives you a chance to limit the max size of the upload, by setting the $CGI::POST_MAX variable. (This still does not circumvent the inefficiency, though).


Cheers,
  alf

0
 
LVL 16

Accepted Solution

by:
maneshr earned 50 total points
ID: 2684296
Before each piece of code is an explanation of the different variables and their purpose

Necessary Form Fields:

There is only one form field that you must have in your form, for
FormMail to work correctly.  This is the recipient field.

Field:       recipient

Description: This form field allows you to specify to whom you wish for your
             form results to be mailed.  Most likely you will want to
             configure this option as a hidden form field with a value equal
             to that of your e-mail address.

Syntax: <input type=hidden name="recipient" value="email@your.host.com">

Optional Form Fields:

Field:       subject

Description: The subject field will allow you to specify the subject that you
             wish to appear in the e-mail that is sent to you after this form
             has been filled out.  If you do not have this option turned on,
            then the script will default to a message subject: WWW Form
             Submission

Syntax: If you wish to choose what the subject is:
<input type=hidden name="subject" value="Your Subject">

To allow the user to choose a subject: <input type=text name="subject">

Field:       email

Description: This form field will allow the user to specify their return
e-mail address.  If you want to be able to return e-mail to your
user, I strongly suggest that you include this form field and
allow them to fill it in.  This will be put into the From:
field of the message you receive.  If you want to require an
email address with valid syntax, add this field name to the
'required' field.
Syntax: <input type=text name="email">

Field:       realname

Description: The realname form field will allow the user to input their real
name.  This field is useful for identification purposes and will
also be put into the From: line of your message header.

Syntax: <input type=text name="realname">

Field:       redirect

Description: If you wish to redirect the user to a different URL, rather than
having them see the default response to the fill-out form, you
can use this hidden variable to send them to a pre-made HTML
page.

Syntax: To choose the URL they will end up at:
               <input type=hidden name="redirect" value="http://your.host.com/to/file.html">

To allow them to specify a URL they wish to travel to once the form is filled out:  <input type=text name="redirect">

There are many more fields that i can describe, but cannot die to the lack of space.
                 
=======================form.html
<form action="http://www.yoursite.com/cgi-bin/mail_lite.cgi" method="post">

<input type="hidden" name="recipient" value="email@yoursite.com">
<input type="hidden" name="required" value="email">
<input type="hidden" name="redirect" value="http://www.yoursite.com/thanks.htm">
<input type="hidden" name="missing_fields_redirect" value="http://www.yoursite.com/error.htm">
<input type="hidden" name="subject" value="Demo Request">
<input type="hidden" name="file" value="file.exe">

<div align="center"><center><p><font color="#000000" size="2">

Type your e-mail address here to <br>
have a demo e-mailed to you.</font><br>

<input maxLength="255" name="email" size="20"><br>
<input type="submit" value="Send Demo"></p>

</center></div>
</form>
===================================================

Files needed:

In script directory (i.e. www.yoursite.com/scripts):
automail_lite.cgi : This is the script file : chmod 755

In directory named 'automail' off of main script directory. (i.e. www.yoursite.
com/scripts/automail)
automail_lite.log : This is the counter log file : chmod 666
body.txt    : This is the body of the email that is to be sent
**YOUR FILES THAT YOU WISH TO ATTACH ALSO GET PLACED IN THE AUTOMAIL DIRECTORY*
*

Installation:
1. Place a form on your site that is formmail compatible (formmail instructions
 below).
   A simple example form is located in the 'exampleform.txt' file.
2. Chmod the scripts as above.
3. Change the first line of the script to the location of PERL on your system.
4. The following items need to be changed in the script, they are located
   just after the headers.
-----------------------
$mailprog
Defines the location of your sendmail program on your unix system.
$mailprog = '/usr/lib/sendmail';
-----------------------
$auto_type
This is your file attachment type. See mimetype.txt for a list of valid types.
$auto_type = 'application/octet-stream';
-----------------------
$auto_encoding
This is the encoding that will be used for your attachment. See encoding.txt
for a list of types. Most users will want 'base64'.
$auto_encoding = 'base64';
-----------------------
$auto_body
This is the body of your auto-response message.  It must be a text file. Be
sure to test how it looks when mailed for funny line-wrapping etc. Sometimes
text files don't translate into email readers very cleanly.
This file must also go in the automail directory (with the download file).
$auto_body = 'body.txt';
-----------------------
$message_type
This is your message type.  See encoding.txt for valid types and definitions.
Most users will want 'multipart/mixed' because you WILL have at least two parts
(the attachment and the message body) and most likely you are attaching a binar
y
file.
$message_type = 'multipart/mixed';
-----------------------
$log_or_email
Set this to 'L' for to keep log (stores email addresses only!)
Set this to 'E' to send a confirm email.
Set this to 'B' for both. (Recommended over 'L')
Set this to 'N' for neither.
$log_or_email = 'B';

NOTES: If you have a single field form, for just email input, a log file will
be sufficient to keep these on file for you. If you have other fields in the
form (i.e. name, address, etc) you MUST select 'E' or 'B' to send the form
to you or else the data will be lost. Also, if two users happen to submit at
the same time, it is possible that the 'L' option will not store the email
of the second user (to prevent log file corruption). This is only an issue
at high volume sites.
-----------------------
$email_log
This is the log file for storing your email addresses if you chose 'L'
or 'B' above. This file must also be located in the automail directory with
the attachment files (above).
$email_log = 'automail.log';
===============mail_lite.cgi
#!/usr/local/bin/perl
################################################
# This script will do the following:                                         #
# 1. Mail Lite will attach a file to a text body and auto-forward it     #
#    to the email address entered in the form.                               #
# 2. Includes Formmail. Formmail instructions are included at the end of     #
#    the Mail Lite instruction file. No formmail functions are changed.  #
# 3. In addition to the formmail functions, auto-responding is enabled.      #
# 4. Will either record the email address in a log file for you, or email    #
#    you a short letter stating the email address of the user.               #
################################################
# This script requires:                                                      #
# 1. The PERL Module called MIME::TOOLS, which contains MIME::ENTITY.        #
#    This module is used to make the e-mail attachments. You do not need to  #
#    do anything to use MIME::TOOLS, but you DO need to have access to it.   #
# 2. Sendmail.  This program actually sends the email.                       #
#                                                                            #
# If you can't find these programs yourself, check your service provider's   #
# website (which should list them), and lastly, contact your system          #
# administrator.                                                             #
################################################

$mailprog = '/usr/lib/sendmail';
$auto_type = 'image/gif';
$auto_encoding = 'base64';
$auto_body = 'body.txt';

$message_type = 'multipart/mixed';
$log_or_email = 'B';
$email_log = 'automail_lite.log';

##########################################################
# No changes need to be made after these lines
##########################################################
use MIME::Entity;

$Body = "Type your message body here.

Be aware of line wrapping.
I suggest that you use only 60 character wide rows.

This is a line of characters that is 60 characters long. :-)
123456789012345678901234567890123456789012345678901234567890
";

# Retrieve Date
&get_date;

# Parse Form Contents
&parse_form;

# Secure the $RealFile variable.  Removes possibility of backtracking
# up directories to grab other files from your website. Strips
# off all info up to last slash (/), if present.

$RealFile = $Config{'file'};
if ($RealFile =~ /\//) { ($RealFile) = $Config{'file'} =~ /^.*\/([^\/]+)$/g; }

# Check Required Fields
&check_required;

# Return HTML Page or Redirect User
&return_html;

# Send E-Mail
&send_mail;

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

##### Send File attachments to form user
    # First, format the email address for MIME::ENTITY

    # Create the top-level, and set up the mail headers:
    $top = build MIME::Entity Type => $message_type,
    From => $Config{'recipient'},
    To => $Config{'email'},
    Subject => $Config{'subject'};

    # Part #1: This is the body of the message:
    attach $top Data=> $Body;


    # Part #2: Make Attachment:
    attach $top Path => "./automail/$RealFile",
    Type => $auto_type,
    Encoding => $auto_encoding;

    # Send it:
    open MAIL, "|$mailprog -t -i" or die "open: $!";
    $top->print(\*MAIL);
    close MAIL;

#Check for preference on Log and confirmation message
    if    ($log_or_email eq 'L') { &update_log; }
    elsif ($log_or_email eq 'E') { &send_confirm; }
    elsif ($log_or_email eq 'B') {
    &send_confirm;
    &update_log; }
}

sub update_log {
##### Updates log file specified with the email address of the form user.

open (LOG, ">>./automail/$email_log") || &endIt;
print LOG "$email\n";
close (LOG);

}

sub send_confirm {
##### Send a confirmation message to site owner

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

    print MAIL "To: $Config{'recipient'}\n";
    print MAIL "From: $Config{'email'}\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 "On $date,\n";
    print MAIL "$Config{'realname'}$Config{'email'} requested $RealFile.\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";
            }
        }
    }

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

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


}

sub check_required {

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

    if (!$Config{'recipient'}) {
        if (!defined(%Form)) { &error('bad_referer') }
        else                 { &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})) {
            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_l
ink_title'}</a>\n";
            print "</ul>\n";
        }

        # Print the page footer.                                             #
        print <<"(END HTML FOOTER)";
        </body>
       </html>
(END HTML FOOTER)
    }
}

#Send mail went Here

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-Z]{2,3}|[0-9]{1,3})(\]?)$
/) {

        # 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]   #

    # send error submission to sendmail so can see what the problem is#

    local($print_config,$key,$sort_order,$sorted_field,$env_report);
    open(MAIL,"|$mailprog -t");
    print MAIL "To: $Config{'recipient'}\n";
   print MAIL "From: Error Submission\n";

    if ($Config{'subject'}) { print MAIL "Subject: $Config{'subject'}\n\n" }
    else                    { print MAIL "Subject: WWW Form Submission\n\n" }

    print MAIL "The following text was entered by a user\n";
    print MAIL "$Config{'email'}\n";
    print MAIL "on $date\n";
    close (MAIL);

        # 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>
  </center>
 </body>
</html>
(END ERROR HTML)
        }
        else {
            print <<"(END ERROR HTML)";
Content-type: text/html

<html>
 <head>
  <title>Mail Lite</title>
 </head>
 <body bgcolor=#FFFFFF text=#000000>
  <center>
  <center>
   <table border=0 width=600 bgcolor=#9C9C9C>
    <tr><th><font size=+2>FormMail</font></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 <t
t>POST</tt>.<p>

    </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: No Recipient</title>
 </head>
 <body bgcolor=#FFFFFF text=#000000>
  <center>
   <table border=0 width=600 bgcolor=#9C9C9C>
    <tr><th><font size=+2>Error: No Recipient</font></th></tr>
   </table>
  <table border=0 width=600 bgcolor=#CFCFCF>
    <tr><td>No Recipient was specified in the data sent to FormMail.  Please
     make sure you have filled in the 'recipient' form field with an e-mail
     address.  More information on filling in recipient form fields can be
     found in the README file.<hr size=1>

    </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>
    </td></tr>
   </table>
  </center>
 </body>
</html>
(END ERROR HTML)
        }
    }

    exit;
}

sub endIt # exit on error
{ exit;
} # end endIt
====================================================
0
 

Author Comment

by:Benny00
ID: 2685063
Ok...I am getting a file to send...I'm trying a MS Word File...Word won't open this file after it has been attached which leads me to believe something is getting goofed up in the transfer...Any ideas?

this is my code:



$msg = build MIME::Lite
             From => 'test@ac.com',
            To => 'benjamin.t.novak@c.com',
            Subject => 'Test',
            Type => 'multipart/mixed';
            
       attach $msg
             Type => 'TEXT',
             Data => "Testing testing testing";
            
       attach $msg
             Path => "/tmp/".$save_name,
            Filename => "$save_name",
            Type => "BINARY",
            Encoding => "base64";
                  
       $msg->send;
0
How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 
LVL 16

Expert Comment

by:maneshr
ID: 2685147
the file that you are sending is encoded using Mime's base 64 encoding.
to get the actual file you will first have to decode the file using base 64 decoding.

0
 

Author Comment

by:Benny00
ID: 2685164
I have found the problem...Unfortunately I do not know the answer...

The file is not being written correctly in the temp directory.  It ends up being a little small.  This is the code that writes out the file info...

Any ideas???

# spilt it so we can get the filename and extension
     @parts = split /(\\)|(\/)/,$filename;
     # get the last item from the array
       $save_name = @parts[$#parts];

     # open the file (make sure the web server account has write permissions on the directory)
      
     open(OUTFILE,">/tmp/".$save_name) or die("cannt copy image over ! ... $save_name".$!);
     # only set binmode if you are sure a binary file is coming over
     binmode OUTFILE;
     # use the filehandle $filename read it in and write it out to our OUTFILE
     while ($bytesread = read($filename,$buffer,1024))
     {
          print OUTFILE $buffer;
     }
0
 

Author Comment

by:Benny00
ID: 2686936
I'm a moron...All I had to do was close the file to make it work.
0

Featured Post

What Security Threats Are You Missing?

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

Suggested Solutions

Title # Comments Views Activity
Perl 101 11 68
perl to convert excel to csv 3 148
Perl string replace for refred url 9 57
Creating and Printing a Barcode C# 1 576
I have been pestered over the years to produce and distribute regular data extracts, and often the request have explicitly requested the data be emailed as an Excel attachement; specifically Excel, as it appears: CSV files confuse (no Red or Green h…
A year or so back I was asked to have a play with MongoDB; within half an hour I had downloaded (http://www.mongodb.org/downloads),  installed and started the daemon, and had a console window open. After an hour or two of playing at the command …
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…
Excel styles will make formatting consistent and let you apply and change formatting faster. In this tutorial, you'll learn how to use Excel's built-in styles, how to modify styles, and how to create your own. You'll also learn how to use your custo…

708 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

19 Experts available now in Live!

Get 1:1 Help Now