php 使用 PHPMailer 附加文​​件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/35997961/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-26 00:39:46  来源:igfitidea点击:

File attachment with PHPMailer

phpphpmailer

提问by Eli Nathan

I have an HTML form with the option to upload a file.
I would like then to send that file as an attachment to the email address along with the rest of the form data.
I'm using PHP Mailer and I get the form data to send: such as name, telephone number, etc.

我有一个 HTML 表单,可以选择上传文件。
然后我想将该文件作为电子邮件地址的附件以及表单数据的其余部分发送。
我正在使用 PHP Mailer 并获取要发送的表单数据:例如姓名、电话号码等。

I can't get the image to send along with it. I've provided the code I have so far

我无法将图像与它一起发送。我已经提供了到目前为止的代码

<!DOCTYPE html>
<html>
<head>
<title>Form</title>
</head>

<body>

<form id='contactus' action='contact.php' enctype="multipart/form-data" method='post'>

<fieldset >
<legend>Contact us</legend>


<div class='container'>
  
    <label for='email' >Name*:</label><br/>
    <input type="text" id="name" name="name" required /><br>
    <label for='email' >Phone*:</label><br/>
    <input type="text" id="phone" name="phone" required /><br>
    <label for='email' >Email*:</label><br/>
    <input type='text' name='email' id='email' required/><br/>
 
    <label for='message' >Message:</label><br/>
    <textarea rows="10" cols="50" name='message' id='message'></textarea>
    <br>
    <!-- Name of input element determines name in $_FILES array -->
    Send this file: <input id="file" name="image" type="file" />
    <input type='submit' name='Submit' value='Submit' />
</div>

</fieldset>
</form>
    </body>
</html>

<?php
   if(isset($_FILES['image'])){
      $errors= array();
      $file_name = $_FILES['image']['name'];
      $file_size = $_FILES['image']['size'];
      $file_tmp = $_FILES['image']['tmp_name'];
      $file_type = $_FILES['image']['type'];
      $file_ext=strtolower(end(explode('.',$_FILES['image']['name'])));
      
      $expensions= array("jpeg","jpg","png","pdf");
      
      if(in_array($file_ext,$expensions)=== false){
         $errors[]="extension not allowed, please choose a PDF, JPEG or PNG file.";
      }
      
      if($file_size > 2097152) {
         $errors[]='File size must be excately 2 MB';
      }
      
      if(empty($errors)==true) {
         move_uploaded_file($file_tmp,"uploads/".$file_name); //The folder where you would like your file to be saved
         echo "Success";
      }else{
         print_r($errors);
      }
   }

// PHPMailer script below

$email = $_REQUEST['email'] ;
$name = $_REQUEST['name'] ;
$phone = $_REQUEST['phone'] ;
$message = $_REQUEST['message'] ;
require("phpmailer/PHPMailerAutoload.php");

$mail = new PHPMailer();

$mail->IsSMTP();

$mail->Host = "smtp.gmail.com";

$mail->SMTPAuth = true; 

$mail->Username = "[email protected]"; // SMTP username
$mail->Password = "hidden"; // SMTP password
$mail->addAttachment("uploads/".$file_name);
$mail->From = $email;
$mail->SMTPSecure = 'tls'; 
$mail->Port = 587; //SMTP port
$mail->addAddress("[email protected]", "your name");
$mail->Subject = "You have an email from a website visitor!";
$mail->Body ="
Name: $name<br>
Email: $email<br>
Telephone: $phone<br><br><br>
Comments: $message";
$mail->AltBody = $message;

if(!$mail->Send())
{
echo "Message could not be sent. <p>";
echo "Mailer Error: " . $mail->ErrorInfo;
exit;
}

echo "<script>alert('Message has been sent')</script>";
?>

EDIT: [SOLVED] I have updated the code in the snippets to the working code that allows me to attach a file with to an email with PHPMailer.
I used This Tutorialto help upload the file to the server before executing the PHPMailer script.

编辑:[已解决] 我已将片段中的代码更新为允许我使用 PHPMailer 将文件附加到电子邮件的工作代码。在执行 PHPMailer 脚本之前,
我使用本教程帮助将文件上传到服务器。

回答by drew010

When you call

你打电话时

move_uploaded_file($file_tmp,"uploads/".$file_name);

This creates a file in the uploads/directory with the name of the file as it was named on the uploader's computer.

这将在uploads/目录中创建一个文件,文件名与上传者计算机上的文件名相同。

Then you used sample code to add the attachment to phpMailer so you're basically attempting to attach non-existent files.

然后您使用示例代码将附件添加到 phpMailer,因此您基本上是在尝试附加不存在的文件。

These two lines:

这两行:

$mail->addAttachment('uploads/file.tar.gz');   // I took this from the phpmailer example on github but I'm not sure if I have it right.      
$mail->addAttachment('uploads/image.jpg', 'new.jpg');

should be changed to:

应改为:

$mail->addAttachment("uploads/".$file_name);

Also note, it isn't necessary to call move_uploaded_fileif you don't want to save the attachment after its uploaded and emailed. If that's the case just call AddAttachmentwith $_FILES['image']['tmp_name']as the file argument.

另请注意,move_uploaded_file如果您不想在上传和通过电子邮件发送附件后保存附件,则无需致电。如果是这种情况,只需将AddAttachmentwith$_FILES['image']['tmp_name']作为文件参数调用。

Also, in your HTML form, you have

此外,在您的 HTML 表单中,您有

<input id="file" name="file" type="file" />

but refer to the input as imagein the code. You should change the name of that input from fileto image.

但请参考image代码中的输入。您应该将该输入的名称从 更改fileimage

To only attach the image and not save it take out the move_uploaded_filecode and add:

要只附加图像而不保存它,请取出move_uploaded_file代码并添加:

$file_tmp  = $_FILES['image']['tmp_name'];
$file_name = $_FILES['image']['name'];
//...
$mail->AddAttachment($file_tmp, $file_name);