php - plusieurs - script envoi mail




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

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 , j'ai le code suivant utilisant PHPMailer() pour envoyer un email:

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 du fichier uploaded_file du formulaire à joindre à l'email, et envoyé. Je ne me soucie pas de sauvegarder le fichier après le script process.php envoie dans un email.

Je comprends que j'ai besoin d'ajouter AddAttachment(); quelque part (je suppose sous la ligne du Body ) pour que l'attachement soit envoyé. Mais...

  1. Que dois-je mettre en haut du fichier process.php pour récupérer le fichier uploaded_file ? Comme si quelque chose utilisait $_FILES['uploaded_file'] pour extraire le fichier de la page contact-us.php?
  2. Ce qui se passe à l'intérieur de AddAttachment(); pour que le fichier soit joint et envoyé avec l'email et où ce code doit-il aller?

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


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

Dans le formulaire HTML, je n'ai pas ajouté de ligne suivante, donc pas de pièce jointe:

enctype = "multipart / form-data"

Après avoir ajouté la ligne ci-dessus dans la forme (comme ci-dessous), la pièce jointe est parfaite.

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

Ce code m'aide dans l'envoi de pièces jointes ....

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

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


Essayer:

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

L'exemple de base peut également être trouvé here .

La définition de la fonction pour AddAttachment est:

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

Hé les gars, le code ci-dessous a parfaitement fonctionné pour moi. Remplacez simplement setFrom et addAddress par vos préférences et c'est tout.

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

Vous utiliseriez $_FILES['uploaded_file']['tmp_name'] , qui est le chemin où PHP a stocké le fichier téléchargé (c'est un fichier temporaire, enlevé automatiquement par PHP quand le script se termine, sauf si vous l'avez copié / copié autre part).

En supposant que votre formulaire côté client et les paramètres de téléchargement côté serveur sont corrects, vous n'avez rien à faire pour "insérer" le téléchargement. Il sera simplement disponible par magie dans ce chemin tmp_name.

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

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

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







email-attachments