0

My Form is not sending image to my email. On the form the user can upload image and all the required information, but the image is not received, i only get the file name that was uploaded.

This is how the mail is received in my email:

Form details below

commentName: David Maxwell
email: greatken.richkid@gmail.com
website: 08036240369
photo: David.jpg
comments: Kudos

This is the php code for the form:

<?php
if(isset($_POST['email'])) {

    // CHANGE THE TWO LINES BELOW
    $email_to = "kennis_16@yahoo.com";        

    $email_subject = "form submission";

    function died($error) {
        // your error code can go here
        echo "We are sorry, Your comment couldn't be submitted. Please provide solution to error(s) below.<br /><br />";

        echo $error."<br /><br />";

        echo "Please go back and fix these errors.<br /><br />";
        die();
    }

    // validation expected data exists
    if(!isset($_POST['author']) ||
        !isset($_POST['email']) ||
        !isset($_POST['url']) ||
        !isset($_POST['photo']) ||
        !isset($_POST['comment'])
        ) 
        {
        died('We are sorry, but there appears to be a problem with the form you submitted.');       
    }

    $commentName = $_POST['author']; // required
    $email_from = $_POST['email']; // required
    $website = $_POST['url']; // required
    $photo = $_POST['photo'];
    $comments= $_POST['comment']; // required

    $error_message = "";
        $string_exp = "/^[A-Za-z .'-]+$/";
  if(!preg_match($string_exp,$commentName)) {
    $error_message .= 'The Name is empty, or does not appear to be valid.<br />';
  }
    $email_exp = '/^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/';
  if(!preg_match($email_exp,$email_from)) {
    $error_message .= 'Email Address is missing, or does not appear to be valid.<br />';
  }

        $string_exp = "/^[0-9+().-]+$/";
  if(!preg_match($string_exp,$website)) {
    $error_message .= 'Phone No is omitted, or does not appear to be valid.<br />';
  }

  if(strlen($comments) < 2) {
    $error_message .= 'Comment field cannot be left blank. Please enter your comment.<br />';
  }

  if(strlen($error_message) > 0) {
    died($error_message);
  }
    $email_message = "Form details below\n\n";

    function clean_string($string) {
      $bad = array("content-type","bcc:","to:","cc:","href");
      return str_replace($bad,"",$string);
    }

    $email_message .= "commentName: ".clean_string($commentName)."\n";
    $email_message .= "email: ".clean_string($email_from)."\n";
    $email_message .= "website: ".clean_string($website)."\n";
    $email_message .= "photo: ".clean_string($photo)."\n";
    $email_message .= "comments: ".clean_string($comments)."\n";

// create email headers
$headers = 'From: '.$email_from."\r\n".
'Reply-To: '.$email_from."\r\n" .
'X-Mailer: PHP/' . phpversion();
@mail($email_to, $email_subject, $email_message, $headers);  
?>

<!-- place your own success html below -->

Your comment will be reviewed before posting within 48hours. <a href='blog_post.html' style='text-decoration:none;color:#ff0099;'> Click Here </a> to return back.
<?php
}
die();
?>

This is the HTML code:

<html>
<body>

<!-- Comment Form -->
    <div id="respond" class="eleven columns row alpha">
        <h4>Leave a comment</h4>
        <form id="replyform" method="post" action="commentformprocessor.php">
        <div class="input_cm_wrapper">
            <h6 for="commentName">Name *</h6>
            <input type="text" name="author" id="reply_name" class="requiredfield"/>
        </div>
        <div class="input_cm_wrapper">  
            <h6 for="email">Email Address *</h6>            
            <input type="email" name="email" id="reply_email" class="requiredfield"/>
        </div>  
        <div class="input_cm_wrapper last"> 
            <h6 for="website">Phone No. *</h6>  
            <input type="text" name="url" id="reply_website" class="last"/>
        </div>  

            <span class="clear"></span>
            <h6 for="commentsText">Message * 
        <span>&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
            Upload Photo. * &nbsp&nbsp&nbsp
            <input type="file" name="photo" id="reply_photo" class="requiredfield" required style=""/>
            </span> </h6>
            <textarea name="comment" id="reply_message" class="requiredfield"></textarea>

            <span class="clear"></span><br>
            <button type="submit" onclick="alert ('Thank you for your comment. Please  make sure all required fields are completed.')" name="send">Send</button>

        </form>
    </div> 
</body>
</html>
Abdulla Nilam
  • 36,589
  • 17
  • 64
  • 85

2 Answers2

1

You cant assign image to variable and send it with mail. You need to do several steps

  1. Check whether image is in valid format (jpg, png...)
  2. Then upload it to sever
  3. then send it with attach

and in <form> you should use enctype="multipart/form-data"

<form id="" method="post" action="" enctype="multipart/form-data">

Check image is valid format

<?php
    $target_dir = "uploads/";
    $target_file = $target_dir . basename($_FILES["photo"]["name"]);
    $status = 1;
    $FileType = pathinfo($target_file,PATHINFO_EXTENSION);

// Allow certain file formats
    if($FileType != "jpg" && $FileType != "png" && $FileType != "jpeg")
    {
        echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
        $status = 0;
    }


