【问题标题】:Upload files to attach and then attach them to mail with phpmailer and jquery上传要附加的文件,然后使用 phpmailer 和 jquery 将它们附加到邮件中
【发布时间】:2016-05-26 09:42:24
【问题描述】:

我的问题是这样的:

我想成功地将 2 个文件上传到我的服务器,然后发送一封附有这 2 个文件的电子邮件。但是,当我调用 jquery 函数时,它只会在成功上传之前发送电子邮件,并且我没有收到任何附件。我想等到上传完成,然后发送正确附加了 2 个文件的电子邮件。顺便说一句,我正在使用 PHPmailer。

我有这个 html

    <form enctype="multipart/form-data" class="formulario2">
 <label for="cel" class="control-label">Presentación Corporativa</label>
 <div class="controls">
  <input type="file" name="file_name2" id="presentacion_web"                                                                          class="inputfile">
  <label for="presentacion_web" class="btn btn-primary">Elija un Archivo</label>
  <input id="nombre_archivo2" disabled>
  <div class="messages2"></div><br /><br />
 </div> 
</form>


<form enctype="multipart/form-data" class="formulario">
 <label for="dni" class="control-label">Diseño Aprobado</label>
 <div class="controls">
  <input type="file" name="file_name1" id="diseno_aprobado_web" class="inputfile">
  <label for="diseno_aprobado_web" class="btn btn-primary">Elija un Archivo</label>
  <input id="nombre_archivo1" disabled>
  <div class="messages"></div><br /><br />
 </div>
</form>

jquery 中的这个函数:

$var3 = $("#diseno_aprobado_web").val();
$var6 = $("#presentacion_web").val();
$var7 = $var3.substring(12);
$var8 = $var6.substring(12);
$.when( enviando1(), enviando2() ).then( function(){
        $.ajax({
            type: 'POST',
            data: ('var3='+$var7+'&var6='+$var8),
            url: 'send_mail.php',
            success: function(salida){
                alert('Mensaje Enviado');
            }
        });


    }).done( function(){
        console.log( ' Everything was OK!' );
      })
      .fail( function(){
        console.log( 'Something was failed' );
      });
function enviando1(){
    var formData = new FormData($(".formulario")[0]);
    var message = ""; 
    $.ajax({
        url: 'upload.php',  
        type: 'POST',
        data: formData,
        cache: false,
        contentType: false,
        processData: false,
        beforeSend: function(){
            message = $("<span class='before'>Subiendo el archivo, por favor espere...</span>");
            showMessage(message); 
        },
        success: function(data){
            message = $("<span class='success'>El archivo ha subido correctamente.</span>");
            showMessage(message);
        },
        error: function(){
            message = $("<span class='error'>Ha ocurrido un error.</span>");
            showMessage(message);
        }
    });
};
    function showMessage(message){
        $(".messages").html("").show();
        $(".messages").html(message);
    }
function enviando2(){
    var formData2 = new FormData($(".formulario2")[0]);
    var message2 = "";   
    $.ajax({
        url: 'upload2.php',  
        type: 'POST',
        data: formData2,
        cache: false,
        contentType: false,
        processData: false,
        beforeSend: function(){
            message2 = $("<span class='before'>Subiendo el archivo, por favor espere...</span>");
            showMessage2(message2);        
        },
        success: function(data){
            message2 = $("<span class='success'>El archivo ha subido correctamente.</span>");
            showMessage2(message2);
        },
        error: function(){
            message2 = $("<span class='error'>Ha ocurrido un error.</span>");
            showMessage2(message2);
        }
    });
};
    function showMessage2(message2){
        $(".messages2").html("").show();
        $(".messages2").html(message2);
    }

还有这个 php 文件(send_mail.php):

    require('phpmailer/class.phpmailer.php');
$bodytext = "Correct Message";

$email = new PHPMailer();
$email->From      = 'test@mydomain.com';
$email->FromName  = 'test bot';
$email->Subject   = 'New mail from phpmailer';
$email->Body      = $bodytext;
$email->AddAddress( 'test2@test2.com' );

$file_to_attach1 = 'folder/' . $_POST['var6'];
$file_to_attach2 = 'folder/' . $_POST['var3'];

$email->AddAttachment( $file_to_attach1 , $_POST['var6'] );
$email->AddAttachment( $file_to_attach2 , $_POST['var3'] );


      return $email->Send();

我尝试了很多代码,但现在我真的陷入了困境和沮丧。对不起,如果是简单的事情,但我无法得到我的问题的答案。

谢谢!

更新1:

我在upload.php 中发现了这个,我认为这是问题所在:

