如何使用 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将多个文件附加到两个不同的电子邮件中?