2012-03-30 212 views
0

我正在處理一個包含文件上傳的表單郵件,但該文件根本沒有顯示在測試電子郵件中。我調整了並重新調整了但無濟於事。有什麼建議麼?PHP文件上傳問題

形式的HTML部分被如下所示

<div class="contactleft"> 


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

     <div class="textbox"><span id="sprytextfield1"> 
      <label for="fname"></label> 
      <input name="fname" type="text" class="inputer" id="fname" /> 
      <span class="textfieldRequiredMsg">A value is required.</span></span></div><!-- End TectBox --> 
     <div class="textbox"><span id="sprytextfield2"> 
      <label for="lname"></label> 
      <input name="lname" type="text" class="inputer" id="lname" /> 
      <span class="textfieldRequiredMsg">A value is required.</span></span></div><!-- End TectBox --> 
     <div class="textbox"><span id="sprytextfield3"> 
      <label for="email"></label> 
      <input name="email" type="text" class="inputer" id="email" /> 
      <span class="textfieldRequiredMsg">A value is required.</span></span></div><!-- End TectBox --> 
     <div class="textbox"><span id="sprytextfield4"> 
      <label for="file"></label> 
      <label for="file"></label> 
      <label for="fileField"></label> 
      <input type="file" name="fileField" id="fileField" /> 
      <span class="textfieldRequiredMsg">A value is required.</span></span></div><!-- End TectBox --> 


     <div class="textbox"> 
      <label for="sender"></label> 
      <input type="submit" name="sender" id="sender" value="click to send message" /> 
     </div><!-- End TextBox --> 

      </form> 

    </div> 

並且被如下所示

<? 
    $mailto = '[email protected]'; // insert the email address you want the form sent to 
    //$returnpage = 'thanks.php'; // insert the name of the page/location you want the user to be returned to// 
    $sitename = '[siteripe.com]'; // insert the site name here, it will appear in the subject of your email 

/* Do not edit below this line unless you know what you're doing */ 

    $fname = $_POST['fname']; 
    $lname = $_POST['lname']; 
    $email = $_POST['email'] ; 
    $file = $_POST['file']; 
    $subject = $_POST['subject']; 


    if (!eregi("^[a-z0-9]+([-_\.]?[a-z0-9])[email protected][a-z0-9]+([-_\.]?[a-z0-9])+\.[a-z]{2,4}", $email)){ 
    print("<strong>Error:</strong> this email address is not in a valid format.<br/><br/><a href='javascript:history.go(-1)'>Back</a>"); 
     exit; 
    } 

    $message = "\n$name submitted the following message:\n\n$message\n\n$name's contact details are as follows:\n\nFirst Name: $fname\nLast Name: $lname\nEmail Address: $email\nForm: $file"; 

    mail($mailto, "$subject", $message, "From: $email"); 

?> 
+0

郵件函數返回成功的嘗試是$ var =郵件真..和看到的響應 – 2012-03-30 00:42:55

+0

嘛,$ _ POST [「文件」]總是會失敗,因爲你的文件上傳輸入被命名爲'fileField'。嘗試$ _POST ['fileField'],如果你在文件名後面。 – 2012-03-30 00:44:08

回答

1

您不能僅僅將$ file作爲$ message的一部分來傳遞,而無需添加一些額外的標頭,表明該電子郵件是「多部分」電子郵件,其中$ file作爲附件。

如果您想使用vanilla PHP,請查看docs以瞭解mail()函數,這裏有一些註釋可以告訴您如何執行您所要求的操作。

如果你願意看第三方庫,我會建議Zend Framework,他們有一個Zend_Mail_Attachment類,它提供了一個乾淨的界面,用於發送帶有附件的電子郵件。

0

郵寄者嘗試改變:

$file = $_POST['file']; 

到:

$file = $_POST['fileField']; 
0

這應該工作:

<html> 
    <head> 
     <title>Test</title> 
    </head> 
    <body> 
