0

I have PHP that takes input from a form and sends it as an email. However if no file is attached then i get the following errors:

How do I deal with that?

Errors:


Notice: Undefined index: uploaded_file in F:\CL2\sendemail.php on line 20

Notice: Undefined index: uploaded_file in F:\CL2\sendemail.php on line 28

Notice: Undefined variable: errors in F:\CL2\sendemail.php on line 53

Notice: Undefined index: uploaded_file in F:\CL2\sendemail.php on line 59
{"type":"success","message":"Thank you for contact us. As early as possible we will contact you.","attachement":"Couldn't attach the uploaded File to the Email."}

My HTML Code:

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

My Jquery Code:

// 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() )
        },
        data: $(this).serialize();
    }).done(function(data){
        form_status.html('<p class="text-success">' + data.message + '</p>').delay(3000).fadeOut();
    });
});

My PHP 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( 'root@localhost.com' ); //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));
Badrush
  • 1,247
  • 1
  • 17
  • 35
  • This is a better match to a duplicate question: http://stackoverflow.com/questions/946418/how-to-check-if-user-uploaded-a-file-in-php – devlin carnate May 26 '16 at 03:04

1 Answers1

2

check first if $_FILES['uploaded_file']['name'] is empty, then print a friendly error message if not in your php page:

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





if (!empty($_FILES['uploaded_file']['name'])){


//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 if (!empty($_FILES['uploaded_file']['name']))
//--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( 'root@localhost.com' ); //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));
Jeff Puckett
  • 37,464
  • 17
  • 118
  • 167
  • Okay, so when I add that code I get "no uploaded file" except that when no file is chosen I still want the email sent... – Badrush May 26 '16 at 03:05
  • 1
    @Badrush I have edited my answer to wrap the `if` statement around the upload file process. You should edit your question to include this requirement. – Jeff Puckett May 26 '16 at 03:13
  • I ended up using `if(isset($_FILES['uploaded_file']['name']))` and it worked but when I do try to attach a file it doesn't get attached...any ideas? I am using XAMPP and Mercury (email is setup correctly). I have a local folder called `temp` that my attachment should get uploaded to before being attached to the email. Also, the following lines also need an if statement.. `if($email->AddAttachment( $path_of_uploaded_file , $name_of_uploaded_file )){ $status['attachment'] = 'Uploaded File was successfully attached to the Email.'; }` – Badrush May 26 '16 at 03:17
  • i would add somewhere `if($_FILES['uploaded_file']['error'] = 0 )` – ArtisticPhoenix May 26 '16 at 03:32