如何使用 PHPMailer 从 PC 将文件附加到电子邮件

Posted

技术标签:

【中文标题】如何使用 PHPMailer 从 PC 将文件附加到电子邮件【英文标题】:How to attach file to email from PC using PHPMailer 【发布时间】:2015-12-25 22:29:22 【问题描述】:

当我尝试通过我的网站上的表单发送电子邮件并附上文件时,我遇到了问题。 我正在使用 phpMailer,邮件总是发送,但总是没有附件。

我不知道我应该修复什么或添加到我的代码中。

我一直在看一些教程,如何使用 PHPMailer 和附加文件。

代码如下:

HTML:

<form action="" method="post" enctype="multipart/form-data">
<input type="text" name="name" style="width: 70%;" placeholder="Name"><br />
<input type="text" name="email" style="width: 70%;" placeholder="Email"><br />
<input type="text" name="phone" style="width: 70%;" placeholder="Phone"><br />
<input type="file" name="fileToUpload" id="fileToUpload"><br />
<input type="submit" name="send" id="gobutton" value="Send">
</form>

PHP:

  <?
require_once("phpmailer/class.phpmailer.php");

if (isset($_POST['odeslat']))
  $allowedExts = array("doc", "docx", "xls", "xlsx", "pdf");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "application/pdf")
|| ($_FILES["file"]["type"] == "application/msword")
|| ($_FILES["file"]["type"] == "application/excel")
|| ($_FILES["file"]["type"] == "application/vnd.ms-excel")
|| ($_FILES["file"]["type"] == "application/x-excel")
|| ($_FILES["file"]["type"] == "application/x-msexcel")
|| ($_FILES["file"]["type"] == "application/vnd.openxmlformats-officedocument.wordprocessingml.document")
|| ($_FILES["file"]["type"] == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"))

&& in_array($extension, $allowedExts))
  
  if ($_FILES["file"]["error"] > 0)
    
    echo "<script>alert('Error: " . $_FILES["file"]["error"] ."')</script>";
    
  else
    
        $d='upload/';
        $de=$d . basename($_FILES['file']['name']);
    move_uploaded_file($_FILES["file"]["tmp_name"], $de);
$fileName = $_FILES['file']['name'];
    $filePath = $_FILES['file']['tmp_name'];
     //add only if the file is an upload
     
  
else
  
  echo "<script>alert('Invalid file')</script>";
  

$to = $_POST['email'];
$name = $_POST['name'];
$phone = $_POST['phone'];
$mail = new PHPMailer();



$mail->From = "info@mywebsite.com";
$mail->FromName = "My website";



$mail->addAddress("mail@mail.com");
$mail->AddAttachment($_FILES['file']['tmp_name'], $_FILES['file']['name']);


$mail->ishtml(true);

$mail->Subject = "Subject Text";
$mail->Body = "<i>Mail body in HTML</i>";
$mail->AltBody = "This is the plain text version of the email content";

if(!$mail->send()) 

   header ("Location: /?e=1");
 
else 

header ("Location: /?s=1");


?>

【问题讨论】:

您需要首先查看$_FILES 超全局。您可以在此处找到有关上传文件的数据。查看the documentation。 阅读 PHPmailer 提供的文档和示例。您在其他地方找到的建议可能是错误的或过时的。 【参考方案1】:

Send File Attachment from Form Using phpMailer and PHP

基本上你需要上传到服务器的 tmp 名称和文件名

$_FILES['uploaded_file']['tmp_name']
$_FILES['uploaded_file']['name']

【讨论】:

谢谢,我已经在这里找到了解决方案,在另一个主题中,它对我也很有效。 @HSturma :您必须搜索您的要求,然后提出问题。【参考方案2】:

如果您不关心需要在系统上保留文件,您可以直接发送文件,如下所示:

if (isset($_FILES['fileToUpload']) &&
  $_FILES['fileToUpload']['error'] == UPLOAD_ERR_OK) 

  //check MIME TYPE
  $finfo = new finfo(FILEINFO_MIME_TYPE);
  if (false === $ext = array_search(
    $finfo->file($_FILES['fileToUpload']['tmp_name']),
    array(
        'jpg' => 'image/jpeg',
        'png' => 'image/png',
        'gif' => 'image/gif',
    ),
    true
  )) 
      throw new RuntimeException('Invalid file format.');
  
  $destination = sprintf('./uploads/%s.%s',
       sha1_file($_FILES['fileToUpload']['tmp_name']),
       $ext
  );

  //move the file to a temp folder
  if (!move_uploaded_file(
    $_FILES['fileToUpload']['tmp_name'],
    $destination
  )) 
    throw new RuntimeException('Failed to move uploaded file.');
  

  //Attach file
  $mail->AddAttachment($_FILES['fileToUpload']['tmp_name'],
                     basename($destination));
  //delete the file
  unlink($destination);

This subject has already been treated

【讨论】:

我已经用对我有用的解决方案编辑了我的问题 不要这样做,有安全风险。 @Synchro,你能开发一下吗? 阅读the PHPDocs on handling file uploads。很清楚。【参考方案3】:

您正在做的事情以及其他答案中的建议是非常错误的。

如果你不知道这样的事情,也许你应该试试reading the docsfirst

直接使用 $_FILES 属性会产生安全隐患,而使用 move_uploaded_file 可以减轻安全隐患,而您会无缘无故地避免这种情况。

an example provided with PHPMailer 完全符合您的要求,但没有安全漏洞。套用最重要的部分:

if (array_key_exists('fileToUpload', $_FILES)) 
    $uploadfile = tempnam(sys_get_temp_dir(), sha1($_FILES['fileToUpload']['name']));
    if (move_uploaded_file($_FILES['fileToUpload']['tmp_name'], $uploadfile)) 
        $mail->addAttachment($uploadfile, 'My uploaded file');
    

有关在使用上传之前验证上传的更彻底的实现,请参阅 PHP 文档中的 this comment。

【讨论】:

以上是关于如何使用 PHPMailer 从 PC 将文件附加到电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用PHPMailer将多个文件附加到两个不同的电子邮件中?

PHPMailer 不发送带有附加 zip 文件的邮件

jsPDF, html2canvas, PHPMailer, 再次......!将 PDF 附加到邮件

PHPMailer - 使用 URL 附加远程文件

使用 mPDF 和 PHPmailer 即时附加 PDF

使用 dompdf 的 phpmailer 动态文件