Search code examples
phphtmlemailphpmailer

How to get html form data into PHP to send an email


In my PHP code I have the following and these variables grab the data from a html form.

$name = @trim(stripslashes($_POST['name'])); 
$clientemail = @trim(stripslashes($_POST['email'])); 
$subject = @trim(stripslashes($_POST['subject'])); 
$message = @trim(stripslashes($_POST['message']));

however, if I remove the @ then all I see instead of a success message is "undefined" but if I keep the @ then I do get an email but it is a blank email....

Full Code:

<?php
// ini_set('display_errors', 'On');
// error_reporting(E_ALL);
   header('Content-type: application/json');

        // WE SHOULD ASSUME THAT THE EMAIL WAS NOT SENT AT FIRST UNTIL WE KNOW MORE.
        // WE ALSO ADD AN ATTACHMENT KEY TO OUR STATUS ARRAY TO INDICATE THE STATUS OF OUR ATTACHMENT:  
        $status = array(
                        'type'          =>'Error',
                        'message'       =>'Couldn\'t send the Email at this Time. Something went wrong',
                        'attachement'   =>'Couldn\'t attach the uploaded File to the Email.'
        );

//Added to deal with Files
require_once('/PHPMailer/class.phpmailer.php');\

    //      require_once('/PHPMailer/class.smtp.php');
    //Get the uploaded file information
    $name_of_uploaded_file =
        basename($_FILES['uploaded_file']['name']);

    //get the file extension of the file
    $type_of_uploaded_file =
        substr($name_of_uploaded_file,
        strrpos($name_of_uploaded_file, '.') + 1);

    $size_of_uploaded_file =
        $_FILES["uploaded_file"]["size"]/1024;//size in KBs

    //Settings
    $max_allowed_file_size = 10240; // size in KB
    $allowed_extensions = array("jpg", "jpeg", "gif", "bmp","png");

    //Validations
    if($size_of_uploaded_file > $max_allowed_file_size )
    {
      $errors .= "\n Size of file should be less than $max_allowed_file_size (~10MB). The file you attempted to upload is too large. To reduce the size, open the file in an image editor and change the Image Size and resave the file.";
    }

    //------ Validate the file extension -----
    $allowed_ext = false;
    for($i=0; $i<sizeof($allowed_extensions); $i++)
    {
      if(strcasecmp($allowed_extensions[$i],$type_of_uploaded_file) == 0)
      {
        $allowed_ext = true;
      }
    }

    if(!$allowed_ext)
    {
      $errors .= "\n The uploaded file is not supported file type. ".
      " Only the following file types are supported: ".implode(',',$allowed_extensions);
    }

    //copy the temp. uploaded file to uploads folder - make sure the folder exists on the server and has 777 as its permission
    $upload_folder = "/temp/";
    $path_of_uploaded_file = $upload_folder . $name_of_uploaded_file;
    $tmp_path = $_FILES["uploaded_file"]["tmp_name"];

    if(is_uploaded_file($tmp_path))
    {
      if(!copy($tmp_path,$path_of_uploaded_file))
      {
        $errors .= '\n error while copying the uploaded file';
      }
    }
//--end

$name = @trim(stripslashes($_POST['name'])); 
$clientemail = @trim(stripslashes($_POST['email'])); 
$subject = @trim(stripslashes($_POST['subject'])); 
$message = @trim(stripslashes($_POST['message']));

$body = 'Name: ' . $name . "\n\n" . 'Email: ' . $clientemail . "\n\n" .   'Subject: ' . $subject . "\n\n" . 'Message: ' . $message;
$email = new PHPMailer();   
$email->From      = $clientemail;
$email->FromName  = $name;
$email->Subject   = $subject;
$email->Body      = $body;  
$email->AddAddress( '[email protected]' ); //Send to this email

// EXPLICITLY TELL PHP-MAILER HOW TO SEND THE EMAIL... IN THIS CASE USING PHP   BUILT IT MAIL FUNCTION    
$email->isMail();

