无法使用PHPMailer v6接收邮件

时间:2017-11-25 07:25:55

标签: php phpmailer

当我使用此代码(附在下面)时,我无法接收带附件的邮件,但会收到网址成功的状态。当我删除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!";
            }
        }
    }
}
}

1 个答案:

答案 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示例演示了如何正确执行此操作。