2012-01-19 9 views
2

사용자가 적어도 하나의 파일과 세부 정보를 업로드하는 3 개의 텍스트 상자가있는 양식이 있습니다. 내가 가진 유일한 문제는 파일이 서버에 업로드되지 않아도 첨부 파일없이 이메일을 보내는 것입니다. 나는 그것을 막을 수 있고 사진과 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?을 참조하십시오.