【问题标题】:Attachments not sent using php mail() function未使用 php mail() 函数发送的附件
【发布时间】:2020-01-27 11:03:37
【问题描述】:

我正在处理文件附件。除了文件字段为空之外,邮件功能工作正常。我尝试过使用Content-Type: multipart/mixed 和其他一些方法,但无法实现所需的输出。我已经寻找不同的答案并尝试过,但仍然面临同样的问题。似乎有重复,但我已经尝试了所有方法,任何人都可以根据我的脚本指导我正确的方向,我在这里缺少什么。如何获取文件附件?任何人都可以向我建议正确的方向我在这里缺少什么,如果我删除文件附件代码然后其他字段工作正常并且邮件来了,为什么其他字段没有出现。 HTML

<form class="test" action="contactMail.php" method="POST">
  <input type="hidden" name="formname" value="Form sent by About page">
  <select class="user-select">
    <option value="">Pick Job Role</option>
    <option>Web Developer</option>
    <option>Java Developer</option>
  </select>
  <input type="text" name="name" placeholder="Your Name">
  <input type="tel" name="phone" placeholder="Contact Number">
  <label for="file-upload" class="file-upload">Upload Image</label>
  <input type="file" id="file-upload" name="upload" required>
  <textarea name="message" placeholder="Your Message" rows="3">/textarea>
            <button type="submit" class="from-submit form-group form-fields">Submit</button>
    <div id="success_contact">                                               
        <h2>Request Sent!</h2>
    </div>
</form>
   `<?php
// Receiver mail id 
$mail_to = 'yourmail@gmail.com';

// Mail Subject 
$subject = 'Virtual Raasta';

$upload = $_FILES["upload"];
$path = 'assets/file';
$filename = 'myfile';

if ($_SERVER["REQUEST_METHOD"] == "POST") {

    if ( isset($_POST['name']) ) {
        $name = $_POST['name'];
    }

    if (isset($_POST['phone'])) {
        $phone = $_POST['phone'];
    }

    if (isset($_POST['company'])) {
        $company = $_POST['company'];
    }

    if(isset($_POST['message'])) {
        $message = $_POST['message'];
    }
    if(isset($_POST['industry'])) {
        $industry = $_POST['industry'];
    }
    if(isset($_POST['job'])) {
        $job = $_POST['job'];
    }
    if(isset($_FILES['upload'])) {
        $upload = $_FILES['upload'];
    }

    $reqBy = $_POST['formname'];

    // Message body

    $msg = '<html><body><p>';

    $msg .= '<b> Request Sent From : </b>' . $reqBy . '<br/>';

    $msg .= '<b> Name : </b>' . $name . '<br/>';

    if($_POST["phone"] != "") {
       $msg .= '<b> Phone : </b>' . $phone . '<br/>';
    }

    if($_POST["company"] != "") {
       $msg .= '<b> Company : </b>' . $company . '<br/>';
    }

    if($_POST["message"] != "") {
        $msg .= '<b> Message : </b>' . $message . '<br/>';
    }

    if($_POST["industry"] != "") {
        $msg .= '<b> Industry : </b>' . $industry . '<br/>';
    }

    if($_POST["job"] != "") {
        $msg .= '<b> Job Role : </b>' . $job . '<br/>';
    }

    if($_FILES["upload"] != "") {
        $msg .= '<b> Upload : </b>' . $upload . '<br/>';
    }

    $msg .= '</p>';
    $msg .= '</body></html>';
    var_dump($msg);

    $filename = $_FILES["upload"]["name"];
    //$content = file_get_contents( $_FILES['upload']['tmp_name'] );

    if(!empty($_FILES['upload']['tmp_name']) && file_exists($_FILES['upload']['tmp_name'])) {
        $content= addslashes(file_get_contents($_FILES['upload']['tmp_name']));
    }
    $content = chunk_split(base64_encode($content));
    $uid = md5(uniqid(time()));


    $replyto = 'test';
    $headers = "From: ".$subject." <".'yourmail@gmail.com'.">\r\n";
    $headers .= "Reply-To: ".$replyto."\r\n";
    $headers .= "MIME-Version: 1.0\r\n";
    $headers .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";

    $msg = "--".$uid."\r\n";
    $msg .= "Content-type:text/plain; charset=iso-8859-1\r\n";
    $msg .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
    $msg .= $msg."\r\n\r\n";
    $msg .= "--".$uid."\r\n";
    $msg .= "Content-Type: application/octet-stream; name=\"".$filename."\"\r\n";
    $msg .= "Content-Transfer-Encoding: base64\r\n";
    $msg .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n";
    $msg .= $content."\r\n\r\n";
    $msg .= "--".$uid."--";

    if( mail( $mail_to, $subject, $msg, $headers )) {
        echo "Thank You!";
    } else {
        die("Error!");
    }
   }

 ?>`

【问题讨论】:

  • 请参阅How can I get useful error messages in PHP? 以获得可回答的问题,而不是“不工作”。 Send attachments with PHP Mail()? 提供更强大的方法。
  • @mario 感谢您的回复。我已经在调试模式 true。
  • @Husna,文件不会显示在$_POST,您需要使用$_FILES
  • @PragneshChauhan 感谢您的回复。我更改为 $_FILES 仍然只有文件来自邮件,而不是其他字段。
  • 您可以重新发布您的代码并进行新的更改吗?我认为您已将所有$_POST 更改为$_FILES,您只需使用$_POST["upload"]$_FILES['upload']

标签: php phpmailer


【解决方案1】:

