PHP Mailer发送空附件


PHP Mailer sends empty attachment

我正试图从联系人表单发送一个附件。我使用phpMailer示例编写代码,但在这样做的过程中,没有发送附件。不确定我做错了什么。附加输入的名称为clientResume。

<div id='contactForm' class='animated'>
    <div id='formClose'>X</div>
    <form id="form" action="employerForm.php" method="post" enctype="multipart/form-data">
       <h1>Get Started For Free!</h1>
       <label>Name</label>
       <input class="formField" placeholder="Name" type="text" name="clientName" required>
       <label>Email</label>
       <input class="formField" placeholder="Email" type="email" name="clientEmail" required>
       <label>Resume</label>
       <input class="formField" placeholder="Resume" type="file" name="clientResume" required>
       <input type="hidden" name="MAX_FILE_SIZE" value="30000">
       <input id='formButton' type='button' value='Submit'>
    </form>
</div>
var name = $('input[name="clientName"]').val(),
        email = $('input[name="clientEmail"]').val(),
        company = $('input[name="clientCompany"]').val(),
        comment = $('input[name="clientComment"]').val(),
        resume = $('input[name="clientResume"]').val(),
        form = $(document).find("form"),
        formData = form.serialize();
$.ajax({
    type: 'POST',
    url: form.attr('action'),
    data: formData,
    AccessControlAllowOrigin: '*';
});
<?php
        require_once('phpmailer/PHPMailerAutoload.php');
        $mail = new PHPMailer();
        $name = $_POST['clientName'];
        $email = $_POST['clientEmail'];
        $attachment = tempnam(sys_get_temp_dir(), sha1($_FILES['clientResume']['tmp_name']));
        $subject = "Resume Submission [$name]";
        $message = "Name: $name " . "<br>Email: $email";
        $mail->isSMTP();
        $mail->Debugoutput = 'html';
        $mail->Host = 'correlation-host.correlation-one.com';    
        $mail->Port = 25;
        $mail->SMTPSecure = 'tls';
        $mail->SMTPAuth = false;
        $mail->setFrom($email, $name);
        $mail->addAddress('mpaccione1991@gmail.com', 'Michael Paccione');
        $mail->Subject = 'PHPMailer SMTP test';
        $uploadfile = tempnam(sys_get_temp_dir(), sha1($_FILES['clientResume']['name']));
        if (move_uploaded_file($_FILES['clientResume']['tmp_name'], $uploadfile)) {
            $mail->addAttachment($uploadfile, 'resume');
        }
        $mail->msgHTML($message);
        $mail->Send();
        $mail->SmtpClose();

    ?>

没有必要重新发明轮子;您的代码基于PHPMailer提供的文件上传示例。

您没有执行move_uploaded_file,因此您的上载不安全。您复制了关于创建安全文件名的部分,但没有复制其后面的移动,因此您的addAttachment调用毫无意义。这样做:

$uploadfile = tempnam(sys_get_temp_dir(), sha1($_FILES['clientResume']['name']));
if (move_uploaded_file($_FILES['clientResume']['tmp_name'], $uploadfile)) {
    $mail->addAttachment($uploadfile, 'My uploaded file');
    ...

您的表单在文件输入元素之前缺少一个隐藏的MAX_FILE_SIZE元素

<input type="hidden" name="MAX_FILE_SIZE" value="30000">

所有这些也包含在关于处理文件上传的PHP文档中。在SO上发布之前搜索并阅读源文档总是一个好主意。

试试这个,

$mail->addAttachment($attachment);

其中$attachment类似于$attachment=move_uploaded_file($_FILES['ClientSume']['tmp_name'],$target);

需要访问FormData js API才能从前端正确发送附件。

            var fd = new FormData();
            fd.append("clientName", name);
            fd.append("clientEmail", email);
            fd.append("clientResume", $(document).find('input[name="clientResume"]')[0].files[0]);
            $.ajax({
                type: 'POST',
                url: form.attr('action'),
                processData: false,
                contentType: false,
                data: fd,
                datatype: 'json'
            })

只需使用此类型来附加文件

$mail->AddAttachment($_FILES['clientResume']['tmp_name'], $_FILES['clientResume']['name']);