2012-10-08 25 views
3

我正在製作一個PHP表單,允許用戶上傳附件並將其發送到我的電子郵件。我一直在尋找相當長的時間來完成它。 最後,我找到了這個。 http://www.shotdev.com/php/php-mail/php-send-email-upload-form-attachment-file/。它工作正常。 但是,當我自己修改它(更改字段)時,某些內容不太好。完成上傳附件之前發送的PHP郵件

<?php 

$location=$_POST['location']; 
$name_ha=$_POST['name_ha']; 
$name_person=$_POST['name_person']; 
$email=$_POST['email']; 
$date_sent=$_POST['date_sent']; 
$date_completed=$_POST['date_completed']; 
$date_received=$_POST['date_received']; 

$to="[email protected]" . "$email"; 

$message="to"; 

//*** Uniqid Session ***// 
$sid = md5(uniqid(time())); 

$header = ""; 
$header .= "From: ".$_POST["name_ha"]."<".$_POST["email"].">\nReply-To: ".$_POST["email"].""; 

$header .= "MIME-Version: 1.0\n"; 
$header .= "Content-Type: multipart/mixed; boundary=\"".$sid."\"\n\n"; 
$header .= "This is a multi-part message in MIME format.\n"; 

$header .= "--".$sid."\n"; 
$header .= "Content-type: text/html; charset=utf-8\n"; 
$header .= "Content-Transfer-Encoding: 7bit\n\n"; 
$header .= $message."\n\n"; 

//*** Attachment ***// 
if($_FILES["fileAttach"]["name"] != "") 
{ 
    $FilesName = $_FILES["fileAttach"]["name"]; 
    $Content = chunk_split(base64_encode(file_get_contents($_FILES["fileAttach"]["tmp_name"]))); 
    $header .= "--".$sid."\n"; 
    $header .= "Content-Type: application/octet-eam; name=\"".$FilesName."\"\n"; 
    $header .= "Content-Transfer-Encoding: base64\n"; 
    $header .= "Content-Disposition: attachment; filename=\"".$FilesName."\"\n\n"; 
    $header .= $Content."\n\n"; 
} 

$flgSend = @mail($to,"A new file for you!",null,$header); // @ = No Show Error // 

if ($flgSend) 
{ 
    echo "Mail sent."; 
} 

?> 

我從shotdev.com下載的文件和我修改的文件位於同一臺服務器上,位於同一文件夾下。 但是,對於我修改的那個,如果文件大小大於1MB,則會在附件上傳之前發送電子郵件(大約45%的上傳過程)。我收到的電子郵件中沒有附件,也沒有發件人的信息($ name_ha)。 另一方面,對於在shotdev.com上下載的文件,電子郵件只會在完整上傳附件後發送,不管它有多大。

腳本是否有任何錯誤,或缺少某些東西,導致此類事件發生?你的時間和幫助非常感謝。

+0

我需要測試這個,第一印象是你有一些頭文件的問題,我不喜歡這段代碼是如何完成的。 – Develoger

+0

我會首先回顧你所改變的問題。 –

+0