我希望这只是一个错字。您正在使用 var $msg 两次。一次用于您的 html 消息和消息正文。

<?php

....

    // Message body

    $msg = '<html><body><p>';

    $msg .= '<b> Request Sent From : </b>' . $reqBy . '<br/>';

    $msg .= '<b> Name : </b>' . $name . '<br/>';

    if($_POST["phone"] != "") {
       $msg .= '<b> Phone : </b>' . $phone . '<br/>';
    }

    if($_POST["company"] != "") {
       $msg .= '<b> Company : </b>' . $company . '<br/>';
    }

    if($_POST["message"] != "") {
        $msg .= '<b> Message : </b>' . $message . '<br/>';
    }

    if($_POST["industry"] != "") {
        $msg .= '<b> Industry : </b>' . $industry . '<br/>';
    }

    if($_POST["job"] != "") {
        $msg .= '<b> Job Role : </b>' . $job . '<br/>';
    }

    if($_FILES["upload"] != "") {
        $msg .= '<b> Upload : </b>' . $upload . '<br/>';
    }

    $msg .= '</p>';
    $msg .= '</body></html>';
    var_dump($msg);

    $filename = $_FILES["upload"]["name"];
    //$content = file_get_contents( $_FILES['upload']['tmp_name'] );

    if(!empty($_FILES['upload']['tmp_name']) && file_exists($_FILES['upload']['tmp_name'])) {
        $content= file_get_contents($_FILES['upload']['tmp_name']); // No add_slashes()
    }
    $content = chunk_split(base64_encode($content));
    $uid = md5(uniqid(time()));


    $replyto = 'test';
    $headers = "From: ".$subject." <".'yourmail@gmail.com'.">\r\n";
    $headers .= "Reply-To: ".$replyto."\r\n";
    $headers .= "MIME-Version: 1.0\r\n";
    $headers .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";

在此处重命名 var 并更改 Content-type 和 transfer-encoding:

    $msgBody = "--".$uid."\r\n";
    $msgBody .= "Content-type:text/html; charset=iso-8859-1\r\n";
    $msgBody .= "Content-Transfer-Encoding: 8bit\r\n\r\n";
    $msgBody .= $msg."\r\n\r\n";

    if(isset($_Files['upload'])) // Only add attachment if uploaded
         $msgBody .= "--".$uid."\r\n";
         $msgBody .= "Content-Type: ".mime_content_type ( $_FILES['upload']['tmp_name'] )."; name=\"".$filename."\"\r\n";
         $msgBody .= "Content-Transfer-Encoding: base64\r\n";
         $msgBody .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n";
         $msgBody .= $content."\r\n\r\n";
    }
    $msgBody .= "--".$uid."--";

    if( mail( $mail_to, $subject, $msgBody, $headers )) {
        echo "Thank You!";
    } else {
        die("Error!");
    }
   }

 ?>

【讨论】:

  • 是的,我试过文件来了,字段也来了,但是字段带有 html 标签,比如

    Name here

    为什么会发生这种情况在这里不起作用。当我下载的文件类型是文件并且一个空文件来了。

  • 您是否从file_get_contents() 中删除了AddSlashes()?尝试在Content-Type: text/html中添加一个空格。
  • 您的文件名始终是 myfile。试试$filename = $_FILES["upload"]["name"];
  • 是的。我明白了 :) 现在为什么会出现空文件,我上传包含一些内容的 pdf 文件,但是当我下载文件类型是文件并且文件为空时。
  • 在您的附件中尝试"Content-Type: ".mime_content_type ( $_FILES['upload']['tmp_name'] )."; name=\"".$filename."\"\r\n";
【解决方案2】:

为了更好地使用 PHP 处理电子邮件,您可以使用这个库:

https://github.com/PHPMailer/PHPMailer

也可以使用minimal installation:

至少你需要 src/PHPMailer.php。如果你正在使用 SMTP,你需要 src/SMTP.php,如果你使用 POP-before SMTP, 你需要 src/POP3.php。

【讨论】:

  • 是的,但我不想使用 PHPMailer 使用 php 发送我想做的邮件,因为由于某些客户端要求。
  • @Husna 请理解,大多数电子邮件客户端很容易将自己发送的邮件标记为垃圾邮件。使用上述选项或 SendGrid 之类的第 3 方选项可以解决此问题。
【解决方案3】:

更新你的表单开始标签

&lt;form class="test" action="contactMail.php" method="POST" enctype="multipart/form-data"&gt;

在if条件开始前添加以下代码

if ($_FILES['upload']['error'] == 0) {
   $filename = $_FILES["upload"]["name"];
   $content = file_get_contents( $_FILES['upload']['tmp_name'] );
   $content = chunk_split(base64_encode($content));
   $uid = md5(uniqid(time()));
}

【讨论】:

  • 收到此错误Warning: file_get_contents(): Filename cannot be empty in contactMail.php
  • enctype="multipart/form-data" 你在表单中添加了这个属性吗?
  • @PragneshChauhan 这是上传文件而不是邮寄
【解决方案4】:

这里有几个问题。主要问题是这段代码是一场安全噩梦,永远不应该部署在任何地方。

第二个问题是在尝试使用参数实例化其他变量之前检查您的参数是否已填充。当您分配 $upload 然后检查 $_POST 数据,然后才查看是否首先设置了 $_POST 参数,这表明您需要重新阅读 isset() documentation 甚至 @987654322 的基础知识@。

【讨论】:

    猜你喜欢
    • 2017-08-08
    • 2013-04-13
    相关资源
    最近更新 更多