如何通过php表单将附件发送到邮件?

如何通过php表单将附件发送到邮件?,php,forms,Php,Forms,我正在尝试允许用户在填写表单时发送图像附件: 我可以发送电子邮件,但附件无法发送 这是HTML <form method="post" enctype="multipart/form-data"> <div class="form-group"> <label for="name">Name</label> <input type="text" class="fo

我正在尝试允许用户在填写表单时发送图像附件:

我可以发送电子邮件,但附件无法发送

这是HTML

<form method="post" enctype="multipart/form-data">
            <div class="form-group">
              <label for="name">Name</label>
              <input type="text" class="form-control" id="name" placeholder="Your name" name="name">
            </div>

            <div class="form-group">
              <label for="email">Email address</label>
              <input type="email" class="form-control" id="email" placeholder="Please enter your email" name="email">
            </div>

            <div class="form-group">
              <textarea class="form-control" id="text" placeholder="What would you like to tell us" rows="3" name="text"></textarea>

              <div class="form-group">
                <label for="file"></label>
                <input type="file" class="form-control-file" id="file" name="attachment" onchange="return ValidateFileUpload()">
              </div>
            </div>

            <button type="submit" id="submit" class="btn btn-primary">Submit</button>
          </form>

名称
电子邮件地址
提交
这是PHP代码:

<?php

$error = ""; $successMessage = "";

if ($_POST) {

    if (!$_POST["email"]) {

        $error .= "An email address is required.<br>";

    }

    if (!$_POST["name"]) {

        $error .= "Your name is required.<br>";

    }


    if ($_POST['email'] && filter_var($_POST["email"], FILTER_VALIDATE_EMAIL) === false) {

        $error .= "The email address is invalid.<br>";

    }

    if ($error != "") {

        $error = '<div class="alert alert-danger" role="alert"><p>There were error(s) in your form:</p>' . $error . '</div>';

    } else {

        $emailTo = "@gmail.com";

        $subject = $_POST['name'];

        $content = $_POST['text'];

        $file = $_POST['file'];

        $headers = "From: ".$_POST['email'];

        if (mail($emailTo, $subject, $content, $headers)) {

            $successMessage = '<div class="alert alert-success" role="alert">Your message was sent, we\'ll get back to you ASAP!</div>';


        } else {

            $error = '<div class="alert alert-danger" role="alert"><p><strong>Your message couldn\'t be sent - please try again later</div>';


        }

    }

}

?>


这个问题经常出现。建议永远不要使用php
mail()
,而是使用具有API的良好库或邮件服务。例如:或者,如果您不只是发送一封简单的文本邮件,而是要做其他事情,我建议您使用一些邮件库,如SwiftMail或PhpMail。这会让你省去很多头痛。然后,通过真正的SMTP发送邮件也很容易,这降低了邮件被退回/错误标记为垃圾邮件的风险。注意:当你写问题时,确保不要多次粘贴相同的文本。我为你整理了这个问题。一个好的答案应该包含一个解释,而不仅仅是一堆代码。一些适当的缩进和代码格式也会对它们造成伤害。
function mail_attachment($to, $subject, $message, $from, $file) {
  // $file should include path and filename
    $filename = basename($file);
    $file_size = filesize($file);
    $content = chunk_split(base64_encode(file_get_contents($file))); 
    $uid = md5(uniqid(time()));
    $from = str_replace(array("\r", "\n"), '', $from); // to prevent email injection
    $header = "From: ".$from."\r\n"
            ."MIME-Version: 1.0\r\n"
            ."Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n"
            ."This is a multi-part message in MIME format.\r\n" 
            ."--".$uid."\r\n"
            ."Content-type:text/plain; charset=iso-8859-1\r\n"
            ."Content-Transfer-Encoding: 7bit\r\n\r\n"
            .$message."\r\n\r\n"
            ."--".$uid."\r\n"
            ."Content-Type: application/octet-stream; name=\"".$filename."\"\r\n"
            ."Content-Transfer-Encoding: base64\r\n"
            ."Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n"
            .$content."\r\n\r\n"
            ."--".$uid."--"; 
   return mail($to, $subject, "", $header);
  }