Page 1 sur 1

fichier joint et formulaire

Posté : 05 sept. 2007, 21:27
par b|zhon
Bonjour à tous,
voilà je débute en php et j'ai quelques petit soucis dans la mise en place d'un formulaire avec fichier joint
<?php
$boundary = "-----=".md5(uniqid(rand()));
function get_extension($filename)
{
   $parts = explode('.',$filename);
   $last = count($parts) - 1;
   $ext = $parts[$last];
   return $ext;
}

$msg_erreur = "Erreur. Les champs suivants doivent être obligatoirement remplis :<br/><br/>";
$msg_ok = "Votre demande a bien été prise en compte.";
$message = $msg_erreur; 
define('MAIL_DESTINATAIRE','[email protected]'); //adresse mail de destination
define('MAIL_SUJET','Demande de devis');  //Sujet du mail

if (empty($_POST['nom'])) 
$message .= "Votre nom<br/>"; 
if (empty($_POST['prenom'])) 
$message .= "Votre Prenom<br/>";              // Verification des champs laissé vide
if (empty($_POST['adresse'])) 
$message .= "Votre adresse <br/>";
if (empty($_POST['codepostal'])) 
$message .= "Votre Code postal<br/>";
if (empty($_POST['ville'])) 
$message .= "Votre Ville<br/>";
if (empty($_POST['email'])) 
$message .= "Votre adresse mail<br/>";

if (strlen($message) > strlen($msg_erreur)) 
 {
 echo $message;
 }
else 
{
foreach($_POST as $index => $valeur) 
 {
 $$index = stripslashes(trim($valeur));
 }

//Préparation de l'entête du mail:
$boundary = "-----=".md5(uniqid(rand()));
$mail_entete = "MIME-Version: 1.0\r\n";
$mail_entete .= "From: {$_POST['nom']}"
             ."<{$_POST['email']}>\r\n";
$mail_entete .= 'Reply-To: '.$_POST['email']."\r\n";
$mail_entete .= "Content-Type: multipart/mixed;boundary=\"\$boundary\"\r\n";
$mail_entete .= 'X-Mailer:PHP/' . phpversion()."\r\n";


// préparation du corps du mail
$mail_corps = "--$boundary\r\n";
$mail_corps .= "Content-Type: $type; charset=\"iso-8859-1\"\r\n"; 
$mail_corps .= "Content-Transfer-Encoding:8bit\r\n"; 
$mail_corps .=  "Société: $societe\n";
$mail_corps .= "Message de : $nom $prenom\n";
$mail_corps .= "Fonction : $fonction\n";
$mail_corps .= "Adresse : $adresse, $codepostal $ville, $pays\n";
$mail_corps .= "Son numéro de téléphone: $telephone, fax : $fax\n";
$mail_corps .= "Son site Internet : $site\n";
$mail_corps .= "Langue source : $select\n";
$mail_corps .= "Langue cible 1: $select2\n";
$mail_corps .= "Langue cible 2 : $select3\n";
$mail_corps .= "Langue cible 3 : $select4\n";
$mail_corps .= "Langue cible 4 : $select5\n\n\n";
$mail_corps .= "Domaine du projet : $projet";


//fichier joint 
$name_file = $_FILES['file']['name'];
$source = $_FILES['file']['tmp_name'];
move_uploaded_file($source, "./".$name_file);
$type="text/plain";
$extension=get_extension($name_file);

if($type=="doc" )
{
   $type="text/vnd.ms-word";
}
else if($type=="xls" )
{
   $type="text/vnd.ms-excel";
}

$type2="image/png";

if($extension=="gif" )
{
   $type2="image/gif";
}
else if($extension=="bmp" )
{
   $type2="image/bmp";
}


// envoi du mail
if (mail(MAIL_DESTINATAIRE,MAIL_SUJET,$mail_corps,$mail_entete)) 
{

  //Le mail est bien expédié
  echo $msg_ok;
} else 
{

  //Le mail n'a pas été expédié
  echo 'Une erreur est survenue lors de l\'envoi du formulaire par email';
}

}

?>
je n'ai pas d'erreur sauf que je ne recois plus les reponses du formulaire ni le fichier joint

Posté : 05 sept. 2007, 23:30
par sadeq
La première chose à faire est de regarder dans la base de données des messages du forum pour chercher un sujet similaire résolu.

