Fichier joint à un mail via formulaire sans DB
Posté : 30 juil. 2007, 11:22
Bonjour,
Ayant été très agréablement surpris de la pertinence des réponses apportées aux questions posées sur le forum je me permet d'exposer un problème que je n'arrive pas à résoudre (j'ai pourtant parcouru les différents thread qui faisaient référence à ce genre de situation).
Je dispose du code suivant dans mon formulaire:

N'ayant aucune expérience concernant l'envoi de pièce jointe par mail, je suppose que toutes les lignes hors texte central ne devraient pas s'afficher et que mon fichier devrait apparaître comme téléchargeable. Malheureusement je ne comprend pas d'où vient le problème, j'ai pourtant bien suivi les instructions données dans d'autres thread ou tutoriaux.
Ayant été très agréablement surpris de la pertinence des réponses apportées aux questions posées sur le forum je me permet d'exposer un problème que je n'arrive pas à résoudre (j'ai pourtant parcouru les différents thread qui faisaient référence à ce genre de situation).
Je dispose du code suivant dans mon formulaire:
<tr class="unite">
<td><img src="images/puceliste.gif" /> <b>CV joint </b>
</td>
<td width="70%">
<center>
<input type="file" name="fichier" value="Choisir">
</center>
</td>
</tr>
Et voici le code contenu dans les balises php toujours dans la même page:
<?php
}
//Si la variable $Nom n'existe pas, cela signifie que le formulaire n'a pas encore été complété. La fonction formulaire() est alors appelée pour l'afficher. Si la variable $Nom existe, les données sont récupérées dans les variables.
if(!isset($nom)) {
formulaire();
}
else {
if ( ! empty($fichier)) {
$fich= $_FILES['fichier']['tmp_name'];
$ftaille = $_FILES['fichier']['size'];
$ftype = $_FILES['fichier']['type'];
$fnom = $_FILES['fichier']['name'];
$destinataire = '[email protected]';
$from_email = trim(htmlentities($_POST['email']));
$entetedate = date("D, j M Y H:i:s +0100"); // Offset horaire
$entetemail = "From: $from_email \n"; // Adresse expéditeur
$entetemail .= "Cc: \n";
$entetemail .= "Bcc: \n"; // Copies cachées
$entetemail .= "Reply-To: $from_email \n"; // Adresse de retour
$entetemail .= "X-Mailer: PHP/" . phpversion() . "\n" ;
$entetemail .= "Date: $entetedate";
$message = "Société : ".trim(($_POST['societe']))."\n";
$message .= "\n";
$message .= "Expérience dans la sécurité : ".trim(($_POST['experience']))."\n";
$message .= "\n";
$message .= "".trim(($_POST['particule']))." ";
$message .= "".trim(($_POST['nom']))." ";
$message .= "".trim(($_POST['prenom']))."\n";
$message .= "\n";
$message .= "".trim(($_POST['adresse']))."\n";
$message .= "".trim(($_POST['codepostal']))." ";
$message .= "".trim(($_POST['ville']))."\n";
$message .= "\n";
$message .= "Email : ".trim(($_POST['email']))."\n";
$message .= "Tel : ".trim(($_POST['telephone']))."\n";
$message .= "\n";
$message .= "Message : \n".trim($_POST['message'])."\n";
// ajout d'un texte à la saisie
$message .= "\r\nNB: Ajout d'une pièce jointe : $fnom\r\n";
// ouverture du fichier joint upload en lecture
$f = fopen($fich, "r") or die("Ouverture du fichier $fich impossible.");
// récupération du code du fichier joint
$code = fread($f, $ftaille);
// encodage standard
$code = chunk_split(base64_encode($code));
fclose($fich);
// dans le cas de l'envoi d'un fichier joint il convient de séparer le corps du message du fichier
// pour cela on utilise un identifiant de séparateur
// identifiant de séparateur, en principe unique
$limite = md5(uniqid(time() ));
// composition de l'en-tête du message : le message textuel suivi du code du fichier
$msg = "--$limite\r\n";
$msg .= "Content-Type: multipart/mixed;boundary=$limite\r\n\r\n";
$msg .= "--$limite\r\n";
$msg .= "Content-type:text/plain;charset=us-ascii\r\n";
$msg .= "Content-transfer-encoding:8bit\r\n";
// Il est indispensable d'introduire une ligne vide entre l'entête et le texte
$msg .= "\r\n";
$msg .= "$message\r\n";
$msg .= "--$limite\r\n";
$msg .= "Content-type:$ftype;name=$fnom\r\n";
$msg .= "Content-transfer-encoding:base64\r\n\r\n";
$msg .= "$code\r\n";
$msg .= "--$limite--";
function decoder($msg){
$msg = stripslashes($msg); // évitete les anti-slashs d'échappement
$msg = trim($msg); // évite les '\n', '\r', '\t' etc
return $msg;
}
//Vérification champs obligatoires ok
if (empty($_POST['societe']) || empty($_POST['experience']) || empty($_POST['particule']) || empty($_POST['nom']) || empty($_POST['prenom']) ||
empty($_POST['adresse']) || empty($_POST['ville']) || empty($_POST['codepostal']) || empty($_POST['email']) || empty($_POST['telephone']) ||
empty($_POST['message']) ) {
echo "<p class='red'>Vous n'avez pas complété entièrement votre formulaire :</p>";
$erreur=1;
}
//Vérification validité du mail
if (!eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-_.]?[0-9a-z])*\\.[a-z]{2,4}$",$_POST['email']) && ($erreur<>1)){
echo "<p class='red'>L'adresse e-mail est incorrecte :</p>";
$erreur=1;
}
//Vérification validité du numéro de téléphone
if (!eregi("^([0-9]){10}$",$_POST['telephone']) && ($erreur <>1)){
echo "<p class='red'>Le numéro de téléphone est incorrect :</p>";
$erreur=1;
}
}
else{
echo "<p class='red'>Fichier joint manquant</p>";
$erreur=1;
}
//Si erreur on relance le formulaire
if ($erreur==1) {
formulaire($_POST['societe'],$_POST['particule'],$_POST['nom'],$_POST['prenom'],$_POST['adresse'],$_POST['ville'],$_POST['codepostal'],$_POST['telephone'],$_POST['email'],$_POST['experience'],$_POST['message'],"");
}
else {
if( @mail($destinataire, "[RECRUTEMENT]", decoder($msg), $entetemail) ) {
echo "<p align=\"center\">Message envoyé<br /></p>";
}
else {
echo "<p align=\"center\">Echec lors de l'envoi<br /></p>";
}
}
}
?>
J'ai mis plus de vingt lignes pour que tout soit bien compréhensible par tous. Mon problème est donc le suivant, quand je teste un envoi de mail j'obtiens par exemple:
N'ayant aucune expérience concernant l'envoi de pièce jointe par mail, je suppose que toutes les lignes hors texte central ne devraient pas s'afficher et que mon fichier devrait apparaître comme téléchargeable. Malheureusement je ne comprend pas d'où vient le problème, j'ai pourtant bien suivi les instructions données dans d'autres thread ou tutoriaux.