Send File Attachment from Form Using phpMailer and

2018-12-31 20:48发布

问题:

I have a form on example.com/contact-us.php that looks like this (simplified):

<form method=\"post\" action=\"process.php\" enctype=\"multipart/form-data\">
  <input type=\"file\" name=\"uploaded_file\" id=\"uploaded_file\" />
  <input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"10000000\" />
</form>

In my process.php file, I have the following code utilizing PHPMailer() to send an email:

require(\"phpmailer.php\");

$mail = new PHPMailer();

$mail->From     = me@example.com;
$mail->FromName = My name;
$mail->AddAddress(me@example.com,\"John Doe\");

$mail->WordWrap = 50;
$mail->IsHTML(true);

$mail->Subject  =  \"Contact Form Submitted\";
$mail->Body     =  \"This is the body of the message.\";

The email sends the body correctly, but without the Attachment of uploaded_file.

MY QUESTION

I need the file uploaded_file from the form to be attached to the email, and sent. I do NOT care about saving the file after the process.php script sends it in an email.

I understand that I need to add AddAttachment(); somewhere (I\'m assuming under the Body line) for the attachment to be sent. But...

  1. What do I put at the top of the process.php file to pull in the file uploaded_file? Like something using $_FILES[\'uploaded_file\'] to pull in the file from the contact-us.php page?
  2. What goes inside of AddAttachment(); for the file to be attached and sent along with the email and where does this code need to go?

Please help and provide code!Thanks!

回答1:

Try:

if (isset($_FILES[\'uploaded_file\']) &&
    $_FILES[\'uploaded_file\'][\'error\'] == UPLOAD_ERR_OK) {
    $mail->AddAttachment($_FILES[\'uploaded_file\'][\'tmp_name\'],
                         $_FILES[\'uploaded_file\'][\'name\']);
}

Basic example can also be found here.

The function definition for AddAttachment is:

public function AddAttachment($path,
                              $name = \'\',
                              $encoding = \'base64\',
                              $type = \'application/octet-stream\')


回答2:

File could not be Attached from client PC (upload)

In the HTML form I have not added following line, so no attachment was going:

enctype=\"multipart/form-data\"

After adding above line in form (as below), the attachment went perfect.

<form id=\"form1\" name=\"form1\" method=\"post\" action=\"form_phpm_mailer.php\"  enctype=\"multipart/form-data\">


回答3:

This code help me in Attachment sending....

$mail->AddAttachment($_FILES[\'file\'][\'tmp_name\'], $_FILES[\'file\'][\'name\']);

Replace your AddAttachment(...) Code with above code



回答4:

You\'d use $_FILES[\'uploaded_file\'][\'tmp_name\'], which is the path where PHP stored the uploaded file (it\'s a temporary file, removed automatically by PHP when the script ends, unless you\'ve moved/copied it elsewhere).

Assuming your client-side form and server-side upload settings are correct, there\'s nothing you have to do to \"pull in\" the upload. It\'ll just magically be available in that tmp_name path.

Note that you WILL have to validate that the upload actually succeeded, e.g.

if ($_FILES[\'uploaded_file\'][\'error\'] === UPLOAD_ERR_OK) {
    ... attach file to email ...
}

Otherwise you may try to do an attachment with a damaged/partial/non-existent file.



回答5:

Use this code for sending attachment with upload file option using html form in phpmailer

 <form method=\"post\" action=\"\" enctype=\"multipart/form-data\">


                    <input type=\"text\" name=\"name\" placeholder=\"Your Name *\">
                    <input type=\"email\" name=\"email\" placeholder=\"Email *\">
                    <textarea name=\"msg\" placeholder=\"Your Message\"></textarea>


                    <input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"30000\" />
                    <input type=\"file\" name=\"userfile\"  />


                <input name=\"contact\" type=\"submit\" value=\"Submit Enquiry\" />
   </form>


    <?php




        if(isset($_POST[\"contact\"]))
        {

            /////File Upload

            // In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
            // of $_FILES.

            $uploaddir = \'uploads/\';
            $uploadfile = $uploaddir . basename($_FILES[\'userfile\'][\'name\']);

            echo \'<pre>\';
            if (move_uploaded_file($_FILES[\'userfile\'][\'tmp_name\'], $uploadfile)) {
                echo \"File is valid, and was successfully uploaded.\\n\";
            } else {
                echo \"Possible invalid file upload !\\n\";
            }

            echo \'Here is some more debugging info:\';
            print_r($_FILES);

            print \"</pre>\";


            ////// Email


            require_once(\"class.phpmailer.php\");
            require_once(\"class.smtp.php\");



            $mail_body = array($_POST[\'name\'], $_POST[\'email\'] , $_POST[\'msg\']);
            $new_body = \"Name: \" . $mail_body[0] . \", Email \" . $mail_body[1] . \" Description: \" . $mail_body[2];



            $d=strtotime(\"today\"); 

            $subj = \'New enquiry \'. date(\"Y-m-d h:i:sa\", $d);

            $mail = new PHPMailer(); // create a new object


            //$mail->IsSMTP(); // enable SMTP
            $mail->SMTPDebug = 1; // debugging: 1 = errors and messages, 2 = messages only ,false = Disable 
            $mail->Host = \"mail.yourhost.com\";
            $mail->Port = \'465\';
            $mail->SMTPAuth = true; // enable 
            $mail->SMTPSecure = true;
            $mail->IsHTML(true);
            $mail->Username = \"admin@domain.net\"; //from@domainname.com
            $mail->Password = \"password\";
            $mail->SetFrom(\"admin@domain.net\", \"Your Website Name\");
            $mail->Subject = $subj;
            $mail->Body    = $new_body;

            $mail->AddAttachment($uploadfile);

            $mail->AltBody = \'Upload\';
            $mail->AddAddress(\"recipient@domain.com\");
             if(!$mail->Send())
                {
                echo \"Mailer Error: \" . $mail->ErrorInfo;
                }
                else
                {

                echo \'<p>       Success              </p> \';

                }

        }



?>

Use this link for reference.



回答6:

Hey guys the code below worked perfectly fine for me. Just replace the setFrom and addAddress with your preference and that\'s it.

<?php
/**
 * PHPMailer simple file upload and send example.
 */
//Import the PHPMailer class into the global namespace
use PHPMailer\\PHPMailer\\PHPMailer;
use PHPMailer\\PHPMailer\\Exception;
$msg = \'\';
if (array_key_exists(\'userfile\', $_FILES)) {
    // First handle the upload
    // Don\'t trust provided filename - same goes for MIME types
    // See http://php.net/manual/en/features.file-upload.php#114004 for more thorough upload validation
    $uploadfile = tempnam(sys_get_temp_dir(), hash(\'sha256\', $_FILES[\'userfile\'][\'name\']));
    if (move_uploaded_file($_FILES[\'userfile\'][\'tmp_name\'], $uploadfile)) 
    {
        // Upload handled successfully
        // Now create a message

        require \'vendor/autoload.php\';
        $mail = new PHPMailer;
        $mail->setFrom(\'info@example.com\', \'CV from Web site\');
        $mail->addAddress(\'blabla@gmail.com\', \'CV\');
        $mail->Subject = \'PHPMailer file sender\';
        $mail->Body = \'My message body\';

        $filename = $_FILES[\"userfile\"][\"name\"]; // add this line of code to auto pick the file name
        //$mail->addAttachment($uploadfile, \'My uploaded file\'); use the one below instead

        $mail->addAttachment($uploadfile, $filename);
        if (!$mail->send()) 
        {
            $msg .= \"Mailer Error: \" . $mail->ErrorInfo;
        } 
        else 
        {
            $msg .= \"Message sent!\";
        }
    } 
        else 
        {
            $msg .= \'Failed to move file to \' . $uploadfile;
        }
}
?>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">
    <title>PHPMailer Upload</title>
</head>
<body>
<?php if (empty($msg)) { ?>
    <form method=\"post\" enctype=\"multipart/form-data\">
        <input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"4194304\" />
        <input name=\"userfile\" type=\"file\">
        <input type=\"submit\" value=\"Send File\">
    </form>

<?php } else {
    echo $msg;
} ?>
</body>
</html>


回答7:

In my own case, i was using serialize() on the form, Hence the files were not being sent to php. If you are using jquery, use FormData(). For example

<form id=\'form\'>
<input type=\'file\' name=\'file\' />
<input type=\'submit\' />
</form>

Using jquery,

$(\'#form\').submit(function (e) {
e.preventDefault();
var formData = new FormData(this); // grab all form contents including files
//you can then use formData and pass to ajax

});