web-dev-qa-db-fra.com

Envoyer une pièce jointe à partir d'un formulaire en utilisant phpMailer PHP

J'ai un formulaire sur example.com/contact-us.php qui ressemble à ceci (simplifié):

<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>

Dans mon fichier process.php, le code suivant utilise PHPMailer() pour envoyer un courrier électronique:

require("phpmailer.php");

$mail = new PHPMailer();

$mail->From     = [email protected];
$mail->FromName = My name;
$mail->AddAddress([email protected],"John Doe");

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

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

L'e-mail envoie le corps correctement, mais sans la pièce jointe de uploaded_file.

MA QUESTION

J'ai besoin que le fichier uploaded_file du formulaire soit joint à l'e-mail et envoyé. Je ne me soucie PAS de sauvegarder le fichier après que le script process.php l'envoie dans un email. 

Je comprends que je dois ajouter AddAttachment(); quelque part (je suppose sous la ligne Body) pour que la pièce jointe soit envoyée. Mais...

  1. Que dois-je mettre en haut du fichier process.php pour extraire le fichier uploaded_file? Vous aimez quelque chose qui utilise $_FILES['uploaded_file'] pour extraire le fichier de la page contact-us.php?
  2. Qu'y a-t-il à l'intérieur de AddAttachment(); pour que le fichier soit attaché et envoyé avec l'email et où ce code doit-il aller?

S'il vous plaît aider et fournir le code! Merci!

62
adamdehaven

Essayer:

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

Vous trouverez également un exemple de base ici .

La définition de fonction pour AddAttachment est:

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

Le fichier n'a pas pu être joint à partir du PC client (téléchargement)

Dans le formulaire HTML, je n'ai pas ajouté la ligne suivante, donc aucune pièce jointe n'était en cours:

enctype = "multipart/form-data"

Après avoir ajouté la ligne ci-dessus dans le formulaire (voir ci-dessous), la pièce jointe est devenue parfaite.

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

Ce code m'aide à envoyer une pièce jointe ....

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

Remplacez votre code AddAttachment (...) par le code ci-dessus

1
Irshad Khan

Vous utiliseriez $_FILES['uploaded_file']['tmp_name'], qui est le chemin où PHP stockait le fichier téléchargé (c'est un fichier temporaire, supprimé automatiquement par PHP à la fin du script, sauf si vous l'avez déplacé/copié ailleurs).

En supposant que vos paramètres de téléchargement côté formulaire et côté serveur soient corrects, vous ne devez rien faire pour "récupérer" le téléchargement. Comme par magie, il sera disponible dans ce chemin tmp_name.

Notez que vous devrez valider que le téléchargement a réellement réussi, par exemple.

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

Sinon, vous pouvez essayer de créer une pièce jointe avec un fichier endommagé/partiel/inexistant.

0
Marc B

Utilisez ce code pour envoyer une pièce jointe avec l'option de téléchargement de fichier en utilisant le formulaire HTML dans 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 = "[email protected]"; //[email protected]
            $mail->Password = "password";
            $mail->SetFrom("[email protected]", "Your Website Name");
            $mail->Subject = $subj;
            $mail->Body    = $new_body;

            $mail->AddAttachment($uploadfile);

            $mail->AltBody = 'Upload';
            $mail->AddAddress("[email protected]");
             if(!$mail->Send())
                {
                echo "Mailer Error: " . $mail->ErrorInfo;
                }
                else
                {

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

                }

        }



?>

Utilisez ce link pour référence.

0
Jithu Wilson C

Dans mon cas, j'utilisais serialize() sur le formulaire, les fichiers n'étaient donc pas envoyés à php. Si vous utilisez jQuery, utilisez FormData(). Par exemple

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

En utilisant 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

});
0
Akintunde-Rotimi

Hé les gars, le code ci-dessous a parfaitement fonctionné pour moi. Il suffit de remplacer setFrom et addAddress par votre préférence et le tour est joué. 

<?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('[email protected]', 'CV from Web site');
        $mail->addAddress('[email protected]', '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>
0
pancy1

Cela fonctionnera parfaitement

    <form method='post' enctype="multipart/form-data">
    <input type='file' name='uploaded_file' id='uploaded_file' multiple='multiple' />
    <input type='submit' name='upload'/> 
    </form>

    <?php
           if(isset($_POST['upload']))
        {
             if (isset($_FILES['uploaded_file']) && $_FILES['uploaded_file']['error'] == UPLOAD_ERR_OK)
                {
                     if (array_key_exists('uploaded_file', $_FILES))
                        { 
                            $mail->Subject = "My Subject";
                            $mail->Body = 'This is the body';
                            $uploadfile = tempnam(sys_get_temp_dir(), sha1($_FILES['uploaded_file']['name']));
                        if (move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $uploadfile))
                             $mail->addAttachment($uploadfile,$_FILES['uploaded_file']['name']); 
                            $mail->send();
                            echo 'Message has been sent';
                        }       
                else
                    echo "The file is not uploaded. please try again.";
                }
                else
                    echo "The file is not uploaded. please try again";
        }
    ?>
0
Abdulhakim Zeinu