C'est ce que j'ai fait et en voilà un qui traite de la même chose que le tiens: http://www.phpfrance.com/forums/voir_su ... e-mail.php :wink:

Posté : 06 sept. 2007, 19:24
par b|zhon
Oué dsl, :oops: :oops: surtout que j'ai l'habitude des forums !!!

Posté : 10 sept. 2007, 21:58
par b|zhon
J'ai bien regardé le lien au-dessus et j'ai toujours des erreurs dans mon code.

Merci de bien vouloir m'aider car j'en ai besoin rapidement :oops:

Voici mon code html :

Code : Tout sélectionner

<form name="form1" method="post" action="traitement2.php"> <table width="673" border="0"> <tr> <td height="26" colspan="6"><div align="left" class="titre2"><strong>1&deg; Information personnelle </strong></div></td> </tr> <tr> <td width="152">&nbsp;</td> <td width="6">&nbsp;</td> <td colspan="4">&nbsp;</td> </tr> <tr> <td><div align="right"><span class="texte">Soci&eacute;t&eacute;</span> :</div></td> <td>&nbsp;</td> <td colspan="4"><input name="societe" type="text" id="societe"> <!--s --> <!--Saisissez votre Nom --></td> </tr> <tr> <td><div align="right"><span class="texte">Nom*</span> :</div></td> <td>&nbsp;</td> <td width="149"><input name="nom" type="text" id="Nom"></td> <td width="90" class="texte"><div align="right">Pr&eacute;nom* :</div></td> <td width="6">&nbsp;</td> <td width="244"><input name="prenom" type="text" id="prenom"></td> </tr> <tr> <td class="texte"><div align="right">Fonction :</div></td> <td>&nbsp;</td> <td colspan="4"><input name="fonction" type="text" id="fonction"></td> </tr> <tr> <td class="texte"><div align="right">Adresse* :</div></td> <td>&nbsp;</td> <td><input name="adresse" type="text" id="adresse"></td> <td class="texte"><div align="right">Code Postal* : </div></td> <td>&nbsp;</td> <td><input name="codepostal" type="text" id="codepostal"></td> </tr> <tr> <td class="texte"><div align="right">Ville* :</div></td> <td>&nbsp;</td> <td><input name="ville" type="text" id="ville"></td> <td class="texte"><div align="right">Pays : </div></td> <td>&nbsp;</td> <td><input name="pays" type="text" id="pays"></td> </tr> <tr> <td class="texte"><div align="right">T&eacute;l&eacute;phone : </div></td> <td>&nbsp;</td> <td><input name="telephone" type="text" id="telephone"></td> <td class="texte"><div align="right">Fax : </div></td> <td>&nbsp;</td> <td><input name="fax" type="text" id="fax"></td> </tr> <tr> <td class="texte"><div align="right">Email* : </div></td> <td>&nbsp;</td> <td><input name="email" type="text" id="email"></td> <td class="texte"><div align="right">Site Internet : </div></td> <td>&nbsp;</td> <td><input name="site" type="text" id="site"></td> </tr> <tr> <td> <div align="center"> &nbsp;</div></td> <td>&nbsp;</td> <td>&nbsp;</td> <td><div align="center"> </div></td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td colspan="6"><strong class="titre2">2&deg; Votre projet </strong></td> </tr> <tr> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td class="texte"><div align="right">Langue source : </div></td> <td class="texte">&nbsp;</td> <td class="texte"> <div align="left"> <select name="select"> <option value="1">Afrikaans</option> ... </select> </div></td> <td><div align="center"> </div></td> <td class="texte"><div align="right">Langue cible 1 : </div></td> <td class="texte">&nbsp;</td> <td class="texte"> <div align="left"> <select name="select2"> <option value="0">Aucune</option> ... </select> <td class="texte"><div align="right">Langue cible 2 : </div></td> <td class="texte">&nbsp;</td> <td class="texte"> <div align="left"> <select name="select3"> <option value="0">Aucune</option> ... </select> </div></td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td class="texte"><div align="right">Langue cible 3 : </div></td> <td class="texte">&nbsp;</td> <td class="texte"> <div align="left"> <select name="select4"> <option value="0">Aucune</option> ... </select> </div></td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td class="texte"><div align="right">Langue cible 4 : </div></td> <td class="texte">&nbsp;</td> <td class="texte"> <div align="left"> <select name="select5"> <option value="0">Aucune</option> ... </select> </div></td> </tr> <tr> <td valign="top"><div align="right" class="texte">Domaine du projet : </div></td> <td>&nbsp;</td> <td colspan="4" class="texte"><textarea name="projet" cols="50" rows="7" id="projet"></textarea></td> <tr class="texte"> <td valign="middle"><div align="right">Joindre le fichier : </div></td> <td>&nbsp;</td> <td colspan="4"><input name="fichier" type="file" id="fichier" size="40"></td> </tr> <td><div align="center"> <input name="submit" type="submit" value="Envoyer"> </table> </form>