// THE AddAttachment METHOD RETURNS A BOOLEAN FLAG: TRUE WHEN ATTACHMENT WAS SUCCESSFUL & FALSE OTHERWISE:
// KNOWING THIS, WE MAY JUST USE IT WITHIN A CONDITIONAL BLOCK SUCH THAT 
// WHEN IT IS TRUE, WE UPDATE OUR STATUS ARRAY...   
if($email->AddAttachment( $path_of_uploaded_file , $name_of_uploaded_file )){
        $status['attachment']   = 'Uploaded File was successfully attached to the Email.';  
    }

// NOW, TRY TO SEND THE EMAIL ANYWAY:
    try{
        $success    = $email->send();
        $status['type']     = 'success';
        $status['message']  = 'Thank you for contact us. As early as possible  we will contact you.';   
    }catch(Exception $e){
        $status['type']     ='Error';
        $status['message']  ='Couldn\'t send the Email at this Time. Something went wrong';     
    }   

    // SIMPLY, RETURN THE JSON DATA...
die (json_encode($status));

HTML:

            <form id="main-contact-form" class="contact-form" name="contact-form" method="post" action="sendemail.php">
                <div class="col-sm-5 col-sm-offset-1">
                    <div class="form-group">
                        <label>Name *</label>
                        <input type="text" name="name" class="form-control" required="required">
                    </div>
                    <div class="form-group">
                        <label>Email *</label>
                        <input type="email" name="email" class="form-control" required="required">
                    </div>
                    <div class="form-group">
                        <label>Phone</label>
                        <input type="number" class="form-control">
                    </div>
                    <div class="form-group">
                        <label>Company Name</label>
                        <input type="text" class="form-control">
                    </div>                        
                </div>
                <div class="col-sm-5">
                    <div class="form-group">
                        <label>Subject *</label>
                        <input type="text" name="subject" class="form-control" required="required">
                    </div>
                    <div class="form-group">
                        <label>Message *</label>
                        <textarea name="message" id="message" required="required" class="form-control" rows="8" style="height:125px"></textarea>
                        <label for='uploaded_file' style="margin-top:10px">Select A Photo To Upload:</label>
                        <input type="file" name="uploaded_file">
                    </div>                        
                    <div class="form-group">
                        <button type="submit" name="submit" class="btn btn-primary btn-lg" required="required">Submit Message</button>
                    </div>
                </div>
            </form> 

Here is the AJAX that displays a message to the user when they click submit:

// Contact form
var form = $('#main-contact-form');
form.submit(function(event){
    event.preventDefault();
    var form_status = $('<div class="form_status"></div>');
    $.ajax({
        url: $(this).attr('action'),

        beforeSend: function(){
            form.prepend( form_status.html('<p><i class="fa fa-spinner fa-spin"></i> Email is sending...</p>').fadeIn() );
        }
    }).done(function(data){
        form_status.html('<p class="text-success">' + data.message + '</p>').delay(3000).fadeOut();
    });
});

Solution

  • You need to put the form data in the AJAX request.

    $.ajax({
        url: $(this).attr('action'),
        data: $(this).serialize(),
        beforeSend: function(){
            form.prepend( form_status.html('<p><i class="fa fa-spinner fa-spin"></i> Email is sending...</p>').fadeIn() );
        }
    })
    

    However, serialize() doesn't work with type="file" inputs. That's why you get an Undefined Index for $_FILES['uploaded_file']. You need to use FormData:

    $.ajax({
        url: $(this).attr('action'),
        data: new FormData(this),
        processData: false,
        contentType: false,
        beforeSend: function(){
            form.prepend( form_status.html('<p><i class="fa fa-spinner fa-spin"></i> Email is sending...</p>').fadeIn() );
        }
    })
    

    You also have a syntax error on this line:

    require_once('/PHPMailer/class.phpmailer.php');\
    

    Get rid of the slash at the end.

    See PHP: "Notice: Undefined variable", "Notice: Undefined index", and "Notice: Undefined offset" for information about all those warnings you're getting.