嚴重的是,如果你試圖使用附件,甚至不要嘗試使用PHP的內置'mail()'函數。你會花一輩子的時間努力使它正常工作。使用[phpMailer類](http://code.google.com/a/apache-extras.org/p/phpmailer/)會更好。另請參閱我的答案在這裏:http://stackoverflow.com/questions/12301358/send-attachments-with-php-mail/12302354#12302354 – SDC

回答

1

首先,在代碼中,你表現出如例子中,你在這一行有錯誤:

$to="[email protected]" . "$email"; 

將其更改爲:

$to="[email protected], " . "$email"; 
    您缺少
  • 注意逗號......這需要在那裏爲每一個新的收件人的電子郵件,你想以特定的方式添加...

另外我測試了我的服務器上的代碼,一切正常。
我有100 mbps上傳和嘗試的文件是4.5 MB,它的工作原理。

所以,也許你的上傳速度有問題,並且允許你打電話發送這封電子郵件的php腳本的執行時間。

嘗試添加以下<?php在PHP文件剛過您在HTML形式的行動=「something.php」設置好的:

set_time_limit(0); 

這就意味着,在腳本的執行時間沒有liimt,將0更改爲所需的秒數...

如果還有錯誤需要查看,請將@mail()函數刪除@,將它們隱藏起來對您沒有任何好處。

編輯:

我已經改變了你的代碼,以便它檢查,首先如果有文件,如果沒有發送郵件沒有依附。如果有文件,它會檢查其是否被編碼爲base64和splited在這種情況下,它與附件發送郵件...

<?php 

$location=$_POST['location']; 
$name_ha=$_POST['name_ha']; 
$name_person=$_POST['name_person']; 
$email=$_POST['email']; 
$date_sent=$_POST['date_sent']; 
$date_completed=$_POST['date_completed']; 
$date_received=$_POST['date_received']; 
$FilesName = $_FILES["fileAttach"]["name"]; 

$to = "[email protected]," . "$email"; 

$message = "to"; 

$sid = md5(uniqid(time())); 

$header = ""; 
$header .= "From: ".$_POST["name_ha"]."<".$_POST["email"].">\nReply-To: ".$_POST["email"].""; 

$header .= "MIME-Version: 1.0\n"; 
$header .= "Content-Type: multipart/mixed; boundary=\"".$sid."\"\n\n"; 
$header .= "This is a multi-part message in MIME format.\n"; 

$header .= "--".$sid."\n"; 
$header .= "Content-type: text/html; charset=utf-8\n"; 
$header .= "Content-Transfer-Encoding: 7bit\n\n"; 
$header .= $message."\n\n"; 


if($_FILES["fileAttach"]["name"] != "") { 


    $Content = chunk_split(base64_encode(file_get_contents($_FILES["fileAttach"]["tmp_name"]))); 
    $header .= "--".$sid."\n"; 
    $header .= "Content-Type: application/octet-stream; name=\"".$FilesName."\"\n"; 
    $header .= "Content-Transfer-Encoding: base64\n"; 
    $header .= "Content-Disposition: attachment; filename=\"".$FilesName."\"\n\n"; 
    $header .= $Content."\n\n"; 

} 

if (strlen($FilesName) > 0) { 

    if ($Content) { 

     $flgSend = mail($to,"Here is that file",null,$header); 

    } 
    else { 

     echo "problem with file..."; 

    } 

} 
else { 

    $flgSend = mail($to,"Here is that file",null,$header); 

} 

if ($flgSend) { 

    echo "Mail sent."; 

} 

?> 

這裏是HTML FOR IT:

<html> 
<head> 
</head> 
<body> 
<form method="post" action="sender.php" enctype="multipart/form-data" > 
    location: <input type="text" name="location" /> 
    <br /> 
    name_ha: <input type="text" name="name_ha" /> 
    <br /> 
    name_person: <input type="text" name="name_person" /> 
    <br /> 
    email: <input type="text" name="email" /> 
    <br /> 
    date_sent: <input type="text" name="date_sent" /> 
    <br /> 
    date_completed: <input type="text" name="date_completed" /> 
    <br /> 
    date_received: <input type="text" name="date_received" /> 
    <br /> 
    file: <input type="file" name="fileAttach" /> 
    <br /> 
    <input type="submit" value="submit" /> 
</form> 
</body> 
</html> 
+0

您的幫助是非常感謝。不幸的是,同樣的問題依然存在。表單的大小和sender.php的腳本會對它起作用嗎?或者所有關於連接問題?目前,我只是使用免費的網絡主機。我稍後將在我的PC上使用本地主機進行嘗試。 再次感謝大家的幫助。 – Sorx

+1

呃,一個「免費的網絡主機」是99%的問題!它們通常會限制可用資源......在我的服務器上完美工作並且在您使用的「免費虛擬主機」上失敗並不奇怪。 – Develoger