$file = $_FILES['file_name']['name'];
if ($file && move_uploaded_file($_FILES['file_name']['tmp_name'],"folder/".$file))
{
   sleep(3);
   echo $file;
}

这在 3 秒后在我的 ajax 中返回成功,我该如何打开它

“睡眠(3)”

到上传文件需要的时间?

更新 2:

上传.php

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'){

$file = $_FILES['file_name1']['name'];

if(!is_dir("folder")) 
    mkdir("folder", 0777);

if ($file && move_uploaded_file($_FILES['file_name1']['tmp_name'],"folder/".$file)){
   sleep(3);
   echo $file;
}}else{    throw new Exception("Error Processing Request", 1);  }

上传2.php

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'){

$file = $_FILES['file_name2']['name'];

if(!is_dir("folder")) 
    mkdir("folder", 0777);

if ($file && move_uploaded_file($_FILES['file_name2']['tmp_name'],"folder/".$file))
{
   sleep(3);
   echo $file;
}}else{    throw new Exception("Error Processing Request", 1);}

【问题讨论】:

  • 你在服务器上看到你上传的文件了吗?
  • 您还应该检查上传的文件是否保存在服务器中。因为 phpMailer 应该能够处理脚本的绝对路径和相对路径。什么会 var_dump(file_exists(_DIR_ . '/' . $file_to_attach1));会说吗?
  • 是的,但有时它会在上传完成之前发送电子邮件,可能是文件大小的问题。
  • 名称是动态的,首先我上传了 2 个随机文件,然后我想将它们附加到新电子邮件中。
  • 你能告诉我upload.php和upload2.php吗

标签: javascript php jquery ajax email


【解决方案1】:

我认为您应该在代码的以下行中尝试 .done 而不是 .then

$.when( enviando1(), enviando2() ).then( function(){ 

该方法将在所有请求解决 (enviando1(),enviando1()) 后立即解决其 .done 请求,或者拒绝 .done 请求之一被拒绝后立即请求。

【讨论】:

  • 我只是试了一下,还是一样。我会继续尝试其他的。谢谢顺便说一句。
【解决方案2】:

您想使用动态文件名,但 $var3 和 $var6 是静态的。使用它来获取正在上传的文件的名称。

$var6 = $(presentacion_web).val().split('\\').pop();
$var3 = $(diseno_aprobado_web).val().split('\\').pop();

【讨论】:

  • 我对文件名没有任何问题。我得到了上传文件的正确名称,并且我已经使用警报进行了测试。
  • 您上传的可能是正确的,但您附加的是正确的吗?您传入的 var 是 FileName1 和 FileName2。如果您只使用 .val() 也不正确。您将需要获取文件名并构建服务器上的路径。
  • @MiguelRamirez 是的,我建议尝试这个。您声明使用 substring(12) 但这可能不正确,并且文件名可能更长或更短。
  • 嗯,我正在尝试上传许多不同名称的不同文件,并使用 substring(12) 它给了我正确的名称。
  • 它可能会在某些时候这样做,但这是一场赌博,可能会导致出现错误。这将为您提供文件名,您可以在 send_mail.php 中使用它来构建正确文件的路径。
【解决方案3】:

添加回车

你有:

 function enviando1(){
        var formData = new FormData($(".formulario")[0]);
        var message = "";
        $.ajax({

必须是:

 function enviando1(){
        var formData = new FormData($(".formulario")[0]);
        var message = "";
        return $.ajax({

你有:

function enviando2(){
        var formData2 = new FormData($(".formulario2")[0]);
        var message2 = "";
        $.ajax({

必须是:

function enviando2(){
        var formData2 = new FormData($(".formulario2")[0]);
        var message2 = "";
        return $.ajax({

【讨论】:

  • 在每种情况下我应该放什么 ajax?我真的不明白。
  • 他正在使用变量来存储文件名。为什么他需要回报?脚本已经等待这些完成。最后,这些中真的没有使用任何东西。
  • @nerdlyist 不,脚本不要等待,因为 $.when 接受延迟对象而不是函数,这就是为什么在调用两个函数但尚未结束后立即调用发送邮件的原因。
  • 太棒了!这就是答案!非常感谢!
  • @Aivar 学到了一些东西!那么这会是这个和我的建议的混搭吗?他能否使用这些返回的 ajax 调用在 when 函数调用中获取文件名而不是创建变量?
猜你喜欢
  • 2015-03-30
  • 2016-07-09
  • 1970-01-01
  • 2018-12-30
  • 2013-08-07
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
相关资源
最近更新 更多