et mon code php
<?php
// 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())); 


$msg_erreur = "Erreur. Les champs suivants doivent être obligatoirement remplis :<br/><br/>";
$mess_ok = "Votre demande a bien été prise en compte.";
$message = $msg_erreur; 
$fich= $_FILES['fichier']['tmp_name']; 
$ftaille = $_FILES['fichier']['size']; 
$ftype = $_FILES['fichier']['type']; 
$fnom = $_FILES['fichier']['name']; 
$entetedate = date("D, j M Y H:i:s +0100"); // Offset horaire 

define('MAIL_DESTINATAIRE','[email protected]'); //adresse mail de destination
define('MAIL_SUJET','Demande de devis');  //Sujet du mail

// Tester le serveur 
if(strtoupper(substr(PHP_OS,0,3)=='WIN'))
    { 
      $eol="\r\n"; 
      $sol="\n"; 
    }elseif(strtoupper(substr(PHP_OS,0,3)=='MAC'))
	{ 
      $eol="\r"; 
    }else
	{ 
      $eol="\n"; 
    } 

// Verification des champs laissé vide

if (empty($_POST['nom'])) 
$message .= "Votre nom<br/>"; 
if (empty($_POST['prenom'])) 
$message .= "Votre Prenom<br/>";              
if (empty($_POST['adresse'])) 
$message .= "Votre adresse <br/>";
if (empty($_POST['codepostal'])) 
$message .= "Votre Code postal<br/>";
if (empty($_POST['ville'])) 
$message .= "Votre Ville<br/>";
if (empty($_POST['email'])) 
$message .= "Votre adresse mail<br/>";


if (strlen($message) > strlen($msg_erreur)) 
 {
 echo $message;
 }
else 
{
foreach($_POST as $index => $valeur) 
 
 $$index = stripslashes(trim($valeur));
 }

//Préparation de l'entête du mail:

$mail_entete = "From: {$_POST['nom']}"
             ."<{$_POST['email']}>\r\n";
$mail_entete .= 'Reply-To: '.$_POST['email']."\r\n";
$mail_entete .=  "X-Mailer: PHP/" . phpversion() . "\n" ;;
$mail_entete .= "Date: $entetedate";
$mail_entete .= "Content-Type: multipart/mixed;\n"; // On indique que le mail est divisé en plusieurs parties 
$mail_entete .= "boundary=\"----=$limite\"\n\n";  // On indique quel est le séparateur utilisé 

// préparation du corps du mail

$mail_corps =  "Société: $societe\n";
$mail_corps .= "Message de : $nom $prenom\n";
$mail_corps .= "Fonction : $fonction\n";
$mail_corps .= "Adresse : $adresse, $codepostal $ville, $pays\n";
$mail_corps .= "Son numéro de téléphone: $telephone, fax : $fax\n";
$mail_corps .= "Son site Internet : $site\n";
$mail_corps .= "Langue source : $select\n";
$mail_corps .= "Langue cible 1: $select2\n";
$mail_corps .= "Langue cible 2 : $select3\n";
$mail_corps .= "Langue cible 3 : $select4\n";
$mail_corps .= "Langue cible 4 : $select5\n\n\n";
$mail_corps .= "Domaine du projet : $projet";


   

// composition de l'en-tête du message : le message textuel suivi du code du fichier 
 
$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 .= "$mail_corps\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----"; 




