// fonction perso : retourne true si l'adresse est du type xx@xx.xx , false autrement
function test_addresse($ad)
{
// echo "on teste l'adresse $ad";
return( ereg('^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+'.
'@'.
'[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.'.
'[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$',
$ad) );
}
$a="michel@cabare.net"; // fixé avec mon adresse mail pour le 1° param, a:)
// on récupère ici depuis le formulaire les champs suivant
// $sujet=$_POST[sujet];
// $sujet : contient le sujet du mail pour le 2° param, sujet:)
// $corps=$_POST[corps];
// $corps : contient le contenu du mail pour le 3° param, message:)
// $cc=$_POST[cc];
// $cc : contient une adresse mail pour le 4° param entete, cc:)
// $pj=$_POST[pj];
// $pj : contient le fichier donné en pièce jointe.
// $erreur est un tableau qui contiendra tous les messages d'erreurs
unset ($erreurs); // raz de cette variable, au cas ou, pour etre sur
$erreurs = array();
// teste si le champ sujet: est rempli
if($sujet) {
// echo "cela roule";
}
else {
$sujet = "sans sujet"; // si le demandeur n'a rien prévu, on met ce sujet
}
// test validite adresse mail en cc // supression des espaces eventuels
$cc = str_replace(" ", "", $cc);
if (!$cc=="") {
if(!test_addresse($cc)) {
$erreurs[] = "l'adresse donnée en copie conforme -$cc- semble incorrecte";
}
}
//$_FILES["monfichier"]["name"]; est équivalent à : $monfichier_name; on récupère le nom
//$_FILES["monfichier"]["size"]; est équivalent à : $monfichier_size; on récupère la taille
//$_FILES["monfichier"]["type"]; est équivalent à : $monfichier_type; on récupère son type
//$_FILES["monfichier"]["tmp_name"] ; est équivalent à : $monfichier_tmp_name; nom temporaire du fichier qui sera chargé sur la machine serveur
// test validite taille piece jointe (limite à 5 Mega chez Amen.fr, 100 ko chez Online.fr)
if($pj) {
if($pj_size > 1000 * 1000) {
$erreurs[] = "La taille du fichier joint dépasse la taille autorisée.
Votre fichier est de ".number_format($pj_size, 2, ",", " ")." Ko et la taille maximale autorisée est de 1 mega";
// la fonction number_format retourne une chaîne avec un nombre formaté. number_format accepte 1,2 ou 4 paramètres
// Avec 4 paramètres ici pour nous, formatage avec 2 décimales, "," comme séparateur décimal, et " "séparateur de milliers
}
else
{
echo "la piece jointe -$pj- se nomme $pj_name sa taille est de $pj_size son type MIME est $pj_type";
$pjnomorigine = $pj_name;
}
}
// il n'y a pas d'erreur, on peut continuer
//******************************************
if(count($erreurs) == 0)
{
$hcc="Cc: $cc \n";
// mot clé Cc: permet de définir une adresse mail d'envois en copie
$entete=$hcc;
// creation du 4° paramètre
// teste si un fichier est joint au message
if($pj)
{
// génère un nombre aléatoire unique servant de délimiteur que l'on ne peut trouver nulle part dans le corps du message
$boundary = md5(uniqid(rand()));
// ajout du champs from
$entete .= "From: responsable \n";
// c'est un message au format MIME
$entete .= "MIME-Version: 1.0\r\n";
// ce message est composé de plusieurs parties
$entete .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
//-- corps du message --
$message = "C'est un message de format MIME en plusieurs parties.\r\n";
$message .= "--$boundary\r\n";
// type MIME, version du mail (HTML ou texte pur)
$message .= "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n";
// format d'encodage des données
$message .= "Content-Transfer-Encoding: 8bit\r\n";
// contenu du message récupéré depuis le formulaire
$message .= "$corps\n\n";
// teste si le navigateur envoie le type MIME du fichier joint
if($pj_type)
$type_mime = $pj_type;
else // type MIME par défaut
$type_mime = "application/octet-stream";
// ******* UPLOAD DE FICHIER N.B: particularite Provider online ! ! ! ********************
// lorsque l'on telecharge un fichier, on peut le stocker dans un dossier quelconque par exemple tmp
// ce dossier tmp doit etre crée au préalable. le chemin de ce dossier est le suivant chez online :
// tmp/ à la racine du site web donc depuis le dossier mail-email cela donne ../../../tmp/
// pour charger le fichier uploadé ds un fichier de destination on utilise
// la fonction copy( string filename , string destination )
//***********************************************************************************************
//******* récupération du nom du fichier uploadé**********/
$fichiercible="tmp/" . $pj_name;
/******** copie du fichier dans le dossier adéquat*****/
/* copy fait une copie du fichier temp passé au fichier physique, elle renvoit TRUE en cas de succès, et FALSE sinon */
copy($pj,$fichiercible) or die("copie de fichier échouée, le nom du fichier est $fichier_name -");
/******* récupération du nom du fichier uploadé**********/
/* le dossier physique des fichiers est tmp au niveau de la racine du site...*/
$pj_name="tmp/".$pjnomorigine;
$pj=$pj_name;
echo "apres copie la pj so nomme $pj_name, sa taille est $pj_size son type MIME est $pj_type ";
// lecture du fichier temporaire stocké chez le provider
// son contenu est placé dans la variable $fichier_joint
$fp = fopen($pj,"r");
$fichier_joint = fread($fp,filesize($pj));
fclose($fp);
//unlink($pj); // supprime le fichier stocké sur le serveur Web (optionnel, permet de garder une trace des pj...
$message .= "--$boundary\n";
// les fichiers texte n'ont pas besoin d'être codés en BAse64, pour verifier si le fichier est un fichier texte
// on vérifie si dans son type mime on retrouve la chaine "text"
if(eregi("text",$pj_type)) {
// définition du champ type
$message .= "Content-Type: $type_mime;\r\n name=\"$pjnomorigine\"\r\n";
// encodage en 8 bits
$message .= "Content-Transfer-Encoding: 8bit\r\n";
// affichage du fichier joint dans le mail ("inline"); l'autre possiblité est "attachment" (comme pièce jointe)
$message .= "Content-Disposition: inline;\r\n filename=\"pjnomorigine\"\r\n";
$message .= "$fichier_joint\r\n";
$message .= "--$boundary--";
} else
{ // ce n'est pas un fichier texte, faut encoder et découper en base64...
$fichier_joint = chunk_split(base64_encode($fichier_joint));
// définition du champ type
$message .= "Content-Type: $type_mime;\r\n name=\"$pjnomorigine\"\r\n"; // dans name= on donne le nom de la pièce jointe
// encodage du fichier joint en base64
$message .= "Content-Transfer-Encoding: base64\r\n";
// affichage du fichier joint dans le mail ("inline"); l'autre possiblité est "attachment" (comme pièce jointe)
$message .= "Content-Disposition: inline; filename=\"$pjnomorigine\"\r\n"; // dans filename= on donne le nom de la pièce jointe
$message .= "$fichier_joint\r\n";
$message .= "--$boundary--";
}
}
// pas de fichier joint
else {
$entete .= "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n";
$message = $corps;
}
}
// on verifie le tableau des erreurs, s'il n' est pas vide, on liste les erreurs
//******************************************************************************
if(count($erreurs) > 0)
{
echo "Votre message n'a pu être envoyé pour les raisons suivantes :
";
echo "";
while(list($k,$v) = each($erreurs)) {
echo "- ".$v."
";
}
echo "
";
}
else // s'il est vide, on peut lancer le(s) mail(s) avec ses 4 paramètres
{
// envois du email au destinataire principal
if(!mail($a, $sujet, $message, $entete))
echo "Le message à $a n'a pu être envoyé.";
// L'envoi du email a l'adresse donnée en Cc
if($cc) {
if(!mail($cc, $sujet, $message, $entete))
echo "Le message à $cc n'a pu être envoyé.";
}
}
?>