Facebook
Télécharger
Noter:

Ajouté le 2023-01-13
Visionné 50615 fois
4.6/5 (13)

Formulaire contact avec pièce jointe

Description

Ce script de formulaire de contact php, permet d'envoyer un mail en PHP avec ou sans pièce(s) jointe(s).



Le script a télécharger est ici:

contact-avec-piece-jointe.zip
(Téléchargé 1664 fois)







<?php
/*
Nom de la page: formulaire.php
Encodée en UTF-8 (sans BOM)
*/

//on inclut la classe PHP qui permet d'envoyer le mail avec une pièce jointe
include "C2Mail.class.php";

//vous pouvez paramètrer ci-dessous:
$UPLOAD['fichiers_max']=2;//nombre de fichier maximum pouvant être proposé
$UPLOAD['fichiers_min']=0;//nombre de fichier minimum devant être proposé (0 = le formulaire peut être envoyé même si il y aucun fichier de proposé
$UPLOAD['dossier_pieces_jointes']='./pieces-jointes/';//dossier de destination des fichiers, avec le / à la fin
$UPLOAD['taille_fichier_max']=5;//en Mo (peut être utilisé avec un point pour une valeure en dessous de 1mo, exemple pour 500ko: 0.5
$UPLOAD['garder_meme_nom']=1;//si le nom doit être remplacé par un nom aleatoire ou si il doit être identique à l'original (1=oui, 0=non)
$UPLOAD['nettoyer_le_nom']=1;//si les caractères spéciaux doivent être remplacés par un - et les majuscules en minuscules (1=oui, 0=non)
$UPLOAD['garder_fichier']=1;//si le fichier doit être gardé sur le serveur, si oui, un timestamp sera ajouté au nom pour pas qu'il soit écrasé si il y a une autre pièce jointe avec le même nom(1=oui, 0=non)

//on préparer le mail:
$MAIL['envoyer_a'] = "votre@mail.com";//(destinataire) mettez votre adresse mail ou l'adresse mail d'un autre destinataire (pour envoyer à plusieurs dstinataires, séparez par une virgules les adresses)
$MAIL['sujet'] = "Vous avez reçu un nouveau message";

//laissez les extensions que vous souhaitez seulement autoriser, une liste exhaustive officielle pour l'ensemble des types MIME est disponible à l'adresse suivante : https://www.iana.org/assignments/media-types/media-types.xhtml
$UPLOAD['extensions_autorisees']=array(
".pdf"=>"application/pdf",
".png"=>"image/png",
);

