2012-01-19 174 views
2

我有一個帶有3個文本框的表單,用戶上傳至少1個文件及其詳細信息。唯一的問題是,當文件沒有上傳到服務器,它仍然發送沒有附件的電子郵件。我怎樣才能阻止這種情況,並且僅僅是我對照片和pdf的驗證足夠好?謝謝,我當前的代碼是:表單驗證PHP

$to="myemailaddress"; 
    $subject = "Subject of email"; 
    // get the sender's name and email address 
    // we'll just plug them a variable to be used later 
    $from = "<".stripslashes($_POST['customer_email']).">"; 
    // generate a random string to be used as the boundary marker 
    $mime_boundary="==Multipart_Boundary_x".md5(mt_rand())."x"; 
    // now we'll build the message headers 
    $headers = "From: $from\r\n" . 
    "MIME-Version: 1.0\r\n" . 
     "Content-Type: multipart/mixed;\r\n" . 
     " boundary=\"{$mime_boundary}\""; 
    // here, we'll start the message body. 
    // this is the text that will be displayed 
    // in the e-mail 
    $message = "$body\n"; 
    $message .="This is an automated email"; 
    $message .="Clients files attached:\n\n"; 

    // next, we'll build the invisible portion of the message body 
    // note that we insert two dashes in front of the MIME boundary 
    // when we use it 
    $message = "This is a multi-part message in MIME format.\n\n" . 
     "--{$mime_boundary}\n" . 
     "Content-Type: text/plain; charset=\"utf-8\"\n" . 
     "Content-Transfer-Encoding: 7bit\n\n" . 
    $message . "\n\n"; 
    // now we'll process our uploaded files 
    foreach($_FILES as $userfile){ 
     // store the file information to variables for easier access 
     $tmp_name = $userfile['tmp_name']; 
     $type = $userfile['type']; 
     $name = $userfile['name']; 
     $size = $userfile['size']; 

$allowedExtensions = array("pdf","jpg","jpeg", "png"); 

foreach ($_FILES as $userfile) { 
    if ($userfile['tmp_name'] > '') { 
     if (!in_array(end(explode(".", 
      strtolower($userfile['name']))), 
      $allowedExtensions)) { 
      echo "not an accepted file type"; 
      exit(); 
     } 
} 
} 

    // if the upload succeded, the file will exist 
     if (file_exists($tmp_name)){ 
     // check to make sure that it is an uploaded file and not a system file 
     if(is_uploaded_file($tmp_name)){ 

      // open the file for a binary read 
      $file = fopen($tmp_name,'rb'); 

      // read the file content into a variable 
      $data = fread($file,filesize($tmp_name)); 
      // close the file 
      fclose($file); 

      // now we encode it and split it into acceptable length lines 
      $data = chunk_split(base64_encode($data)); 
     } 

     // now we'll insert a boundary to indicate we're starting the attachment 
     // we have to specify the content type, file name, and disposition as 
     // an attachment, then add the file content. 
     // NOTE: we don't set another boundary to indicate that the end of the 
     // file has been reached here. we only want one boundary between each file 
     // we'll add the final one after the loop finishes. 
     $message .= "--{$mime_boundary}\n" . 
      "Content-Type: {$type};\n" . 
      " name=\"{$name}\"\n" . 
      "Content-Disposition: attachment;\n" . 
      " filename=\"{$fileatt_name}\"\n" . 
      "Content-Transfer-Encoding: base64\n\n" . 
     $data . "\n\n"; 
     } 
    } 
    // here's our closing mime boundary that indicates the last of the message 
    $message.="--{$mime_boundary}--\n"; 

    // now we just send the message 
    mail($to, $subject, $message, $headers); 
    echo "mail sent"; 
    } 

回答

1

唯一的問題我已經是當文件沒有上傳到服務器時,它仍然 發送電子郵件沒有附件。我怎麼能阻止呢?

通過驗證是否至少有一個上傳的文件。這可以是簡單的:

$thereIsAFile = false; 

// foreach ($_FILES ...) ... 
// attach file to email 
     $thereIsAFile = true; 
// ... 

if (!$thereIsAFile) { 
    exit; 
} 

是我的唯一的照片和PDF不夠好驗證?

不是。因爲您只查看文件擴展名。這根本不是驗證,文件名完全是任意的,並不一定與實際的文件內容有關。你應該通過MIME type驗證一個文件,你試圖找出適當的函數。例如見How to get the content-type of a file in PHP?