2015-11-29 3 views
0

Я создаю службу рассылки. Мне нужно добавить динамически один или несколько файлов в электронное письмо, используя php, phpmailer и только один «слот» для добавления файлов в форму html. Я просто знаю, как отправить одно вложение, а не два или более, в том же письме.Phpmailer: несколько динамических приложений в одной форме

здесь у являются HTML-код:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
</head> 
    <body> 
     <div class="main_container"> 

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

        <div class="form_title"> 
         <h2>Mailing List</h2> 
        </div> 

        <div class="form_title"> 
         <p>Message:</p> 
        </div> 

        <label for="message"> 
         <textarea name="message"></textarea> 
        </label> 

        <label for="file"> 
         Select one or more file to send 
         <input name="file" type="file" id="file_ok"> 
        </label> 

        <div class="submit-container"> 
         <input class="submit-button" type="submit" name="submit" value="Invia"><br> 
        </div> 

       </form> 

     </div> 
    </body> 
</html> 

и PHP для PHPMailer (sendmail.php, она работает с сервисом хостинга Я являюсь usign):

<?php 
require_once('libs/PHPMailer/PHPMailerAutoload.php'); 


$db= new PDO('mysql:host=00.000.000.000;dbname=dbname_1', 'dbname', 'dbpass');//connection setup 

$m_list = $db->query(" 
    SELECT id, nome, email 
    FROM mailing_list 
")->fetchAll(PDO::FETCH_ASSOC); 


$mail    = new PHPMailer(true); 

$mail->Port = 25; 
$mail->CharSet = 'UTF-8'; 


//variables 
$email_receiver = $m_list['email']; 
$name_receiver = $m_list['nome']; 

$nome_sender= "mr x"; 
$messagge= stripslashes($_POST['message']); 

foreach ($m_list as $eachmail) { 

    $email_receiver = $eachmail['email']; 
    $name_receiver = $eachmail['nome']; 

    $mail->From = "[email protected]"; 

    $mail->FromName = "service";    

    $mail->AddReplyTo($email_receiver, $name_receiver); 

    $mail->MsgHTML($body); 

    $mail->AddAddress($email_receiver, "dynamic name"); 

    $mail->Subject = "Message from website"; 

    $body    = '<strong>email send to:</strong> ' . $name_receiver . '<br/> 
        <strong>email:</strong> ' . $email_receiver . '<br/> 
        <strong>message:</strong> ' . stripslashes($message) . '<br/><br/>'; 

    $mail->MsgHTML($body); 
    $mail->Send(true); 
    $mail->ClearAllRecipients(true); 

} 

echo "mail sent"; 

?> 

Я полагаю, я необходимо сохранить файлы ito массива, а затем для каждого файла создать относительное вложение. К сожалению, я не могу. Любая помощь?

+0

Создайте свой код в сочетании с [примером списка рассылки] (https://github.com/PHPMailer/PHPMailer/blob/master/examples/mailing_list.phps) и отправьте пример отправки (https://github.com/PHPMailer/PHPMailer/blob/master/examples/send_file_upload.phps) предоставляется с помощью PHPMailer. По существу вам просто нужно вызвать 'addAttachment' для каждого файла после обработки загрузок. – Synchro

+0

Thaks, я сделал то, что предложил, отправил ответ тоже! –

+0

phpmailer все равно, сколько/нескольких вложений вы делаете. вы просто вызываете '-> AddAttachment()', пока не закончите добавление. если вы не называете это вообще, то это тоже хорошо. –

ответ

0

Прежде всего, я использовал «инъекцию» JQuery, чтобы добавить столько же, сколько входной файл, который я хочу в dom основной формы, и удалить их, если хотите.

$(document).ready(function() { 
    $('#add_more').click(function() { 
     var current_count = $('input[type="file"]').length; 
     var next_count = current_count +1; 
     $('#prenota').prepend('<p id="here_' + next_count + '"><input type="file" name="file_' + next_count + '" /></p>') 
     $('#here_' + next_count + '').append('<a class="delete_this" href="#">delete</a>'); 
    }); 


    $('.delete_this').live('click', function(){ 
     var current_todelete = $(this).closest("p").attr("id"); 
     $('#' + current_todelete + '').remove(); 
    }); 
}); 

Затем я добавил несколько строк в файле PHP, назначенный для сбора информации о записи и sendig электронной почты, что делает его способным нести вложения (как Synchro предложил мне):

if (isset($_FILES)){ 
    foreach ($_FILES as $file) { 

     $filename = $file['name']; 
     $filetype = $file['type']; 
     $filetmp_name = $file['tmp_name']; 
     $filesize = $file['size']; 

     if($filename){ 
      $temPath = '../../../../../public/' . basename($filename); 

      //var_dump($temPath); 
      //die(); 

      if (move_uploaded_file($filetmp_name, $temPath)) { 
       $mail->AddAttachment($temPath, $filename); 
      } 
     }  
    } 
}else{ 
    $mail->AddAttachment(false); 
} 

Надеясь быть полезным люди с той же проблемой.

+0

Рад, что это сработало, но эта обработка файлов небезопасна - сделайте это так, как использует пример отправки отправки - сначала вызовите 'move_uploaded_file', и не доверяйте перечисленным именам файлов. – Synchro

+0

Synchro, я изменил код в своем ответе, как и предложил мне, правильно ли это сейчас? Если я использую "tempnam (sys_get_temp_dir(), sha1 ($ _ FILES ['userfile'] ['name']))" строка scritp u, показанная в связанном примере, не позволяет отправить действительный файл. Файл отправляется правильно, но поврежден. Почему необходимо обрабатывать файл в методе move_uploaded_file? Чтобы мой список рассылки не считался спамом? –

+0

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

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