//traitement du formulaire:
if(isset($_POST['envoyer'])){// si le bouton "Envoyer" est appuyé
if(empty($_POST['mail'])){//on vérifie que le champ mail n'est pas vide
echo "Le champ mail est vide.";
} elseif(!preg_match("#^[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?@[a-z0-9_-]+((\.[a-z0-9_-]+){1,})?\.[a-z]{2,30}$#i",$_POST['mail'])){//on vérifie que l'adresse est correcte
echo "Le mail est incorrect.";
} elseif(empty($_POST['message'])){//on vérifie que le champ message n'est pas vide
echo "Le champ message est vide.";
} else {//si tous les champs (sauf les pièces jointes) son OK, on continu...

//on continue la préparation du mail:
$MAIL['mail_envoyeur'] = htmlentities($_POST['mail'],ENT_QUOTES,"UTF-8");//par sûreté, on utilise htmlentities...
$MAIL['mail_texte'] = "";//si vous voulez le mail au format texte, le contenu du mail "$_POST['message']" doit se placer ici
$MAIL['mail_html'] = nl2br(htmlentities($_POST['message'],ENT_QUOTES,"UTF-8"));//on converti toutes les entités HTML avec htmlentities() ("<" devient "&lt;" par exemple) et on remplace les sauts de ligne par des <br> avec nl2br() sinon le texte reçu sera sur une seule ligne
$MAIL['prepare_mail'] = new C2Mail($MAIL['envoyer_a'], $MAIL['mail_envoyeur'], $MAIL['sujet'], $MAIL['mail_texte'], $MAIL['mail_html']);

//on passe aux pièces jointes si il y en a
if(!empty($_FILES)){
//variable d'initiation, ne pas toucher
$UPLOAD['nbr_fichiers']=0;
$UPLOAD['erreur']=0;
$UPLOAD['msg_erreur']="";
$UPLOAD['fichiers']=array();
$ArrayNomFichier=[];//pour éviter l'ajout d'un fichier deux fois
//on fait la verif des photos si il y en a:
if(count($_FILES["fichiers"]['name'])>$UPLOAD['fichiers_max']){
$UPLOAD['erreur']=1;
$UPLOAD['msg_erreur'].="&bull; Nombre de fichier incorrect.<br />";
} else {
for($i=0;$i<=count($_FILES["fichiers"]['name'])-1;$i++) {
if($_FILES["fichiers"]['name'][$i]!=""){//si aucun fichier proposé on lance pas un for pour rien
if(in_array($_FILES["fichiers"]['name'][$i],$ArrayNomFichier)){
$UPLOAD['erreur']=1;
$UPLOAD['msg_erreur'].="&bull; Des fichiers sont identiques.<br />";
} else {
$ArrayNomFichier[]=$_FILES["fichiers"]['name'][$i];
if($_FILES["fichiers"]['error'][$i]!=4){// 4. Aucun fichier proposé
if($_FILES["fichiers"]['error'][$i]==0){// 0. Aucune erreur, le téléchargement est correct.
if(!in_array($_FILES["fichiers"]['type'][$i],$UPLOAD['extensions_autorisees'])){
$UPLOAD['erreur']=1;
$UPLOAD['msg_erreur'].="&bull; Le format du fichier ".($i+1)." est incorrect (seulement les extensions suivantes: <i>".implode(", ",array_keys($UPLOAD['extensions_autorisees']))."</i>, sont acceptées).<br />";
} elseif(($_FILES["fichiers"]['size'][$i]/1000000)>$UPLOAD['taille_fichier_max']){
$UPLOAD['erreur']=1;
$UPLOAD['msg_erreur'].="&bull; Le fichier ".($i+1)." excède la taille maximale de ".$UPLOAD['taille_fichier_max']."Mo, veuillez diminuer sa taille ou en choisir un autre.<br />";
} else {
$ext=strtolower(substr($_FILES["fichiers"]['name'][$i],strrpos($_FILES["fichiers"]['name'][$i],"."))); //.ext
if(!array_key_exists($ext,$UPLOAD['extensions_autorisees'])){
$UPLOAD['erreur']=1;
$UPLOAD['msg_erreur'].="&bull; Le format du fichier ".($i+1)." est incorrect (seulement les extensions suivantes: <i>".implode(", ",array_keys($UPLOAD['extensions_autorisees']))."</i>, sont acceptées).<br />";
} else {
if($UPLOAD['garder_meme_nom']==1){
$nom=substr($_FILES["fichiers"]['name'][$i],0,strrpos($_FILES["fichiers"]['name'][$i],"."));
$nom=$UPLOAD['nettoyer_le_nom']==1?preg_replace("#[^a-z0-9]#","-",strtolower($nom)):$nom;
} else $nom=($i+1).substr(str_shuffle("ABCDEFGHIJKLMNOPQRSTUVWXYZ"),0,5);
//OK!
$UPLOAD['fichiers'][]=array(
"ext"=>$ext,
"nom"=>$nom,
"tmp_name"=>$_FILES["fichiers"]['tmp_name'][$i],
);
$UPLOAD['nbr_fichiers']++;
}
}
} else {
$UPLOAD['erreur']=1;
$UPLOAD['msg_erreur'].="&bull; Le fichier ".($i+1)." ".($_FILES["fichiers"]['error'][$i]==1?" excède la taille maximale de ".$UPLOAD['taille_fichier_max']."Mo, veuillez diminuer sa taille ou en choisir un autre. <small>La taille du fichier téléchargé excède la valeur de upload_max_filesize, configurée dans le php.ini. </small>":" comporte le code d'erreur ".htmlent($_FILES["fichiers"]['error'][$i]).", le formulaire ne peut être validé. Si vous pensez que c'est une erreur, merci d'en informer le support technique s'il vous plaît.")."<br />";
}
}
}
}
}
}
if($UPLOAD['erreur']==1){
echo $UPLOAD['msg_erreur'];
} else {
if($UPLOAD['nbr_fichiers']!=0){
//on upload les fichiers:
for($i=0;$i<=count($UPLOAD['fichiers'])-1;$i++) {
$cheminVersFichier=$UPLOAD['dossier_pieces_jointes'].$UPLOAD['fichiers'][$i]['nom'].$UPLOAD['fichiers'][$i]['ext'];
if($UPLOAD['garder_fichier']==1)$cheminVersFichier=$UPLOAD['dossier_pieces_jointes'].$UPLOAD['fichiers'][$i]['nom']."-".time().$UPLOAD['fichiers'][$i]['ext'];
if(!move_uploaded_file($UPLOAD['fichiers'][$i]['tmp_name'],$cheminVersFichier)) {
$UPLOAD['erreur']=1;
$UPLOAD['msg_erreur'].="&bull; Désolé, une erreur est survenue lors de l'ajout du fichier ".($i+1)." sur le serveur, merci de réessayer ou merci d'en informer le support technique s'il vous plaît si le problème persiste.<br />";
} else {
$MAIL['prepare_mail']->add_attachment($cheminVersFichier);
}
}
} else {
if($UPLOAD['fichiers_min']>0){
$UPLOAD['erreur']=1;
$UPLOAD['msg_erreur'].="&bull; Vous devez proposer un minimum de ".$UPLOAD['fichiers_min']." fichier(s).";
}
}
if($UPLOAD['erreur']==1){
echo $UPLOAD['msg_erreur'];
} else {
$MAIL['prepare_mail']->send();
echo "Succès!";
//on supprime les fichiers uploadé si il y en a eu
if($UPLOAD['nbr_fichiers']!=0 and $UPLOAD['garder_fichier']==0){
foreach($UPLOAD['fichiers'] as $fichier){
unlink($UPLOAD['dossier_pieces_jointes'].$fichier['nom'].$fichier['ext']);
}
}
}
}
}
}
}
?>
<form method="post" action='formulaire.php' enctype="multipart/form-data"><!-- il est obligatoire d'utiliser enctype="multipart/form-data" pour que le transfert de fichiers fonctionne -->

