0

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

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

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

谢谢你的帮助

4

3 回答 3

1

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

$filename = $_FILES['file_name']['tmp_name'];
$main->AddAttachment($filename, "attachment");

// Send the email... then:
unset($filename);

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

于 2013-03-14T03:17:53.867 回答
0

如果没有将文件保存在服务器中,则无法将其附加到邮件中。

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.
于 2013-03-14T03:21:06.313 回答
0

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

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

但是,因为它被保存到 tmp,并且因为您可以从那里操作文件,所以可以在不保存任何形式的长寿的情况下发送文件,并且无需实际编写任何内容来保存它。如果您对文件执行了所有必要的安全检查(验证内容、MIME 类型等,我现在不会介绍,但您可以在此处阅读如何操作),您可以使用以下 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; 
    } 
}
于 2020-01-16T17:33:10.810 回答