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...
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?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!
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')
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">
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
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.
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.
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
});
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>
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";
}
?>