<p><b>Mail<sup style="color:red">*</sup>:</b><br>
<input type="text" name="mail" value="<?php echo isset($_POST['mail'])?htmlentities($_POST['mail'],ENT_QUOTES,"UTF-8"):''; ?>"></p>

<p><b>Message<sup style="color:red">*</sup>:</b><br>
<textarea name="message" cols="40" rows="20"><?php echo isset($_POST['message'])?htmlentities($_POST['message'],ENT_QUOTES,"UTF-8"):'Bonjour,'; ?></textarea></p>

<p><b>Pièces jointes:<?php echo $UPLOAD['fichiers_min']>0?'<sup style="color:red">*</sup>':''; ?></b><br>
<?php
echo "Extensions acceptées: <i>",implode(", ",array_keys($UPLOAD['extensions_autorisees'])),"</i><br>";
for($i=1;$i<=$UPLOAD['fichiers_max'];$i++){//on affiche autant d'input file qu'on à choisi de fichiers maximum
echo '<input type="file" name="fichiers[]">';
}
?></p>
<input type="submit" name="envoyer" value="Envoyer!">
</form>
<?php
/**
* Une classe PHP pour l'envoi d'e-mails qui inclut des capacités d'envoi de messages en clair, html et multipart, y compris la prise en charge des pièces jointes.
*
* While none of the capabilities of this class exceed those of more established packages such as PEARMail, my hope is that this class offers the advantage of portability, since not every setup has the ability to install PEAR packages. Also, this class is ideal for embedding in other systems, which I have done in the case of my MVC framework, DirtyMVC.
*
* @author Steve Lewis <steve@thoughtsandrambles.com>
* @version 0.1.0
* @package Mail
*
**/
class C2Mail{
/**
* @var string $to The email address, (or addresses, if comma separated), of the person to which this email should be sent.
**/
public $to;
/**
* @var string $from The email address that this mail will be delivered from. Bear in mind that this can be anything, but that if the email
* domain doesn't match the actual domain the message was sent from, some email clients will reject the message as spam.
**/
public $from;
/**
* @var string $subject The subject line of the email
**/
public $subject;
/**
* @var string $text_content The plaintext version of the message to be sent.
**/
public $text_content;
/**
* @var string $html_content The HTML version of the message to be sent.
**/
public $html_content;
/**
* @var string $body The complete body of the email that will be sent, including all mixed content.
**/
private $body;
/**
* @var array $attachments An array of file paths pointing to the attachments that should be included with this email.
**/
private $attachments;
private $base64_attachments;
/**
* @var array $headers An array of the headers that will be included in this email.
**/
private $headers;
/**
* @var string $header_string The string, (and therefore final), representation of the headers for this email message.
**/
private $header_string;
/**
* @var string $boundary_hash The string that acts as a separator between the various mixed parts of the email message.
**/
private $boundary_hash;
/**
* @var boolean $sent Whether or not this email message was successfully sent.
**/
private $sent;
/**
* Upon initialization of a Mail object, you have to pass it certain vital pieces of information.
*
* At a minimum, an email must consist of a receiver address, a sender address, and a subject.
* The body can be left blank.
**/
public function __construct($to, $from, $subject, $text_content = "", $html_content = ""){
$this->to = $to;
$this->from = $from;
$this->subject = $this->convert_utf8($subject);
$this->text_content = $text_content;
$this->html_content = $html_content;
$this->body = "";
$this->attachments = array();
$this->base64_attachments = array();
$this->headers = array();
$this->boundary_hash = md5(date('r', time()));
}
/**
* The send() method processes all headers, body elements and attachments and then actually sends the resulting final email.
**/
public function send(){
$this->prepare_headers();
$this->prepare_body();
if(!empty($this->attachments)){
$this->prepare_attachments();
}
if(!empty($this->base64_attachments)){
$this->prepare_base64_attachments();
}
$this->sent = mail($this->to, $this->subject, $this->body, $this->header_string);
return $this->sent;
}
/**
* This method allows the user to add a new header to the message
* @param string $header The text for the header the user wants to add. Note that this string must be a properly formatted email header.
**/
public function add_header($header){
$this->headers[] = $header;
}
/**
* Add a filepath to the list of files to be sent with this email.
* @param string $file The path to the file that should be sent.
**/
public function add_attachment($file){
$this->attachments[] = $file;
}
public function add_base64_attachment($name,$data){
$this->base64_attachments[] = array('name'=>$name, 'data'=>$data);
}
private function prepare_body(){
$this->body .= "--PHP-mixed-{$this->boundary_hash}\n";
$this->body .= "Content-Type: multipart/alternative; boundary=\"PHP-alt-{$this->boundary_hash}\"\n\n";
if(!empty($this->text_content)) $this->prepare_text();
if(!empty($this->html_content)) $this->prepare_html();
$this->body .= "--PHP-alt-{$this->boundary_hash}--\n\n";
}
private function prepare_headers(){
$this->set_default_headers();
$this->header_string = implode(PHP_EOL, $this->headers).PHP_EOL;
}
private function set_default_headers(){
$this->headers[] = 'MIME-Version: 1.0';
$this->headers[] = "From: {$this->from}";
# We'll assume a multi-part message so that we can include an HTML and a text version of the email at the
# very least. If there are attachments, we'll be doing the same thing.
$this->headers[] = "Content-type: multipart/mixed; boundary=\"PHP-mixed-{$this->boundary_hash}\"";
}
private function prepare_base64_attachments(){
foreach($this->base64_attachments as $attachment){
$this->body .= "--PHP-mixed-{$this->boundary_hash}\n";
$this->body .= "Content-Type: application/octet-stream; name=\"{$attachment['name']}\"\n";
$this->body .= "Content-Transfer-Encoding: base64\n";
$this->body .= "Content-Disposition: attachment\n\n";
$this->body .= chunk_split($attachment['data']);
$this->body .= "\n\n";
}
$this->body .= "--PHP-mixed-{$this->boundary_hash}--\n\n";
}
private function prepare_attachments(){
foreach($this->attachments as $attachment){
$file_name = basename($attachment);
$file_name = $this->convert_utf8($file_name);
$this->body .= "--PHP-mixed-{$this->boundary_hash}\n";
$this->body .= "Content-Type: application/octet-stream; name=\"{$file_name}\"\n";
$this->body .= "Content-Transfer-Encoding: base64\n";
$this->body .= "Content-Disposition: attachment\n\n";
$this->body .= chunk_split(base64_encode(file_get_contents($attachment)));
$this->body .= "\n\n";
}
$this->body .= "--PHP-mixed-{$this->boundary_hash}--\n\n";
}
private function prepare_text(){
$this->body .= "--PHP-alt-{$this->boundary_hash}\n";
$this->body .= "Content-Type: text/plain; charset=\"utf-8\"\n";
$this->body .= "Content-Transfer-Encoding: 8bit\n\n";
$this->body .= $this->text_content."\n\n";
}
private function prepare_html(){
$this->body .= "--PHP-alt-{$this->boundary_hash}\n";
$this->body .= "Content-Type: text/html; charset=\"utf-8\"\n";
$this->body .= "Content-Transfer-Encoding: 8bit\n\n";
$this->body .= $this->html_content."\n\n";
}
//convert to utf8
private function convert_utf8($subject){
return '=?UTF-8?B?'.base64_encode($subject).'?=';
}
}



