Phpmailer:一个表单中有多个动态附件

Phpmailer:一个表单中有多个动态附件,php,html,forms,phpmailer,Php,Html,Forms,Phpmailer,我正在创建一个邮件列表服务。 我需要动态地将一个或多个文件附加到电子邮件中,使用php、phpMail和一个用于在html表单中添加文件的“插槽”。 我只知道如何在同一封电子邮件中发送一个附件,而不是两个或更多 以下是html代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> </head> <body> <

我正在创建一个邮件列表服务。 我需要动态地将一个或多个文件附加到电子邮件中,使用php、phpMail和一个用于在html表单中添加文件的“插槽”。 我只知道如何在同一封电子邮件中发送一个附件,而不是两个或更多

以下是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>

邮件列表
信息:

选择一个或多个要发送的文件
phpmailer的php(sendmail.php,它与我使用的托管服务配合使用):


我想我需要将文件存储到一个数组中,然后为每个文件创建相对附件。不幸的是我不能。有什么帮助吗?

首先,我使用了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();
    });
});

希望能对与我有相同问题的人有所帮助。

将您的代码建立在PHPMailer提供的和的组合上。基本上,你只需要在处理上传后为每个文件调用
addAttachment
。Thaks,我按照你的建议做了,也发布了答案!phpmailer根本不在乎您正在执行多少附件。只需调用
->AddAttachment()
,直到添加完毕。如果你根本不调用它,那也没关系。很高兴它成功了,但是这个文件处理不安全-按照发送上载示例使用的方式执行-首先调用
move\u uploaded\u file
,不要信任提交的文件名。Synchro,我按照你的建议修改了我答案中的代码,现在正确吗?如果使用链接示例中显示的“tempnam(sys_get_temp_dir(),sha1($_FILES['userfile']['name']))”行scritp u,则无法发送有效文件。文件已正确发送,但已损坏。为什么需要在move_uploaded_file方法中处理文件?为了防止我的邮件列表被视为垃圾邮件?所做的只是生成一个安全、唯一的临时文件名。它不发送任何内容或移动任何文件。下一行是重要的一行。如果您想知道为什么需要这样做,请阅读该示例中链接的PHP文件上载文档。
$( 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();
    });
});
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);
}