2016-05-03 36 views
0

我有一個彪發送多個文件下面簡單的表格,發送電子郵件至:如何發送多個電子郵件附件

<form method="post" enctype="multipart/form-data"> 
      <input id="upload-file" class="upload-file" type="file" name="my_file[]" multiple> 
      <input type="submit" value="Send"> 
     </form> 

我使用下面的PHP代碼做實際的發送:

if (isset($_FILES['my_file'])) { 
     $to = '[email protected]'; 
     $subject = 'Files moar files'; 
     $message = 'Message Body'; 
     $headers = 'Some random email header'; 
     $attachments = array(); 
       $myFile = $_FILES['my_file']; 
       $fileCount = count($myFile["name"]); 
       for ($i = 0; $i < $fileCount; $i++) { 

        $attachments[$i] = $_FILES['my_file']['tmp_name'][$i]; 
       } 
     wp_mail($to, $subject, $message, $headers, $attachments); 
      } 

我正在使用wp_mail()方法,因爲這是在一個Wordpress網站(它與PHP郵件()函數相同)。 我的問題是,我收到附件的電子郵件,但文件名稱混亂,沒有擴展名,所以很難打開它。我在這裏做錯了什麼,我該如何解決?

+1

根據codex,附件數組應該只是一個文件名數組:https://developer.wordpress.org/reference/functions/wp_mail/ –

+0

'$ attachments屬性中的文件名必須是filesystem paths.' 如果你在談論這個 - 我知道。我正在使用tmp_name來獲取文件系統路徑,並且它工作正常,因爲我得到附件,它們就是我發送的。但是文件的名字是作爲臨時文件給出的名字eg:phpG0ChLP。這個名字缺少一個擴展名,所以你不能打開它,除非你知道它是什麼(JPG,PDF,等等)。 –

+0

我認爲你應該做一個var轉儲....我敢肯定你的意思是做$附件[$ i] = $ _FILES ['my_file'] [$ i] ['tmp_name'];' –

回答

2

當你用PHP上傳文件時,它們被上傳到一個臨時目錄並給出一個隨機的名字。這是存儲在每個文件的「tmp_name」鍵中的內容。它也解釋了爲什麼每個文件在通過電子郵件發送時沒有擴展名,因爲它們只是作爲文件存儲在臨時目錄中。原始文件名存儲在「名稱」鍵中。

處理這個問題最簡單的方法是將文件重命名爲相應的文件名併發送,因爲它似乎並不支持第二個字段爲每個文件提供文件名。

$uploaddir = '/var/www/uploads/'; //Or some other temporary location 
$myFile = $_FILES['my_file']; 
$fileCount = count($myFile["name"]); 
for ($i = 0; $i < $fileCount; $i++) { 
    $uploadfile = $uploaddir . basename($_FILES['my_file']['name'][$i]); 
    if (!move_uploaded_file($_FILES['my_file']['tmp_name'][$i], $uploadfile)) { 
     //If there is a potential file attack, stop processing files. 
     break; 
    } 
    $attachments[$i] = $uploadfile; 

} 
wp_mail($to, $subject, $message, $headers, $attachments); 

//clean up your temp files after sending 
foreach($attachments as $att) { 
    @unlink($att); 
} 

在處理文件時,驗證MIME類型並限制您支持的文件類型也是一種很好的做法。

WordPress的wp_mail:https://developer.wordpress.org/reference/functions/wp_mail/ PHP POST上傳:http://php.net/manual/en/features.file-upload.post-method.php

+0

非常感謝!這就是我一直在尋找的!我知道我做錯了什麼。我知道'['name']'存儲了文件的真實名稱,但是當我使用它時,它不會給我路徑(不像我認爲的路徑附帶的temp_name),所以我沒有收到文件。但用你的方法,它的效果很好。如果有人正在使用它,請記下爲文件設置的'$ uploaddir'。確保你的服務器有權限,否則你可能會遇到一些錯誤。 –

0

$附件=陣列();

array_push($附件,WP_CONTENT_DIR '/uploads/my-document.pdf'); array_push($ attachments, WP_CONTENT_DIR。'/uploads/my-file.zip');

這對我而言對於多個文件很有用! 祝你好運