使用文件异步发送 php 封邮件

Send php mail with file asynch

这真让我抓狂。

这就是问题所在,我有一些带有一些文本输入和一个输入文件的 X 表单。在我的脚本中,我进行了先前的验证,然后将其发送到发送邮件的 x.php 文件和 returns 响应,之后页面会根据该响应进行更改。 问题是x.php文件无法通过这种方式接收文件。

HTML

<form action="/" method="post" enctype="multipart/form-data" id="hv_form" name="hv_form">
    <input type="text" name="name" placeholder="Nombre completo" />
    <input type="email" name="email" placeholder="E-mail" />
    <input type="text" name="phone" placeholder="Teléfono" />
    <input type="file" name="hv_file" id="hv_file" />
           <label for="hv_file"> 
                  <img src="images/addFile.svg" />
                  Elige un archivo...
           </label> 
    <button class="submit submit_file trans35" type="submit">Enviar archivo</button>                        
</form>

JQUERY

function send_file(trigger, dataOrigin) {
 // trigger > the button inside form to submit data
 // dataOrifin > the form

    $(trigger).on( 'click', function(e) {
        e.preventDefault();

        var error = false,
            $name = $(dataOrigin +" [class*='name']").val(),
            $email = $(dataOrigin +" [class*='email']").val(),
            $phone = $(dataOrigin +" [class*='phone']").val(),
            $file = $(dataOrigin +" [id='hv_file']").val();

  //Check empty inputs or errors
        if($name.length == 0){
            var error = true;
            $(dataOrigin +" [class*='name']").queue(function(){$(this).addClass('cont_error').dequeue();}).delay(err_wt).queue(function(){$(this).removeClass('cont_error').dequeue();});
        } else {
            $(dataOrigin +" [class*='name']").removeClass('cont_error');
        }
        //. . . etc


 //Send message and file
        if (error == true) {
            //do something if previous error
        } else if (error == false) {

            $.post("send_file.php", $(dataOrigin).serialize(),function(result){
                var r = JSON.parse(result);
                    console.log( r );

                if (r[0] == 1) {
                    // if php file responses "1" means sent
                    // do something...
                    console.log( "[HV] "+dataOrigin +": Mensaje enviado");

                } else if (r[0] == 0) {
                    // if php file responses "0" means NOT sent
                    // do something...
                    console.log( "[HV] "+ dataOrigin +": Mensaje NO enviado");
                }
             });

       }

PHP 代码

<?php

    $email_to = 'xxxx@xxxxxx.com';   //email de la empresa
    $business = 'xxxxxx';    //nombre de la empresa

    $name       = $_POST['name'];
    $email_from = $_POST['email'];
    $phone      = $_POST['phone'];
    $file       = $_FILES['hv_file'];

//Correo
    $headers = "From: Postulacion web <$email_from>" . "\r\n";
    $headers .= "Reply-To: $name <$email_from>\r\n";

    $headers .= "MIME-Version: 1.0\r\n"; 
    $headers .= "Content-type: text/html; charset=UTF-8 " . "\r\n";
    $headers .= "X-Mailer: PHP/" . phpversion(). "\r\n";

    $subject    =  "$name ha enviado su curriculum"; //Asunto del mensaje    
    $message_full = "Hello world";

    $r;
    if(mail($email_to, $subject, $message_full, $headers)){
        $r = '1';
    } else {
        $r = '0';
    }   
    $toSend = [$r, $file ]; 

    echo json_encode($toSend); 
?>

But by this way $_FILES (in php file) is always empty, what i'm doing wrong?

And if I remove 'preventDefault' and submit the form naturally by clicking the button, the php file does receive the file!

请帮帮我!我很绝望!

我对您的 ajax 做了一些改动,但我有一个可行的解决方案。在您的代码中,我看不到您是如何调用 send_file() 函数的。所以我摆脱了它并使用按钮触发 jquery。

确保您已安装 jQuery。

您也会在 html 中看到一些变化。一切都得到 id,我将按钮更改为 type="button".

您将不得不重写一些表单验证。

但是none这项工作越少,它应该为您提供一个很好的工作范例。这将在您每次按下按钮时起作用。

HTML

<form action="/" method="post" enctype="multipart/form-data" id="hv_form" name="hv_form">
    <input id="name" type="text" name="name" placeholder="Nombre completo" />
    <input id="email" type="email" name="email" placeholder="E-mail" />
    <input id="phone" type="text" name="phone" placeholder="Teléfono" />
    <input id="hv_file" type="file" name="hv_file" />
           <label for="hv_file">

                  Elige un archivo...
           </label>
    <button id="sendFile" class="submit submit_file trans35" type="button">Enviar archivo</button>
</form>

jQuery

<script>

$(document).ready(function(){

  $('#sendFile').on( 'click', function(e) {

      e.preventDefault();

      var myForm = new FormData();

      myForm.append('name',    $('#name').val());
      myForm.append('email',   $('#email').val());
      myForm.append('phone',   $('#phone').val());
      myForm.append('hv_file', $('#hv_file')[0].files[0]);

      $.ajax({
        url: 'send_file.php',
        type: 'POST',
        data: myForm,
        success: function (result) {

          var r = JSON.parse(result);
          console.log( r );

          if (r[0] == 1) {
          // if php file responses "1" means sent
          // do something...
          //console.log( "[HV] "+dataOrigin +": Mensaje enviado");

            } else if (r[0] == 0) {
            // if php file responses "0" means NOT sent
            // do something...
            //console.log( "[HV] "+ dataOrigin +": Mensaje NO enviado");
            }

        },
        cache: false,
        contentType: false,
        processData: false

      });

  });

});


</script>

我觉得你的 PHP 还不错。但是您确实需要确保在 PHP 脚本中验证您的 post 和文件,以确保没有不需要的东西通过。