Besoin de travaux pour votre site ?

Je suis disponible, contactez-moi !

Commentaires

Ajouter un commentaire

Commenter
Pseudo/Nom
Email
Message
Captcha

Captcha temporairement HS, tapez 2 svp
memo2
Commenter

Hervé le 14 Avril 2021 à 11:35

Merci pour ce script qui fonctionne parfaitement.
Juste une précision concernant les extensions autorisées: il manque l'image "jpg" qu'il faut déclarer en "jpeg" sinon l'extension n'est pas reconnue.

admin le 14 Avril 2021 à 12:29

Merci.

L'IANA est le registre officiel pour les types MIME et maintient à jour la liste exhaustive à l'URL suivante : https://www.iana.org/assignments/media-types/media-types.xhtml

syl le 27 Septembre 2022 à 15:42

Bonjour,
j'ai mis le script en place sur mon espace, je le lance, le formulaire apparait , je renseigne clique sur envoyer. le script indique succés ... mais je ne reçois pas de mail ... qu'aurais ommis de faire ?

admin le 27 Septembre 2022 à 15:50

Bonjour, je vous conseil d'activer les erreurs PHP pour avoir un débug facile des scripts qui ne fonctionnent pas.

corty84 le 19 Novembre 2022 à 16:34

Bonjour, ça ne fonctionne pas chez moi, j'ai modifiée l'adresse mail en y mettant la mienne, je rempli les champs que j'avais déjà écrit en html et css, clique sur envoyer et...rien , nada. merci quand même pour le script, c'était une bonne initiative. je vais chercher une solution ailleurs du coup.

