2016-05-03 4 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 mail()). Моя проблема в том, что я получаю письмо с вложениями, но имя файла перепутано, и нет расширения, поэтому его трудно открыть. Что я делаю неправильно здесь, и как я могу это исправить?

+1

в соответствии с кодом x, массив вложений должен быть просто массивом имен файлов: https://developer.wordpress.org/reference/functions/wp_mail/ –

+0

'Имена файлов в атрибуте $ attachments должны быть fileystem paths.' Если вы говорите об этом - я знаю. Я использую tmp_name для получения пути к файловой системе, и он работает, потому что я получаю вложения, и это то, что я отправляю. Но имя файла - это имя, указанное как временный файл, например: .phpG0ChLP. Это имя не имеет расширения, поэтому вы не можете его открыть, если не знаете, что это такое (jpg, pdf и т. Д.). –

+0

Я думаю, вы должны сделать дамп var. Я уверен, что вы хотели сделать '$ attachments [$ i] = $ _FILES ['my_file'] [$ i] ['tmp_name'];' –

ответ

2

При загрузке файлов на PHP они загружаются во временный каталог и задаются случайным именем. Это то, что хранится в ключе «tmp_name» для каждого из файлов. Это также объясняет, почему каждый файл не имеет расширения при отправке по электронной почте, поскольку они просто хранятся в виде файлов во временном каталоге. Исходное имя файла хранится в ключе «имя».

Самый простой способ справиться с этой проблемой - переименовать файлы в соответствующие имена файлов, а затем отправить их, потому что не похоже, что WordPress поддерживает второе поле для предоставления имени файла для каждого файла.

$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();

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

Это хорошо работает для меня для нескольких файлов! Удачи

Смежные вопросы