// envoi du mail
if (mail(MAIL_DESTINATAIRE,MAIL_SUJET,$msg,$mail_entete)) 
{

  //Le mail est bien expédié
  echo $mess_ok;
} else 
{

  //Le mail n'a pas été expédié
  echo 'Une erreur est survenue lors de l\'envoi du formulaire par email';
}


?>
Voici ce qu'il m'affiche lorsque j'appui sur envoyer sans remplir le formulaire :

Erreur. Les champs suivants doivent être obligatoirement remplis :
Votre nom
Votre Prenom
Votre adresse
Votre Code postal
Votre Ville
Votre adresse mail
Votre demande a bien été prise en compte.
Je reçois donc quelque chose sur ma boite mail vu que la "demande a bien eté prise en compte"
boundary="----=a143b0df4cd8c28caab3865a468c1b63"
To: [email protected]



----631b24c105a94cba6633f761365aeacf
Content-type:text/plain;charset=us-ascii
Content-transfer-encoding:8bit

Société:
Message de :
Fonction :
Adresse : , ,
Son numéro de téléphone: , fax :
Son site Internet :
Langue source : 1
Langue cible 1: 0
Langue cible 2 : 0
Langue cible 3 : 0
Langue cible 4 : 0


Domaine du projet :
----631b24c105a94cba6633f761365aeacf
Content-type:;name=
Content-transfer-encoding:base64


----631b24c105a94cba6633f761365aeacf----
Quand je remplis les champs je ne reçois rien

Posté : 10 sept. 2007, 22:52
par Ryle
Modération :
b|zhon, afin d'améliorer la lisibilité de ton message,
pense à utiliser les balises [code] ou [php] (selon le langage utilisé).

Par ailleurs, si tu pouvais l'éditer et supprimer tout le code inutile (genre remplacer les 44 options de tes select par des "..."), ça inciterait sans doute d'avantage de monde à faire l'éffort de lire ton code pour essayer de t'aider

Des indications sont disponibles sur la manière de mettre en forme vos messages dans la FAQ

Posté : 14 sept. 2007, 15:55
par b|zhon
Je suis toujours en difficulté avec mon fichier joint :/ .

Si quelqu'un pourrai m'expliquer ou tout simplement m'aider ça serait super gentil car franchement je suis perdu lool
<?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'];
	
 // 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())); 
     
    $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"; 
    $entetemail .= "Content-Type: multipart/mixed;\n"; // On indique que le mail est divisé en plusieurs parties 
    $entetemail .= "boundary=\"----=$limite\"\n\n";  // On indique quel est le séparateur utilisé 
             
    $message  = "Societe :".trim(($_POST['societe']))."\n"; 
    $message .= "Message de :".trim(($_POST['nom']))."";
	$message .= "".trim(($_POST['prenom']))."\n"; 
    $message .= "Fonction :".trim(($_POST['fonction']))."\n";
    $message .= "Adresse : ".trim(($_POST['adresse']))."";
	$message .= "".trim(($_POST['ville']))."";
	$message .= "".trim(($_POST['codepostal']))."";
	$message .= "".trim(($_POST['pays']))."\n";
    $message .= "Son numéro de téléphone :" .trim(($_POST['telephone']))."";
	$message .= "fax :".trim(($_POST['fax']))."\n";
    $message .= "Son site Internet :".trim(($_POST['site']))."\n";
    $message .= "Langue source : ".trim(($_POST['select']))."\n";
    $message .= "Langue cible 1 : ".trim(($_POST['select2']))."\n";
    $message .= "Langue cible 2 : ".trim(($_POST['select3']))."\n";
    $message .= "Langue cible 3 : ".trim(($_POST['select4']))."\n";
    $message .= "Langue cible 4 : ".trim(($_POST['select5']))."\n\n\n";
    $message .= "Domaine du projet :".trim(($_POST['projet']))."";
    
// 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); 

     

    