admin le 19 Novembre 2022 à 16:35

Une PHP erreur s'affiche ? Avez-vous les erreurs d'activé pour pouvoir débuguer facilement ?

cort84 le 19 Novembre 2022 à 16:59

non rien du tout. pas de message. quand vous me parlez d'erreurs activées j'avoue ignorer la façon de l'activer et mieux encore je ne sais pas où trouver tout ça...voilà. c'est le problème avec tout ce qui n'est pas fait soi-même, c'est galère a intégrer à du fait maison.

admin le 19 Novembre 2022 à 17:02

Sur quoi travaillez-vous ? W/AMP/XAMP ou directement sur votre hébergement (ce que je conseil pas car vous avez des cache qui peuvent être mis et les modifications ne sont pas tout de suite effectives !) ?

cort84 le 19 Novembre 2022 à 17:06

pour l'instant je suis encore en local je tente de le finir pour le mettre en hébergement, je sais pas si ça réponds correctement à votre question

admin le 19 Novembre 2022 à 17:08

Voilà comment afficher les erreurs PHP, testez et dite moi ce qui ne va pas s'il vous plaît.

Pierre le 10 Décembre 2022 à 09:48

Dans la sélection des suffixes, je n'arrive pas à activer le .jpg et d'ailleurs je ne trouve pas dans la liste officielle. Existe-t-il une solution pour contourner cette difficulté ?
Plus largement, est il possible ou nom d'utiliser votre script avec des terminaisons de fichiers propriétaires (exemple .cbr ou .adi ) Merci pour votre réponse et pardon pour mon incompétence ;-)

