【问题标题】:phpMailer file attachment not working, any advice?phpMailer 文件附件不起作用,有什么建议吗?
【发布时间】:2021-12-13 12:00:30
【问题描述】:

我有一个 HTML 表单,我正在使用 phpMailer。完成表单并单击提交在文本输入字段等中输入的所有数据时,将按预期工作。但是,当我在收到电子邮件时将文件附加到输入类型“文件”时,没有附件。

有没有人对为什么没有附上附件有任何建议?

仅供参考 - 目前,该网站没有 SSL 证书,并且电子邮件将进入垃圾邮件文件夹 - 这可能是问题吗?

我是 phpMailer 的新手,通过研究已经能够实现以下目标。

phpMailer()

<?php

$file = $_POST['file'];

// more variables... 

$CustomerSignature = $_POST['q21'];
$Date = $_POST['q22'];
$filename = "./upload/" . $_FILES["file"]["name"];
move_uploaded_file($_FILES["file"]["tmp_name"],"./upload/" . $_FILES["file"]["name"]);

    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;
    use PHPMailer\PHPMailer\SMTP;

    require 'phpMailer/src/Exception.php';
    require 'phpMailer/src/PHPMailer.php';
    require 'phpMailer/src/SMTP.php';
    require 'phpMailer/src/OAuth.php'; 

    $mail = new PHPMailer;
    $mail->isSMTP();
    $mail->SMTPDebug = 3;
    $mail->Host = 'smtp.hostinger.com';
    $mail->Port = 465;
    $mail->SMTPAuth = true;
    $mail->SMTPSecure = 'ssl';
    $mail->Username = '######';
    $mail->Password = '######';
    $mail->isHTML(true);
    $mail->setFrom('######', '######');
    $mail->addReplyTo('######', '######');
    $mail->addAddress('######', '######');
    $mail->addAddress('######');
    $mail->AddAttachment($filename);
    $mail->Subject = 'New Credit Application';
    $mail->Body = '<b>New Credit Application (Online)!</b></br>'
.'Trading Name: '.$TradingName.'</br>'
.'blah blah blah etc.'
.'Customer Signature: '.$CustomerSignature.'</br>'
.'Date: '.$Date.'</br>';
    if (!$mail->send()) {
        echo 'Mailer Error: ' . $mail->ErrorInfo;
    } else {
        echo 'The email message was sent.';
    }
?>

HTML 文件附件部分:

<form method="POST" action="testmail2.php" id="myform" class="fs-form fs-form-full" autocomplete="off">
                    <ol class="fs-fields">
                        
                        <li>
                            <label class="fs-field-label fs-anim-upper" for="file">Attachment</label>
                            <input class="fs-anim-lower" id="file" name="file" type="file" required/>
                        </li>

【问题讨论】:

  • 启用所有错误级别并显示它。 $path 是未定义的变量,我在任何地方都看不到它。在发送电子邮件之前,请确保文件已正确上传。
  • @vee ,第一行显示错误日志,无法访问文件:
  • @vee,我做了一些代码更改,现在错误消失了,电子邮件附加了一个名为 uplaod 的空白文件,日志显示如下:2021-12-13 12:28:19客户端->服务器:内容传输编码:base64 2021-12-13 12:28:19 客户端->服务器:内容处置:附件;文件名=上传
  • @Martin , 6.5.3 - 最新的,我今天才从 GitHub 下载它

标签: php phpmailer


【解决方案1】:

您缺少一件基本的事情:您没有设置表单的编码类型。默认编码不适用于文件,因此 $_FILES 将为空,因此像 move_uploaded_file 这样的函数将失败,因为没有文件可移动,而不是因为您的路径或权限错误(尽管您可以这样做也!)。你的表单标签应该是:

<form method="POST" action="testmail2.php" id="myform" class="fs-form fs-form-full" autocomplete="off" enctype="multipart/form-data">

除此之外,将您的代码基于the file upload example provided with PHPMailer

【讨论】:

  • 我现在收到以下错误:无法访问文件:/upload/text-upload.pdf
【解决方案2】:

$filename 应该是您服务器上的绝对文件路径,而不是相对路径,因为您有一个前导点,这可能会搞砸很多事情 ./ ...

你有:

 $filename = "./upload/" . $_FILES["file"]["name"];

你应该拥有的是:

 move_uploaded_file($_FILES["file"]["tmp_name"],$_SERVER['Document_root']."/path/to/upload/" . $_FILES["file"]["name"]);
 ...
 $filename = $_SERVER['Document_root']."/path/to/upload/" . $_FILES["file"]["name"];

您应该使用 PHPMailer 错误报告器 ($mail-&gt;SMTPDebug = SMTP::DEBUG_SERVER;) 以及 reading your own PHP error messages 来检查这类事情。你也应该在github中设置follow the examples

【讨论】:

  • 我将按照建议更改代码,我需要对第 26 行进行任何更改吗? move_uploaded_file($_FILES["file"]["tmp_name"],"./upload/" . $_FILES["file"]["name"]);
  • 是的。 ./ 是相对文件路径。您应该使用绝对文件路径
  • 没有文件被上传到目录中的文件夹,即使在进行了建议的更改之后
  • 那么你的 PHPMailer 错误报告告诉你什么?
  • 无法访问文件:/upload/
【解决方案3】:

你可以试试addStringAttachment() 方法

尽管它的名字,它不仅仅适用于文本文件,而是适用于任何类型的文件

请参考以下代码sn-p

if (is_uploaded_file($_FILES["file"]["tmp_name"])) {
    $filename = $_FILES["file"]["tmp_name"];
    $handle = fopen($filename, "r");
    $contents = fread($handle, filesize($filename));
    fclose($handle);
    $mail->addStringAttachment($contents, $filename);
}

【讨论】:

    【解决方案4】:

    我已经解决了问题

    move_uploaded_file($_FILES["file"]["tmp_name"],"upload/" . $_FILES["file"]["name"]);
    $filename = "upload/" . $_FILES["file"]["name"];
    

    感谢所有帮助过的人

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-11
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 2023-03-16
      • 2015-05-31
      相关资源
      最近更新 更多