0

PHP contact form is sending encoded text on email body. The email contains an attachment and some text from input fields. The message must be decoded before its sent. How can I decode the "$message" with right text that is inputted?

Please have a look at the code given below:

if (isset($_POST['submit'])) {
if ($_POST['email'] == '' || $_FILES['file_upload'] == '' || $_POST["fname"] == '' || $_POST["lname"] == '' || $_POST["message"] == '') {
    echo '<p class="red-info">Please Fill All The Fields</p>';

} else {

    $from_email      = $_POST['email']; //from mail, it is mandatory with some hosts
    $recipient_email = 'myemail@gmail.com'; //recipient email (most cases it is your personal email)

    //Capture POST data from HTML form and Sanitize them,
    $sender_fname   = filter_var($_POST["fname"], FILTER_SANITIZE_STRING); //sender name
    $sender_lname   = filter_var($_POST["fname"], FILTER_SANITIZE_STRING); //sender name
    $sender_phone_1 = filter_var($_POST["phone_1"], FILTER_SANITIZE_STRING); //sender name
    $sender_phone_2 = filter_var($_POST["phone_2"], FILTER_SANITIZE_STRING); //sender name
    $sender_phone_3 = filter_var($_POST["phone_3"], FILTER_SANITIZE_STRING); //sender name
    $sender_phone   = $sender_phone_1 . ' ' . $sender_phone_2 . ' ' . $sender_phone_3; //sender name
    $reply_to_email = filter_var($_POST["email"], FILTER_SANITIZE_STRING); //sender email used in "reply-to" header
    $subject        = 'Contact Form'; //get subject from HTML form
    $message        = filter_var($_POST["message"], FILTER_SANITIZE_STRING); //message

    /* //don't forget to validate empty fields
    if(strlen($sender_name)<1){
    die('Name is too short or empty!');
    }
    */

    //Get uploaded file data
    $file_tmp_name = $_FILES['file_upload']['tmp_name'];
    $file_name     = $_FILES['file_upload']['name'];
    $file_size     = $_FILES['file_upload']['size'];
    $file_type     = $_FILES['file_upload']['type'];
    $file_error    = $_FILES['file_upload']['error'];

    if ($file_error > 0) {
        die('Upload error or No files uploaded');
    }
    //read from the uploaded file & base64_encode content for the mail
    $handle  = fopen($file_tmp_name, "r");
    $content = fread($handle, $file_size);
    fclose($handle);
    $encoded_content = chunk_split(base64_encode($content));

    $boundary = md5("sanwebe");
    //header
    $headers  = "MIME-Version: 1.0\r\n";
    $headers .= "From:" . $from_email . "\r\n";
    $headers .= "Reply-To: " . $reply_to_email . "" . "\r\n";
    $headers .= "Content-Type: multipart/mixed; boundary = $boundary\r\n\r\n";

    //plain text
    $body = "--$boundary\r\n";
    $body .= "Content-Type: text/plain; charset=ISO-8859-1\r\n";
    $body .= "Content-Transfer-Encoding: base64\r\n\r\n";
    $body .= "<br />First Name:" . $sender_fname;
    $body .= "<br />Last Name:" . $sender_lname;
    $body .= "<br />Phone:" . $sender_phone;
    $body .= "<br />Message:";
    $body .= chunk_split(base64_encode($message));

    //attachment
    $body .= "--$boundary\r\n";
    $body .= "Content-Type: $file_type; name=" . $file_name . "\r\n";
    $body .= "Content-Disposition: attachment; filename=" . $file_name . "\r\n";
    $body .= "Content-Transfer-Encoding: base64\r\n";
    $body .= "X-Attachment-Id: " . rand(1000, 99999) . "\r\n\r\n";
    $body .= $encoded_content;

    $sentMail = mail($recipient_email, $subject, $body, $headers);
    if (isset($sentMail)) //output success or failure messages
        {
        echo '<p class="green-info">Your Email Has Been Submitted!We will contact soon.</p>';
        echo "<script>document.contact.reset();</script>";
        header("location: contect.php");
    } else {
        die('Could not send mail! Please check your PHP mail configuration.');
    }
}

}

Blauharley
  • 4,186
  • 6
  • 28
  • 47

2 Answers2

0

Have you tried setting the content type ?

$headers .= "Content-Type: text/html;";
Coffee coder
  • 162
  • 1
  • 1
  • 9
  • Not yet..Let me check :) – Amit Kollol Dey Feb 19 '17 at 18:32
  • I have set this on the header.But is $headers .= "Content-Type: multipart/mixed; boundary = $boundary\r\n\r\n"; and $headers .= "Content-Type: text/html;"; work together ?I need to send attachment as well with the text – Amit Kollol Dey Feb 19 '17 at 18:47
  • @AmitKollolDey found [this](http://stackoverflow.com/a/3984262/4285276) – Coffee coder Feb 19 '17 at 18:54
  • I have checked the link and set the header to $headers .= "Content-Type: multipart/alternative; boundary = $boundary\r\n\r\n"; .Still getting encoded text for the message like this YW1pdCBhbWl0 – Amit Kollol Dey Feb 19 '17 at 19:03
0

Changed to this and that worked thanks :)

        $headers  = "MIME-Version: 1.0\r\n";
        $headers .= "From:" . $from_email . "\r\n";
        $headers .= "Reply-To: " . $reply_to_email . "" . "\r\n";
        $headers .= "Content-Type: multipart/alternative; boundary = $boundary\r\n\r\n"; 

        //plain text
        $body = "--$boundary\r\n";
        $body .= "Content-Type: text/plain; charset=ISO-8859-1\r\n";
        $body .= "Content-Transfer-Encoding: base64\r\n\r\n";
        $body .= "\n First Name:" . $sender_fname;
        $body .= "\n Last Name:" . $sender_lname;
        $body .= "\n Phone:" . $sender_phone; 
        $body .= "\n Message:" .$message;
        $body .= chunk_split(base64_encode());