【问题标题】:File attachment not being sent to email using PHP未使用 PHP 将文件附件发送到电子邮件
【发布时间】:2013-02-07 04:01:56
【问题描述】:

我正在尝试从表单发送附件。该电子邮件会生成一个附件,而不是我尝试上传的附件。我希望它在发送给用户时上传并将名称更改为$strNewFileName

html代码:

<input type="file" class="upload" name="uploaded_file[]" id="uploaded_file"></input>

php 文件:

<?php
$strTo = "me@example.com";
$strSubject = "Document Updated";  
$strMessage = nl2br($_GET["sqlCode"]);
$strNewFileName = $_GET["RevisedFileName"];

 if (is_uploaded_file($_FILES['uploaded_file']['tmp_name'])) {
echo "File ". $_FILES['uploaded_file']['name'] ." uploaded successfully.\n";
echo "Displaying contents\n";
readfile($_FILES['uploaded_file']['tmp_name']);
} else {
echo "Possible file upload attack: ";
echo "filename '". $_FILES['uploaded_file']['tmp_name'] . "'.";
}
 //*** Uniqid Session ***//  
$strSid = md5(uniqid(time()));   
$strHeader = "";  
$strHeader .= "From: Document Update\r\nReply-To: example@example.com";    
$strHeader .= "MIME-Version: 1.0\n";  
$strHeader .= "Content-Type: multipart/mixed; boundary=\"".$strSid."\"\n\n";  
$strHeader .= "This is a multi-part message in MIME format.\n";   
$strHeader .= "--".$strSid."\n";  
$strHeader .= "Content-type: text/html; charset=utf-8\n";
$strHeader .= "Content-Transfer-Encoding: 7bit\n\n";  
$strHeader .= $strMessage."\n\n"; 
rename("$strFilesName", "$strNewFileName");  

  // *** Attachment *** //  
  $strFilesName = $_FILES["uploaded_file"]["name"]; 
  $strContent = chunk_split(base64_encode(file_get_contents($_FILES["uploaded_file"]["name"])));
  $strHeader .= "--".$strSid."\n";  
  $strHeader .= "Content-Type: application/pdf; name=\"".$strNewFileName."\"\r\n";
  $strHeader .= "Content-Transfer-Encoding: base64\n";  
  $strHeader .= "Content-Disposition: attachment;\n\n";  
  $strHeader .= $strContent."\n\n";

$flgSend = @mail($strTo,$strSubject,$strMessage,$strHeader);  

if($flgSend)  
{  
   echo "Approval Send Complete."; 
}  
else  
{  
   echo "Cannot send mail, Approval has not been processed.";  
 } 

 ?>

【问题讨论】:

    标签: php mime email-attachments


    【解决方案1】:

    我认为你的问题在这里:

    $strContent = chunk_split(base64_encode(file_get_contents($_FILES["uploaded_file"]["name"])));
    

    _FILES["uploaded_file"]["name"] 代表上传文件的原始名称,而不是它在服务器上的位置。为此,您需要使用 $_FILES['uploaded_file']['tmp_name'](正如您在脚本前面所做的那样,您验证它是一个正确上传的文件。

    对于数组访问(因为使用uploaded_file[] 作为输入名称),您需要执行以下操作来构建有效附件数组:

    $valid_attachments = array();
    foreach ($_FILES['uploaded_file']['tmp_name'] as $key => $temp_file_name) {
        if (is_uploaded_file($temp_file_name)) {
            $valid_attachments[] = array(
                'path' => $temp_file_name,
                'filename' => $_FILES['uploaded_file']['name'][$key],
                'type' => $_FILES['uploaded_file']['type'][$key],
                'size' => $_FILES['uploaded_file']['size'][$key]
            );
        }
    }
    

    然后,您需要在代码的“附件”部分中循环遍历此数组并将附件添加到电子邮件中。

    【讨论】:

    • 看起来这可能是另一个问题。
    • 我从表单名称中删除了 [] 并将 ["temp_name"] 添加到 php 代码中,但我得到了相同的结果。
    • @AlvinaReed 数组键是tmp_name 不是temp_name
    • 哦,我很抱歉我的思维比我的手指移动得还快...是的,我有 ["tmp_name"]
    【解决方案2】:

    看起来您将文件上传设置为发送多个文件,name="uploaded_file[]" 但您只在 php 代码中处理单个文件。在这种情况下,只需删除 html 中的 []

    【讨论】:

      猜你喜欢
      • 2013-07-18
      • 2016-09-20
      • 1970-01-01
      • 2018-04-13
      • 2012-06-15
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多