17

I have this following piece of code of PHPMailer. The problem is, that the file uploads to the server successfully but the attachment is not sent in the mail. The attachment code seems right to the best of my knowledge. Please review the code and let me know where have I gone wrong.

Form

<form name="contactform" method="post" action="send1.php" enctype="multipart/form-data">
<table width="100%" border="0">
<tr>
 <td id="ta">
 <label for="title">Title *</label>
 </td>
 <td id="ta">
 <select name="title">
 <option value="0">Title</option>
 <option value="1">Mr.</option>
 <option value="2">Ms.</option>
 <option value="3">Mrs.</option>
 </select></td></tr><tr><td id="ta">
  <label for="first_name">First Name *</label>
 </td>
 <td id="ta">
  <input  type="text" name="first_name" maxlength="50" size="30" required="required">
 </td>
</tr>
<tr>
 <td id="ta">
  <label for="last_name">Last Name *</label>
 </td>
 <td  id="ta">
  <input  type="text" name="last_name" maxlength="50" size="30" required="required">
 </td>
</tr>
<tr>
 <td id="ta">
  <label for="email">Email Address *</label>
 </td>
 <td  id="ta">
  <input  type="text" name="email" maxlength="80" size="30" required="required">
 </td>
</tr>
<tr>
 <td id="ta">
  <label for="telephone">Telephone Number *</label>
 </td>
 <td  id="ta">
  <input  type="text" name="telephone" maxlength="30" size="30" required="required">
 </td>
</tr>
<tr>
 <td id="ta">
  <label for="comments">Details</label>
 </td>
 <td  id="ta">
  <textarea  name="comments" maxlength="100000" cols="25" rows="6"></textarea>
 </td>
</tr>
<tr>
<td id="ta">
    <label for="file">Or upload a file (only word, excel or pdf)</label>
</td>
<td  id="ta">
<input type="file" name="file">
</td>
</tr>
<tr>
 <td colspan="2" style="text-align:center" id="ta">
  <input type="submit" value="Submit">
 </td>
</tr>
</table>
</form>

send1.php

<?php

require('PHPMailer/class.phpmailer.php');

if(isset($_POST['email'])) {

    // EDIT THE 2 LINES BELOW AS REQUIRED
    //$email_to = "hidden";
    //$email_subject = "Request for Portfolio check up from ".$first_name." ".$last_name;

    $title = array('Title', 'Mr.', 'Ms.', 'Mrs.');
    $selected_key = $_POST['title'];
    $selected_val = $title[$_POST['title']]; 

    $first_name = $_POST['first_name']; // required
    $last_name = $_POST['last_name']; // required
    $email_from = $_POST['email']; // required
    $telephone = $_POST['telephone']; // not required
    $comments = $_POST['comments']; // required

  if(($selected_key==0))
    echo "<script> alert('Please enter your title')</script>";
    function clean_string($string) {
      $bad = array("content-type","bcc:","to:","cc:","href");
      return str_replace($bad,"",$string);
    }
     $email_message = "";
    $email_message .="Title: ".$selected_val."\n";
    $email_message .= "First Name: ".clean_string($first_name)."\n";
    $email_message .= "Last Name: ".clean_string($last_name)."\n";
    $email_message .= "Email: ".clean_string($email_from)."\n";
    $email_message .= "Telephone: ".clean_string($telephone)."\n";
    $email_message .= "Comments: ".clean_string($comments)."\n";

    $allowedExts = array("doc", "docx", "xls", "xlsx", "pdf");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "application/pdf")
|| ($_FILES["file"]["type"] == "application/msword")
|| ($_FILES["file"]["type"] == "application/excel")
|| ($_FILES["file"]["type"] == "application/vnd.ms-excel")
|| ($_FILES["file"]["type"] == "application/x-excel")
|| ($_FILES["file"]["type"] == "application/x-msexcel")
|| ($_FILES["file"]["type"] == "application/vnd.openxmlformats-officedocument.wordprocessingml.document")
|| ($_FILES["file"]["type"] == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"))

&& in_array($extension, $allowedExts))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "<script>alert('Error: " . $_FILES["file"]["error"] ."')</script>";
    }
  else
    {
        $d='upload/';
        $de=$d . basename($_FILES['file']['name']);
    move_uploaded_file($_FILES["file"]["tmp_name"], $de);
$fileName = $_FILES['file']['name'];
    $filePath = $_FILES['file']['tmp_name'];
     //add only if the file is an upload
     }
  }
else
  {
  echo "<script>alert('Invalid file')</script>";
  }

// create email headers
$headers = 'From: '.$email_from."\r\n".
'Reply-To: '.$email_from."\r\n" .
'X-Mailer: PHP/' . phpversion();
//Create a new PHPMailer instance
$mail = new PHPMailer();
//Tell PHPMailer to use SMTP
$mail->IsSMTP();
//Enable SMTP debugging
// 0 = off (for production use)
// 1 = client messages
// 2 = client and server messages
$mail->SMTPDebug  = 0;
//Ask for HTML-friendly debug output
$mail->Debugoutput = 'html';
//Set the hostname of the mail server
$mail->Host       = "hidden";
//Set the SMTP port number - likely to be 25, 465 or 587
$mail->Port       = 25;
//Whether to use SMTP authentication
$mail->SMTPAuth   = true;
//Username to use for SMTP authentication
$mail->Username   = "hidden";
//Password to use for SMTP authentication
$mail->Password   = "hidden";
//Set who the message is to be sent from
$mail->SetFrom($email_from, $first_name.' '.$last_name);
//Set an alternative reply-to address
//$mail->AddReplyTo('replyto@example.com','First Last');
//Set who the message is to be sent to
$mail->AddAddress('hidden', 'hidden');
//Set the subject line
$mail->Subject = 'Request for Profile Check up';
//Read an HTML message body from an external file, convert referenced images to embedded, convert HTML into a basic plain-text alternative body
$mail->MsgHTML($email_message);
//Replace the plain text body with one created manually
$mail->AltBody = 'This is a plain-text message body';
//Attach an image file
//$mail->AddAttachment($file);
$mail->AddAttachment($_FILES['file']['tmp_name'], $_FILES['file']['name']);
//Send the message, check for errors
if(!$mail->Send()) {
  echo "<script>alert('Mailer Error: " . $mail->ErrorInfo."')</script>";
} else {
  echo "<script>alert('Your request has been submitted. We will contact you soon.')</script>";
  Header('Location: main.php');
}
}
?>

EDIT The mail sends successfully with all the details too. Just that the attachment won't send.

EDIT 2: SOLVED Changed $mail->MsgHTML to $mail->Body and it worked!

Ayush Khemka
  • 470
  • 2
  • 9
  • 22

1 Answers1

10

Change

$mail->MsgHTML();

to

$mail->Body;

Source: here

Community
  • 1
  • 1
  • for some reason I do not get, this really worked. there must be a problem with the additional headers that PhpMailer creates when adding the body – Asped May 25 '15 at 08:52