// vérifie que le formulaire a bien été soumis
if(strtolower($REQUEST_METHOD) == "post") {
// l'upload et l'encodage d'un fichier peuvent prendre du temps...
set_time_limit(500);
// retourne true si l'adresse est correcte, false autrement
function test_adresse($adresse) {
if(!ereg("^[^@]+@([a-zA-Z0-9\-]+\.)+([a-zA-Z0-9\-])",$adresse)) {
return false;
} else {
return true;
}
}
// retourne true si les adresses email sont correctes, false autrement
function parse_address($str) {
$adresses = explode(",",$str);
while(list(,$v) = each($adresses)) {
if(!test_adresse($v)) return false;
}
return true;
}
// teste les données du formulaire et ajoute les erreurs dans un tableau
$erreurs = array();
$from = trim($from);
if(!test_adresse($from)) {
$erreurs[] = "Votre adresse email est incorrecte";
}
$to = str_replace(" ", "", $to);
if(!parse_address($to)) {
$erreurs[] = "Au moins une des adresses email des destinaires est incorrecte";
}
if($cc) {
$cc = str_replace(" ", "", $cc);
if(!parse_address($cc))
$erreurs[] = "Au moins une des adresses email des Cc est incorrecte";
}
if($bcc) {
$bcc = str_replace(" ", "", $bcc);
if(!parse_address($bcc))
$erreurs[] = "Au moins une des adresses email des Bcc est incorrecte";
}
if($pj) {
if($pj_size > 2000 * 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 2000 Ko";
}
}
if(count($erreurs) == 0) {
// supprime les caractères d'échappement
$nom = stripslashes($nom);
$objet = stripslashes($objet);
$content = stripslashes($content);
// teste si le champ Objet est rempli ; encodage de la chaîne en iso-8859-1
if($objet)
$subject = "=?iso-8859-1?q?".str_replace("%", "=", rawurlencode(stripslashes($objet))."?=");
else
$subject = "";
//-- début des en-têtes --
$headers = "From: ";
// teste si le champ Nom est rempli ; encodage de la chaîne en iso-8859-1
if($nom) $headers .= "=?iso-8859-1?q?".str_replace("%", "=", rawurlencode(stripslashes($nom))."?=");
// adresse email de l'expéditeur
$headers .= "<$from>\n";
$headers .= "X-Sender: \n";
// priorité (de 1 à 5)
$headers .= "X-Priority: $priorite\n";
// maileur
$headers .= "X-Mailer: docphp.free.fr\n";
// adresse email de retour en cas d'échec
$headers .= "Return-Path: <$from>\n";
// teste si le champ Cc est rempli pour l'ajouter à l'en-tête
if($cc) $headers .= "cc: $cc\n";
// teste si un fichier est joint au message
if(file_exists($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()));
// c'est un message au format MIME
$headers .= "MIME-Version: 1.0\n";
// ce message est composé de plusieurs parties
$headers .= "Content-Type: multipart/mixed;\n\tboundary=\"$boundary\"";
//-- corps du message --
$message = "C'est un message de format MIME en plusieurs parties.\n\n";
$message .= "--$boundary\n";
// type MIME, version du mail (HTML ou texte pur)
$message .= "Content-Type: text/$enc_texte; charset=iso-8859-1\n";
// format d'encodage des données
$message .= "Content-Transfer-Encoding: 8bit\n\n";
// contenu du message
$message .= "$content\n\n";
$pj_name = "=?iso-8859-1?q?".str_replace("%", "=", rawurlencode(stripslashes($pj_name))."?=");
// 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";
// lecture du fichier temporaire; son contenu est placé dans la variable $fichier_joint
$fp = fopen($pj,"r");
$fichier_joint = fread($fp,filesize($pj));
fclose($fp);
$message .= "--$boundary\n";
// si c'est un fichier texte
if(eregi("text",$pj_type)) {
// définition du champ type
$message .= "Content-Type: $type_mime;\n\tname=\"$pj_name\"\n";
// encodage en 8 bits
$message .= "Content-Transfer-Encoding: 8bit\n";
// affichage du fichier joint dans le mail ("inline"); l'autre possiblité est "attachment" (comme pièce jointe)
$message .= "Content-Disposition: inline;\n\tfilename=\"$pj_name\"\n\n";
$message .= "$fichier_joint\n";
} else {
// lecture et encodage du fichier joint en base64
// conforme à la norme RFC 2045 : scinde une chaîne en plusieurs morceaux
// en plusieurs lignes de 76 caractères délimitées par les caractères "\r\n"
$fichier_joint = chunk_split(base64_encode($fichier_joint));
// définition du champ type
$message .= "Content-Type: $type_mime;\n\tname=\"$pj_name\"\n";
// encodage du fichier joint en base64
$message .= "Content-Transfer-Encoding: base64\n";
// affichage du fichier joint dans le mail ("inline"); l'autre possiblité est "attachment" (comme pièce jointe)
$message .= "Content-Disposition: inline;\n\tfilename=\"$pj_name\"\n\n";
$message .= "$fichier_joint\n";
$message .= "--$boundary--";
}
// pas de fichier joint
} else {
$headers .= "Content-Type: text/$enc_texte; charset=iso-8859-1\n";
$message = $content;
}
// envoie le(s) mail(s)
if(!@mail($to, $subject, $message, $headers))
$erreurs[] = "Erreur interne au serveur. Le message à $to n'a pu être envoyé.";
if($cc) {
$adresses = explode(",",$cc);
while(list(,$v) = each($adresses)) {
if(!@mail($v, $subject, $message, $headers))
$erreurs[] = "Erreur interne au serveur. Le message à $v n'a pu être envoyé.";
}
}
if($bcc) {
$adresses = explode(",",$bcc);
while(list(,$v) = each($adresses)) {
if(!@mail($v, $subject, $message, $headers))
$erreurs[] = "Erreur interne au serveur. Le message à $v n'a pu être envoyé.";
}
}
if(count($erreurs) == 0) {
// redirige vers le formulaire en cas de succès
header("Location:formmail.php");
exit;
}
}
}
?>