// 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['nom']) || empty($_POST['prenom']) || empty($_POST['adresse']) || empty($_POST['codepostal']) || empty($_POST['ville']) ||  
            empty($_POST['email']) ) 
	{ 
        echo "<p class='red'>Vous n'avez pas compl&eacute;t&eacute; enti&egrave;rement votre formulaire&nbsp;:</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&nbsp;:</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&eacute;ro de t&eacute;l&eacute;phone est incorrect&nbsp;:</p>"; 
        $erreur=1; 
    } 
    } 
    
     else 
	 { 
        if( @mail($destinataire, decoder($msg), $entetemail) ) 
		{ 
            echo "<p align=\"center\">Message envoy&eacute;<br /></p>"; 
        }  
        else 
		{ 
            echo "<p align=\"center\">Echec lors de l'envoi<br /></p>"; 
        }  
    } 
} 
?> 
Je me suis aider d'un code utilisé par une personne du forum cf lien tout en haut (2eme post)
Dites moi pourquoi n'utilisons pas la fonction
move_uploaded_file(

Merci d'avance

Posté : 14 sept. 2007, 20:10
par Ryle
La fonction move_uploaded_file() permet comme son nom l'indique de déplacer un fichier uploadé par l'utilisateur. Lorsqu'un utilisateur upload un fichier, celui-ci est enregistré dans le répertoire temporaire de php et est détruit à la fin de l'exécution du script. Cette fonction permet donc de déplacer le fichier dans un autre dossier afin de le conserver sur le serveur.

Mais si le but est de garder faire suivre le fichier par mail, il n'est pas indispensable d'en conserver une copie sur le serveur. Tu peux donc te passer du move en te contentant dans ton script de lire le fichier temporaire et de l'inclure dans ton mail, laissant le serveur supprimer le fichier du serveur à la fin du traitement.

Après, c'est à toi de voir si tu veux en garder une trace ou pas.

Posté : 15 sept. 2007, 13:43
par b|zhon
Merci de ton explication.

J'ai repris tout mon code php depuis le début, j'ai deja un peu mieux compris les fonctions ...

Mais j'ai encore quelques soucis, le code à l'air correcte en lui même (pas d'erreur d' { ...) sauf qu'il ne veut pas m'envoyer le corps du message.
De plus, dès que je veux envoyer un fichier joint j'ai toujours l'erreur "ouverture du fichier $fich impossible ..."
cad qu'il n'execute pas cette fonction : $f = fopen($fich, "r")

Voici mon .php :
<?php
$msg_erreur = "Erreur. Les champs suivants doivent être obligatoirement remplis :<br/><br/>";
$msg_ok = "Votre demande a bien été prise en compte.";
$message = $msg_erreur; 
define('MAIL_DESTINATAIRE','[email protected]'); //adresse mail de destination
define('MAIL_SUJET','Demande de devis');  //Sujet du mail

// Verification des champs laissé vide
if (empty($_POST['nom'])) 
$message .= "Votre nom<br/>"; 
if (empty($_POST['prenom'])) 
$message .= "Votre Prenom<br/>";             
if (empty($_POST['adresse'])) 
$message .= "Votre adresse <br/>";
if (empty($_POST['codepostal'])) 
$message .= "Votre Code postal<br/>";
if (empty($_POST['ville'])) 
$message .= "Votre Ville<br/>";
if (empty($_POST['email'])) 
$message .= "Votre adresse mail<br/>";

if (strlen($message) > strlen($msg_erreur)) 
 {
 echo $message;
 }
else 
{
 foreach($_POST as $index => $valeur) 
 {
 $$index = stripslashes(trim($valeur));
 }

 //Préparation de l'entête du mail:
  $entete  = "From: $email\r\n";
  $entete .= "Reply-To: $email\r\n";
  $entete .= "MIME-Version: 1.0\r\n";
  $entete .= "X-Mailer: PHP\r\n";


 /******************************
 * Cas ajout d'un fichier joint
 ******************************/


  if ( ! empty($fichier)) 
  {
  $fich= $_FILES['fichier']['tmp_name'];
  $taille = $_FILES['fichier']['size'];
  $type = $_FILES['fichier']['type'];
  $nom = $_FILES['fichier']['name'];
 
 
  /* 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() ));
  // préparation du corps du mail
  $mail_corps =  "Société: $societe\n";
  $mail_corps .= "Message de : $nom $prenom\n";
  $mail_corps .= "Fonction : $fonction\n";
  $mail_corps .= "Adresse : $adresse, $codepostal $ville, $pays\n";
  $mail_corps .= "Son numéro de téléphone: $telephone, fax : $fax\n";
  $mail_corps .= "Son site Internet : $site\n";
  $mail_corps .= "Langue source : $select\n";
  $mail_corps .= "Langue cible 1: $select2\n";
  $mail_corps .= "Langue cible 2 : $select3\n";
  $mail_corps .= "Langue cible 3 : $select4\n";
  $mail_corps .= "Langue cible 4 : $select5\n\n\n";
  $mail_corps .= "Domaine du projet : $projet";

  // 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, $taille);
  // encodage standard
  $code = chunk_split(base64_encode($code));

  /* composition de l'en-tête du message :
  * le message textuel suivi du code du fichier
  *********************************************/
  
  $entete .= "Content-Type: multipart/mixed;boundary=$limite\r\n\r\n";
  $entete .= "--$limite\r\n";

  $entete .= "Content-type:text/plain;charset=us-ascii\r\n";
  $entete .= "Content-transfer-encoding:8bit\r\n\r\n";
  $entete .= "$mail_corps\r\n";

  $entete .= "--$limite\r\n";
  $entete .= "Content-type:$type;name=$nom\r\n";
  $entete .= "Content-transfer-encoding:base64\r\n\r\n";
  $entete .= "$code\r\n";
  $entete .= "--$limite--";

 

 }
  // envoi du mail
  if (mail(MAIL_DESTINATAIRE,MAIL_SUJET,"",$entete)) 
  {

  //Le mail est bien expédié
  echo $msg_ok;
  } 
  else 
  {

  //Le mail n'a pas été expédié
  echo 'Une erreur est survenue lors de l\'envoi du formulaire par email';
  }

}

?>

Merci d'avance

Posté : 15 sept. 2007, 23:03
par Ryle
Si le corps de ton message est vide, c'est sans doute parce qu'au moment d'envoyer le mail, au lieu de spécifier le texte que tu as préparé plus haut comme argument de la fonction mail, tu colles une chaine vide :
if (mail(MAIL_DESTINATAIRE,MAIL_SUJET,"",$entete))  
Quant au problème d'ouverture du fichier, c'est parce que ta variable $fich contient le nom temporaire du fichier (et uniquement le nom). Si tu veux pouvoir ouvrir ce fichier il te faut également préciser le chemin du dossier temporaire dans lequel il est stocké (voir le détail des valeurs de $_SERVER pour le retrouver)

Posté : 16 sept. 2007, 22:20
par b|zhon
Tout d'abord Merci à toi de prendre le temps de me lire.
Ensuite, au moment d'envoyer le formulaire a l'adresse mail
if (mail(MAIL_DESTINATAIRE,MAIL_SUJET,"",$entete))
Dans ma variable $entete , il y a ma variable $corps_mail où se trouve le corps du message
 $entete .= "Content-Type: multipart/mixed;boundary=$limite\r\n\r\n";
  $entete .= "--$limite\r\n";
  
  $entete .= "Content-type:text/plain;charset=us-ascii\r\n";
  $entete .= "Content-transfer-encoding:8bit\r\n\r\n";
  $entete .= "$mail_corps\r\n";

  $entete .= "--$limite\r\n";
  $entete .= "Content-type:$type;name=$nom\r\n";
  $entete .= "Content-transfer-encoding:base64\r\n\r\n";
  $entete .= "$code\r\n";
  $entete .= "--$limite--";
Ensuite, pour ce qui est du fichier joint, je me suis juste aidé d'un code utilisé par un membre (cf lien 2eme post) et ce dernier n'utilisait pas la fonction $_SERVER. De plus je veux juste envoyer le fichier joint et non le lire ni l'ouvrir.
Désolé si pour vous , ça à l'air tout con mais je débute et vous etes tous passer par là lol .

En tout cas merci pour vos reponse

Posté : 17 sept. 2007, 10:24
par Ryle
Regarde la documentation de la fonction mail() et les paramètres qui doivent lui être passés :
bool mail ( string $to, string $subject, string $message [, string $additional_headers [, string $additional_parameters]] )
Le message n'a rien à faire dans l'entête qui est uniquement destinée à .. ben à l'entête :)

Quant au fichier joint, pour pouvoir l'inclure, toi il te suffit de le glisser dans ton mail, mais php ne sait pas faire ça.. il a besoin d'ouvrir et lire le fichier et d'encoder ce qu'il lit pour l'insérer dans le corps de ton mail. C'est ensuite ton client de messagerie qui le désencodera et le reconstruira en fonction du type spécifié pour te proposer le fichier dans son format d'origine :)

Pour le chemin, afin d'accéder à la pièce jointe, il te faut bien expliquer au script ou se trouve le fichier à inclure, sachant que par défaut il va regarder dans le répertoire d'exécution du script. Donc pas obligatoire si le fichier est uploadé là, mais c'est pas super propre ne sachant pas à l'avance comment sera configuré le serveur.

Posté : 18 sept. 2007, 19:37
par b|zhon
Le probleme du corps du message est résolu , merci ryle pour ton aide.

Maintenant je vais me pencher sur le fichier joint et j'ai une question.
Pourquoi ce membre dans son code , il ne fait ni l'encodage ni l'ouverture du fichier ... C'est pour cela que je suis perdu et ce n'est pas le seul à faire comme ca .

http://www.phpfrance.com/forums/voir_su ... e-mail.php

ou encore

http://www.ac-creteil.fr/util/programma ... rie-pj.php

Pendant ce temps je vais essayer de faire comme tu m'as dit

Encore merci de ton aide !

Posté : 19 sept. 2007, 00:11
par Ryle
Si tu regardes bien le code spécifié dans les deux liens que tu donnes (qui semblent visiblement être le même code) tu trouves ceci :
// 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)); 

Posté : 19 sept. 2007, 13:24
par b|zhon
Oui merci ! mais dans mon code j'ai rajouté la meme chose :

Reconstruction de mon php.

Voici ce que ça donne


<?php 
{ 
 
if(strtoupper(substr(PHP_OS,0,3)=='WIN'))
    { 
      $eol="\r\n"; 
      $sol="\n"; 
    }elseif(strtoupper(substr(PHP_OS,0,3)=='MAC'))
	{ 
      $eol="\r"; 
    }else{ 
      $eol="\n"; 
    } 
		
/*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']));
	 $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 .= "Content-Type: multipart/mixed;\n"; // On indique que le mail est divisé en plusieurs parties 
     $entetemail .= "boundary=--$limite\n\n";  // On indique quel est le séparateur utilisé 
	 
	 // préparation du corps du mail
     $mail_corps =  "Société: $societe\n";
     $mail_corps .= "Message de : $nom $prenom\n";
     $mail_corps .= "Fonction : $fonction\n";
     $mail_corps .= "Adresse : $adresse, $codepostal $ville, $pays\n";
     $mail_corps .= "Son numéro de téléphone: $telephone, fax : $fax\n";
     $mail_corps .= "Son site Internet : $site\n";
     $mail_corps .= "Langue source : $select\n";
     $mail_corps .= "Langue cible 1: $select2\n";
     $mail_corps .= "Langue cible 2 : $select3\n";
     $mail_corps .= "Langue cible 3 : $select4\n";
     $mail_corps .= "Langue cible 4 : $select5\n\n\n";
     $mail_corps .= "Domaine du projet : $projet";
	 
	 // ajout d'un texte à la saisie 
     $mail_corps .= "\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));
  
      
	 
	 // 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 = "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\r\n";
     $msg .= "$mail_corps\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['nom']) || empty($_POST['prenom']) || empty($_POST['adresse']) || empty($_POST['codepostal']) || empty($_POST['ville']) ||  
            empty($_POST['email'])) 
			{ 
            echo "<p class='red'>Vous n'avez pas compl&eacute;t&eacute; enti&egrave;rement votre formulaire&nbsp;:</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&nbsp;:</p>"; 
            $erreur=1; 
            } 
   
     } 
    else
	{ 
        echo "<p class='red'>Fichier joint manquant</p>"; 
        $erreur=1; 
    } 
     
	$erreur!=1;
	{
	if( @mail($destinataire, "Demande de devis", decoder($msg), $entetemail) ) 
	    { 
            echo "<p align=\"center\">Message envoy&eacute;<br /></p>"; 
        }  
        else 
		{ 
            echo "<p align=\"center\">Echec lors de l'envoi<br /></p>"; 
        }  

	} 
 }
}

?>
Le fichier joint est bien envoyé cependant il se retrouve dans le corps du message.
Je suppose à une erreur de limite mais ne la voit pas.

Merci de m'aider