Télécharger
Noter:

Ajouté le 28/01/2019
Visionné 45140 fois
4.6/5

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

Formulaire de contact avec pièce jointe:
<?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;
/**
* @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).'?=';
}
}

Commentaires

Pas encore de commentaire ajouté, soyez le premier!

Ajouter un commentaire

Pseudo/Nom *
Email *
Message *
La balise [code]Votre code...[/code] peut être utilisée

Captcha * memo2

Les champs marqués d'un * sont obligatoires.

Retour à la liste des scripts

Flag Counter