【问题标题】:Sending an uploaded file through email without saving it first通过电子邮件发送上传的文件而不先保存
【发布时间】:2013-03-14 03:13:53
【问题描述】:

我正在创建一个应用程序,它允许用户附加文件、键入消息,然后使用 wordpress 的 PHP 邮件程序插件发送电子邮件。我使用 javascript 从上传 html 表单中获取文件信息,然后使用 php 发送电子邮件。该插件在使用此功能发送保存在服务器上特定位置的文件时起作用:

$mail->AddAttachment("./new6.txt","attachment");

我想知道是否有一种方法可以通过电子邮件发送所选文件而无需将其保存到服务器。换句话说,用户是否可以选择要上传的文件,但使用此 php 函数发送文件而不将其保存在要检索的位置?我知道有一个 $_FILES 数组,您可以获取文件的信息,但是该文件是否能够在不先将其保存在某处的情况下发送?我猜不是因为上传表单的全部目的是“上传”它,而是想知道是否可以用 javascript 或其他东西来完成。

感谢您的帮助

【问题讨论】:

    标签: javascript file email upload


    【解决方案1】:

    你不能真正做到这一点,但你可以这样做以获得密切的效果:

    $filename = $_FILES['file_name']['tmp_name'];
    $main->AddAttachment($filename, "attachment");
    
    // Send the email... then:
    unset($filename);
    

    这会将文件添加为附件,发送电子邮件,然后删除文件。 $_FILES 数组中上传的文件最终会被自动清除,所以我不确定 unset() 部分是否有任何重要作用,但它肯定会删除文件。

    【讨论】:

    • $filename 应该来自服务器,而不是来自客户端机器。
    【解决方案2】:

    如果没有在服务器中保存文件,您不能将其附加到邮件中。

    1> Mailing function is executing in Server.
    2> It is not possible from Server to get the absolute file path in client machine as in web, the client machines do not have any absolute address.
    3> So the file is needed to be uploaded in server to get a real path for the file to have in attachment of Mail.
    

    【讨论】:

      【解决方案3】:

      我知道这是一个相当古老的问题,但我认为有一个非常有用的答案从未给出过。为了像我这样在寻找此问题或类似问题的答案时遇到此问题的人,请继续。

      当您从表单上传文件到服务器时,它会自动保存到 tmp 目录。从技术上讲,在不保存的情况下对表单上传的文件进行任何操作是不可能的,因为它是自动为您完成的。但是,由于 tmp 会在每次重启时自动清除,因此如果您经常重启或设置 cron 以定期删除 tmp 目录内容,这不应该成为积压过多的问题。

      但是,因为它被保存到 tmp,并且因为您可以从那里操作文件,所以可以在不保存任何形式的长寿的情况下发送文件,并且无需实际编写任何内容来保存它。如果您对文件执行了所有必要的安全检查(验证内容、MIME 类型等,我现在不会介绍,但您可以阅读如何执行here),您可以使用以下 php我从Codexworld 获得并修改为使用 tmp 文件的函数。你需要做的就是通过 参数,$files 是您希望已经审查过的文件数组。

      function multi_attach_mail($to, $subject, $message, $senderEmail, $senderName, $files = array()){ 
      
          $from = $senderName." <".$senderEmail.">";  
          $headers = "From: $from"; 
      
          // Boundary  
          $semi_rand = md5(time());  
          $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";  
      
          // Headers for attachment  
          $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\"";  
      
          // Multipart boundary  
          $message = "--{$mime_boundary}\n" . "Content-Type: text/html; charset=\"UTF-8\"\n" . 
          "Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n";  
      
          // Preparing attachment 
          if(!empty($files)){ 
              for($i=0; $i<count($files); $i++){
                  if(is_file($files[$i]["tmp_name"])){ 
                      $tmp_name = basename($files[$i]["tmp_name"]);
                      $file_name = $files[$i]["name"];
                      $file_size = filesize($files[$i]["tmp_name"]); 
      
                      $message .= "--{$mime_boundary}\n"; 
                      $fp =    fopen($files[$i]["tmp_name"], "rb"); 
                      $data =  fread($fp, $file_size); 
                      fclose($fp); 
                      $data = chunk_split(base64_encode($data)); 
                      $message .= "Content-Type: application/octet-stream; name=\"".$file_name."\"\n" .  
                      "Content-Description: ".$file_name."\n" . 
                      "Content-Disposition: attachment;\n" . " filename=\"".$file_name."\"; size=".$file_size.";\n" .  
                      "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n"; 
                  }
              } 
          } 
      
          $message .= "--{$mime_boundary}--"; 
          $returnpath = "-f" . $senderEmail; 
      
          // Send email    
          $mail = mail($to, $subject, $message, $headers, $returnpath);  
      
          // Return true, if email sent, otherwise return false 
          if($mail){ 
              return true; 
          }else{ 
              return false; 
          } 
      }
      

      【讨论】:

        猜你喜欢
        • 2014-07-20
        • 2012-02-23
        • 2011-02-07
        • 2020-03-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-18
        • 1970-01-01
        • 2018-06-19
        相关资源
        最近更新 更多