admin le 10 Décembre 2022 à 10:44

Oui :

$UPLOAD['extensions_autorisees']=array(
".adi"=>"image/adi", //ou laisse vide le deuxième paramètre, j'ai pas prévu cette possibilité mais ça devrait fonctionner
".jpg"=>"image/jpg",
".cbr"=>"image/cbr",
);

Pierre le 10 Décembre 2022 à 11:29

Désolé, aucune des deux solutions ne fonctionnent .

".pdf"=>"application/pdf",
".jpg"=>"image/jpg",
".JPG"=>"image/JPG",

engendre le msg d'erreur :
• Le format du fichier 1 est incorrect (seulement les extensions suivantes: .pdf, .jpg, .JPG, sont acceptées).

idem si je laisse vide le second paramètre.
idem avec les terminaisons .cbr ou .adi qui sont des fichiers texte.

Merci pour votre intervention et pour le script que j'utilise bien avec l'extension .pdf

admin le 10 Décembre 2022 à 11:31

Mettez aussi jpeg et image/jpeg

Pierre le 10 Décembre 2022 à 11:49

Effectivement cela fonctionne maintenant pour les images en jpg et je vous remercie.
Que me conseillez vous pour les fichiers texte disposant d'un suffixe .cbr ou .adi (normes Cabrillo et Adif ) que je suis amené à gérer ? si toutefois c'est possible ?
Merci à nouveau et encore pour votre temps et la rapidité de vos réponses .

admin le 10 Décembre 2022 à 11:54

Mettre les extensions dans le tableau des extensions autorisées :
".cabrillo" => "",
".adif" => ""

Gérard le 13 Janvier 2023 à 13:27

Bonjour,
Sous la version Php 8.2
$this->base64_attachments = array(); n'est plus accepté
(Creation of dynamic property C2Mail::$base64_attachments is deprecated)

admin le 13 Janvier 2023 à 13:36

Rajoutez cette déclaration en haut de la classe C2Mail :

private $base64_attachments;


Dite moi moi si ça résolve le problème, au quel cas je modifierai le code source ici pour les autres utilisateurs :)

Gérard le 13 Janvier 2023 à 13:51

Merci pour la réactivité
Hélas, si je n'ai plus de message d'erreur par contre le mail n'arrive pas et ce sans explication

Gérard le 17 Janvier 2023 à 12:36

Oups: private $base64_attachments; en local cela fonctionne. Le souci vient de mon hébergeur.

admin le 17 Janvier 2023 à 12:39

OK, merci pour ces précisions :)

Retour à la liste des scripts