// Check if $status is set to 1
    if ($status == 1) 
    {
        // if everything is ok, try to upload file
        if (move_uploaded_file($_FILES["photo"]["tmp_name"], $target_file)) 
        {
            echo "The file has been uploaded.";
        } else 
        {
            echo "Sorry, there was an error uploading your file.";
        }    

    } 
    else 
    {
        echo "Sorry, your file was not uploaded.";
    }
?>

Then get file path

<?php

$path = "uploads/".$_FILES["photo"]["tmp_name"];

?>

in mail

<img src="<?php echo $path ;?>" alt="">

Include this in email header

$header = "From:".$email_from."\nMIME-Version: 1.0\nContent-Type: text/html; charset=utf-8\n";
Abdulla Nilam
  • 36,589
  • 17
  • 64
  • 85
  • Many thanks @ Abdulla. please can you take a minute to explain how or the position I can add this new code to my existing code. thanks in advance, I await ur response – Ikechukwu Kenneth Onyinye Jul 22 '15 at 04:24
  • Also, I tried to follow up ur instructions by adding enctype="multipart/form-data"> and this is the response when the user submit the form : We are sorry, Your comment couldn't be submitted. Please provide solution to error(s) below. We are sorry, but there appears to be a problem with the form you submitted. Please go back and fix these errors. – Ikechukwu Kenneth Onyinye Jul 22 '15 at 05:57
1

Here is complete solution. I have kept it simply. You can add other codes later. I have tested the code and its working perfectly fine.

PHP part

<?php
$error_message = "";
if(isset($_POST['send'])) {


// CHANGE THE TWO LINES BELOW
$email_to = "kennis_16@yahoo.com";   


$email_subject = "form submission";

$commentName = $_POST['author']; // required
$email_from = $_POST['email']; // required
$website = $_POST['url']; // required
//$photo = $_POST['photo'];

$photoname=$_FILES['photo']['name'];
$tmp_name=$_FILES['photo']['tmp_name'];
$comments= $_POST['comment']; // required

if($commentName==""){
    echo "Empty author name";
}else if($email_from==""){
    echo "Empty email";
}
else{
 //create a folder name called img
 $destinationpath="img/".$photoname;
 $moveimage=move_uploaded_file($tmp_name,$destinationpath);


 if(!$moveimage){
  die("Error in uploading");
 }

  $message = "Form details below\n\n";


  $message .= "commentName: ".$commentName."\n";
  $message .= "email: ".$email_from."\n";
  $message .= "website: ".$website."\n";

  $message .= "comments: ".$comments."\n";


    // boundary 
    $semi_rand = md5(time()); 
    $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";



     // preparing attachments            
        $file = fopen($destinationpath,"rb");
        $f_contents = fread($file,filesize($destinationpath));
        $f_contents = chunk_split(base64_encode($f_contents));
       fclose($file);
        # Get a random 32 bit number using time() as seed.
     $num = md5( time() );

    # Define the main headers.
    $header = "From:xyz@somedomain.com\r\n";
    $header .= "MIME-Version: 1.0\r\n";
   $header .= "Content-Type: multipart/mixed; ";
   $header .= "boundary=$num\r\n";
   $header .= "--$num\r\n";

   # Define the message section
   $header .= "Content-Type: text/plain\r\n";

   $header .= "$message\r\n";
   $header .= "--$num\r\n";

   # Define the attachment section
   $header .= "Content-Type:  multipart/mixed; ";
   $header .= "name=\"$photoname\"\r\n";
   $header .= "Content-Transfer-Encoding:base64\r\n";
   $header .= "Content-Disposition:attachment; ";
   $header .= "filename=\"$photoname\"\r\n\n";
   $header .= "$f_contents \r\n";
   $header .= "--$num--";

      mail($email_to, $email_subject, $message, $header); 
           }
         ?>

      <!-- place your own success html below -->

   <h2>Your comment will be reviewed before posting within 48hours.
  </h2>
  <?php
   }

  ?>

And the html part inside body tag

  <!-- Comment Form -->
  <div id="respond" class="eleven columns row alpha">
  <h4>Leave a comment</h4>
  <form id="replyform" method="post" action="" enctype="multipart/form-data">
  <div class="input_cm_wrapper">
  <h6 for="commentName">Name *</h6>
  <input type="text" name="author" id="reply_name" class="required"/>
</div>
<div class="input_cm_wrapper">
  <h6 for="email">Email Address *</h6>
  <input type="email" name="email" id="reply_email" class="required"/>
</div>
<div class="input_cm_wrapper last">
  <h6 for="website">Phone No. *</h6>
  <input type="text" name="url" id="reply_website" class="last"/>
</div>
<span class="clear"></span>
  <h6 for="commentsText">
  Message *   <span>&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
  Upload Photo. * &nbsp&nbsp&nbsp
  <input type="file" name="photo" id="reply_photo" class="requiredfield"  required />
  </span> </h6>
<textarea name="comment" id="reply_message" class="requiredfield"></textarea>
<span class="clear"></span><br>
<button type="submit"  name="send">Send</button>
</form>
</div>

cheers

Blue Rose
  • 523
  • 1
  • 3
  • 14