<? 
if(count($_POST) > 0){ 
    $mailto = '[email protected]'; // insert the email address you want the form sent to 
    //$returnpage = 'thanks.php'; // insert the name of the page/location you want the user to be returned to// 
    $sitename = '[siteripe.com]'; // insert the site name here, it will appear in the subject of your email 

/* Do not edit below this line unless you know what you're doing */ 

    $fname = $_POST['fname']; 
    $lname = $_POST['lname']; 
    $name = $lname . ', ' . $fname; 
    $email = $_POST['email'] ; 
    $subject = (array_key_exists('subject', $_POST))?$_POST['subject']:'Default subject'; 


    if ([email protected]("^[a-z0-9]+([-_\.]?[a-z0-9])[email protected][a-z0-9]+([-_\.]?[a-z0-9])+\.[a-z]{2,4}", $email)){ 
    print("<strong>Error:</strong> this email address is not in a valid format.<br/><br/><a href='javascript:history.go(-1)'>Back</a>"); 
     exit; 
    } 

    $message = "\n$name submitted the following message:\n\n...\n\n$name's contact details are as follows:\n\nFirst Name: $fname\nLast Name: $lname\nEmail Address: $email"; 


    $rand = md5(time()); 
    $mime_boundary = '==Multipart_Boundary_x' . $rand . 'x'; 

    if(array_key_exists('fileField', $_FILES)){ 
     if(is_file($_FILES['fileField']['tmp_name'])){ 
      $message .= "--{$mime_boundary}\n"; 
      $fp = @fopen($_FILES['fileField']['tmp_name'],"rb"); 
     $data = @fread($fp,filesize($_FILES['fileField']['tmp_name'])); 
        @fclose($fp); 
      $data = chunk_split(base64_encode($data)); 
      $message .= "Content-Type: application/octet-stream; name=\"".$_FILES['fileField']['tmp_name']."\"\n" . 
      "Content-Description: ".$_FILES['fileField']['name']."\n" . 
      "Content-Disposition: attachment;\n" . " filename=\"".$_FILES['fileField']['name']."\"; size=".filesize($_FILES['fileField']['tmp_name']).";\n" . 
      "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n"; 
      } 
     } 
    $message .= "--{$mime_boundary}--"; 

    $headers = 'From: ' . $email; 
    mail($mailto, "$subject", $message, $headers); 
} 
?> 
<div class="contactleft"> 
     <form action="" method="post" enctype="multipart/form-data" id="former"> 
     <div class="textbox"><span id="sprytextfield1"> 
      <label for="fname"></label> 
      <input name="fname" type="text" class="inputer" id="fname" /> 
      <span class="textfieldRequiredMsg">A value is required.</span></span></div><!-- End TectBox --> 
     <div class="textbox"><span id="sprytextfield2"> 
      <label for="lname"></label> 
      <input name="lname" type="text" class="inputer" id="lname" /> 
      <span class="textfieldRequiredMsg">A value is required.</span></span></div><!-- End TectBox --> 
     <div class="textbox"><span id="sprytextfield3"> 
      <label for="email"></label> 
      <input name="email" type="text" class="inputer" id="email" /> 
      <span class="textfieldRequiredMsg">A value is required.</span></span></div><!-- End TectBox --> 
     <div class="textbox"><span id="sprytextfield4"> 
      <label for="file"></label> 
      <label for="file"></label> 
      <label for="fileField"></label> 
      <input type="file" name="fileField" id="fileField" /> 
      <span class="textfieldRequiredMsg">A value is required.</span></span></div><!-- End TectBox --> 
     <div class="textbox"> 
      <label for="sender"></label> 
      <input type="submit" name="sender" id="sender" value="click to send message" /> 
     </div><!-- End TextBox --> 
      </form> 
    </div> 
    </body> 
</html> 
+0

您的代碼發生了一些更改,因爲有幾個E_NOTICE錯誤... – 2012-03-30 01:01:31

0

我還有我看到你做了mail()函數調用,但$文件不在它。我個人使用phpmailer類,然後聲明一個郵件對象,然後向它添加組件。

// SEND THANK YOU EMAIL 
include('class.phpmailer.php'); 
$mail = new PHPMailer(); 
// Sender is the Reply-Path address; seems important 
$mail->Sender = "[email protected]"; 
$mail->From  = "[email protected]"; 
$mail->FromName = "Ca Cycleworks automated e-mail"; 
// $mail->AddAddress() is the To: 
$blahtext=stripslashes($_SESSION['address_info']['b_first_name'])." ".stripslashes($_SESSION['address_info']['b_last_name']); 
$mail->AddAddress($_SESSION['address_info']['b_email'],$blahtext); 
$mail->AddReplyTo("[email protected]", "Ca Cycleworks Orders"); 
$subject = "Your Ca-Cycleworks.com Order # ".$_SESSION['order_number']." confirmation"; 
$mail->Subject = $subject; 
$mail->AltBody = $text_body; 
// ISO 8859-1 summary: http://www.btinternet.com/~andrew.murphy/html_character_set.html 
// 
// $Encoding 
//  PHPMailer::$Encoding in class.phpmailer.php 
//  Sets the Encoding of the message. Options for this are "8bit", "7bit", "binary", "base64", and "quoted-printable". 
// string $ContentType = "text/plain" (line 42) 
// False Sets ContentType = "text/html" or "text/plain" 
//$mail->IsHTML(false); 
$mail->Body = $body; 
$mail->IsSMTP(); 
$mail->SMTPAuth = true; 
$mail->Username = "[email protected]"; 
$mail->Password = "xxxxxxxxxxxx";