当我使用此代码(附在下面)时,我无法接收带附件的邮件,但会收到网址成功的状态。当我删除unlink()时,我也会在我的服务器上传文件夹中上传附件。我认为我的PHPMailer代码存在一些问题。任何人都可以识别它吗?
我的目录中有PHPMailer,uploads,index.php,upload.php。
的index.php
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<form action="upload.php" method="POST" enctype="multipart/form-data">
Name <input type="text" name="name"></input><br /><br />
Email <input type="email" name="email"></input><br /><br />
Upload <input type="file" name="file" required><br /><br />
<button type="submit" name="submit">SUBMIT</button>
</form>
</body>
</html>
upload.php的
<?php
//Main Includes
use PHPMailer\PHPMailer\PHPMailer;
include_once "PHPMailer/PHPMailer.php";
include_once "PHPMailer/Exception.php";
if (isset($_POST['submit'])) {
$name = $_POST['name'];
$email = $_POST['email'];
$file = $_FILES['file'];
$fileName = $file['name'];
$fileTmpName = $file['tmp_name'];
$fileSize = $file['size'];
$fileError = $file['error'];
$fileType = $file['type'];
$fileExt = explode('.', $fileName);
$fileActualExt = strtolower(end($fileExt));
$allowed = array('jpg', 'jpeg', 'png', 'pdf');
if (empty($name) || empty($email)) {
header("Location: index.php?empty");
exit();
} else {
//Check if input characters are valid
if (!preg_match("/^[a-zA-Z]*$/", $name)) {
header("Location: index.php?invalidname");
exit();
} else {
//Check if email is valid
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
header("Location: index.php?emailerror");
exit();
} else {
if (in_array($fileActualExt, $allowed)) {
if ($fileError === 0) {
if ($fileSize < 10000000) {
$fileNameNew = uniqid('', true).".".$fileActualExt;
$fileDestination = 'uploads/'.$fileNameNew;
move_uploaded_file($fileTmpName, $fileDestination);
$mail = new PHPMailer();
$mail->addAddress('camadhusudanmishra@gmail.com');
$mail->setFrom($email);
// $mail->Subject = $subject;
$mail->isHTML(true);
$mail->Body = $name;
$mail->addAttachment($fileDestination);
$mail->send();
unlink($fileDestination);
header("Location: index.php?uploadsuccess");
exit();
}
else {
echo "Your file is too big!";
}
} else {
echo "There was an error uploading your file!".$fileError;
}
} else {
echo "You cannot upload files of this type!";
}
}
}
}
}
答案 0 :(得分:0)
这里有很多问题 - 虽然我不确定究竟是什么导致了你的问题。
阅读有关处理文件上传的the PHP docs。一个问题是您在继续之前没有检查move_uploaded_file
的返回值。
PHPMailer提供an example of how to handle form file uploads correctly。
PHPMailer会在发送之前验证它使用的所有地址,因此您可以依赖它而不是自己进行验证。
当你尝试调试某些东西时,不要发出重定向 - 它们只会让你更难看到发生了什么。
在使用之前,您不会检查$_FILES
是否存在或其中有任何内容。
$fileExt = explode('.', $fileName);
$fileActualExt = strtolower(end($fileExt));
这是获得扩展的一种非常奇怪的方式。 PHP具有内置函数,用于拆除文件路径,提取扩展。使用它们比使用自己的更安全:
$fileActualExt = pathinfo($fileName, PATHINFO_EXTENSION);
你错过了use
类的Exception
语句 - 但是你还没有启用PHPMailer的异常(通过将true
传递给构造函数)。这可以解释为什么你没有检查send()
的返回值,如果你没有使用例外,你应该这样做。
您使用提交的电子邮件地址作为发件人地址 - 这是伪造的,并会导致SPF失败,从而导致发送失败,退回或垃圾邮件过滤。 PHPMailer示例演示了如何正确执行此操作。