formulaire + fichier > envoi par mail html + le fichier

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : formulaire + fichier > envoi par mail html + le fichier

par Butsay » 24 janv. 2007, 14:10

Bonjour,

j'ai recopié les codes de tes 2 pages tels quels (form.php et send.php)
ça ne marche pas !

y-a-t-il des paramétrages à réaliser (autre que l'email de destination) ?

d'avance merci






Saisis-tu mieux expliqué comme ça ?
Oui merci, :D j'ai bien avancé.

Tout fonctionne sauf quand le visiteur met un fichier plus gros que la taille autorisée j'ai ça comme erreur :
Warning: fread(): supplied argument is not a valid stream resource in...
Normalement il devrait avoir : "Votre fichier doit faire moins de 2mo !"
Enfin, c'est pas très grave non plus.

Mes nouvelles pages :

Page form.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>titre</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
<!--
.texte12 {color: #000000; font-size: 12px; font-family: verdana,arial;}
-->
</style>
</head>

<body>
<FORM METHOD="POST" ACTION="send.php" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="2097152" /> 
<table width="100%" border="0" align="center" cellpadding="2" cellspacing="2">
  <tr bgcolor="#FFBB77" class="texte12">
    <td width="50%">Votre nom :</td>
    <td width="50%"><input name="nom" type="text" id="nom" value=""></td>
  </tr>
  <tr bgcolor="#FFBB77" class="texte12">
    <td width="50%">E-mail :</td>
    <td width="50%"><input name="email" type="text" id="email" value=""></td>
  </tr>
  <tr valign="top" bgcolor="#FFBB77" class="texte12">
    <td width="50%"><legend>Envoi de fichiers</legend>
        </td>
    <td width="50%">
      <!-- champs d'envoi de fichier, de type file -->
	  <fieldset>
      <label for="fichier">Fichier :</label>
      <input type="file" name="fichier"/>
      </fieldset></td>
  </tr>
  <tr bgcolor="#FFBB77">
    <td colspan="2"><div align="center">
	     <!-- bouton d'envoi -->
        <input type="submit" name="Submit" value="Valider">
    </div></td>
  </tr>
</table>
</body>
</html>
Page send.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>titre</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?php
function mail_attachement_html($to , $sujet , $message , $fichier , $typemime , $nomdoc , $reply , $from)
{
    $limite = "_parties_". md5(uniqid (rand()));

    $mail_mime = "Date: ".date("l j F Y, G:i")."\n";
    $mail_mime .= "MIME-Version: 1.0\n";
    $mail_mime .= "Content-Type: multipart/mixed;\n";
    $mail_mime .= " boundary="----=". $limite .""\n\n";

    $limite2 = "_parties_". md5 (uniqid (rand()));

    /* Le message en texte simple pour les navigateurs qui n'acceptent pas le HTML */
    $texte_simple .= "This is a multi-part message in MIME format.\n\n";
    $texte_simple .= "------=". $limite ."\n";
    $texte_simple .= "Content-Type: multipart/alternative;\n";
    $texte_simple .= "\tboundary="----=". $limite2 .""\n\n";

    $texte_simple .= "------=". $limite2 ."\n";
    $texte_simple .= "Content-Type: text/plain; \tcharset="iso-8859-1"\n";
    $texte_simple .= "Content-Transfer-Encoding: quoted-printable\n\n";
    $texte_simple .= strip_tags(eregi_replace("<br>", "\n", $message));
    $texte_simple .= "\n\n";

    /* le message en html original */
    $texte_html = "------=". $limite2 ."\n";
    $texte_html .= "Content-Type: text/html; charset="iso-8859-1"\n";
    $texte_html .= "Content-Transfer-Encoding: quoted-printeble\n\n";
    $texte_html .= $message;
    $texte_html .= "\n\n\n------=". $limite2 ."--\n";

    /* le fichier */
    $attachement = "------=". $limite ."\n";
    $attachement .= "Content-Type: ". $typemime ."; name="". $nomdoc .""\n";
    $attachement .= "Content-Transfer-Encoding: base64\n";
    $attachement .= "Content-Disposition: attachment; filename="". $nomdoc .""\n\n";

    $fd = fopen( $fichier, "r" );
    $contenu = fread( $fd, filesize( $fichier ) );
    fclose( $fd );
    $attachement .= chunk_split(base64_encode($contenu));

    $attachement .= "\n\n\n------=". $limite ."\n";
    return mail($to, $sujet, $texte_simple.$texte_html.$attachement, "Reply-to: ". $reply ."\nFrom: ". $from ."\n".$mail_mime);
} 

// ----------------- Début configuration --------------------

// On récupère les données du formulaire
$nom = $_POST['nom'];
$email = $_POST['email'];

// Notez ici l'adresse qui recevra le mail et le fichier
$to = '[email protected]' . ', '; // notez la virgule
// L'adresse du visiteur récupérée plus haut
$to .= "$email";
// Le sujet du mail
$sujet = "Sujet";
// Votre message en html
$message = "
<head>
<title>Votre message en html</title>
<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>
</head>

<body>
<table width='100%' border='1' align='center' cellpadding='0' cellspacing='0' bordercolor='#000000' bgcolor='#FFFFFF'>
      <tr>
        <td><div align='center'><b> Merci  $nom, Nous avons bien reçu votre fichier </b>
</div></td>
      </tr>
    </table>
	</body>
</html>";
// Changer fichier par l'intitulé configuré dans la page formulaire.php, si vous n'avez rien modifié, laissez tel quel
$typemime = $_FILES['fichier']['type'];
$fichier = $_FILES['fichier']['tmp_name'];
$nomdoc = $_FILES['fichier']['name'];
// Adresse de réponse au mail
$reply = "[email protected]";
// Expéditeur
$from = "[email protected]";
// Vous pouvez ajouter ou retirer des extensions si vous le souhaitez
$extensions_ok = array('png', 'gif', 'jpg', 'jpeg', 'doc', 'rtf', 'pdf', 'xls', 'pps', 'ppt', 'zip', 'rar');
// Configurez la taille maximale du fichier en octets, ici 2mo
$taille_max = 2097152;

if(isset($_FILES['fichier']))
{
unset($erreur);

// vérifications
if( !in_array( substr(strrchr($_FILES['fichier']['name'], '.'), 1), $extensions_ok ) )
{
// Vous pouvez changez l'intitulé de la réponse d'erreur si vous le souhaitez
$erreur = 'Extension non autorisée !';
}
elseif( file_exists($_FILES['fichier']['tmp_name'])
and filesize($_FILES['fichier']['tmp_name']) > $taille_max)
{
// Vous pouvez changez l'intitulé de la réponse d'erreur si vous le souhaitez
$erreur = 'Votre fichier doit faire moins de 2mo !';
// ----------------- Fin configuration --------------------
}
else
{
mail_attachement_html($to, $sujet,$message,$fichier,$typemime,$nomdoc,$reply,$from);
}
}
?>
    <p>
<!-- Erreur ? -->
<?php
if(isset($erreur)){
echo '<p>', $erreur ,'</p>';
}
?>

</p>
 

</body>
</html>

par nick3340 » 21 sept. 2005, 06:03

J'ai essayé plusieurs trucs pour permettre aux visiteurs d'envoyer plusieurs fichiers mais je n'y arrive pas.

J'ai ajouté dans le formulaire un autre <input type="file" name="fichier2"/>
Mais en ce qui concerne la page de traitement je ne vois pas comment faire pour ajouter ce fichier au mail.

Existe-til un moyen ?

par nick3340 » 17 sept. 2005, 17:38

Mouais, il y a des bzarreries dans la logique de ton script
Certainement :lol:

J'ai rééssayé, et toujours pareil.

Laisse tomber, ça me dérange pas trop cette erreur à partir du moment où elle apparait à la place d'une autre.
Le visiteur ne devra pas mettre un fichier trop gros et il n'y aura pas de problèmes :D

Merci pour ton aide ;)

par Cyrano » 17 sept. 2005, 17:09

Mouais, il y a des bzarreries dans la logique de ton script: proposition à tester:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>titre</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?php
function mail_attachement_html($to , $sujet , $message , $fichier , $typemime , $nomdoc , $reply , $from)
{
    $limite = "_parties_". md5(uniqid (rand()));

    $mail_mime = "Date: ".date("l j F Y, G:i")."\n";
    $mail_mime .= "MIME-Version: 1.0\n";
    $mail_mime .= "Content-Type: multipart/mixed;\n";
    $mail_mime .= " boundary=\"----=". $limite ."\"\n\n";

    $limite2 = "_parties_". md5 (uniqid (rand()));

    /* Le message en texte simple pour les navigateurs qui n'acceptent pas le HTML */
    $texte_simple .= "This is a multi-part message in MIME format.\n\n";
    $texte_simple .= "------=". $limite ."\n";
    $texte_simple .= "Content-Type: multipart/alternative;\n";
    $texte_simple .= "\tboundary=\"----=". $limite2 ."\"\n\n";

    $texte_simple .= "------=". $limite2 ."\n";
    $texte_simple .= "Content-Type: text/plain; \tcharset=\"iso-8859-1\"\n";
    $texte_simple .= "Content-Transfer-Encoding: quoted-printable\n\n";
    $texte_simple .= strip_tags(eregi_replace("<br>", "\n", $message));
    $texte_simple .= "\n\n";

    /* le message en html original */
    $texte_html = "------=". $limite2 ."\n";
    $texte_html .= "Content-Type: text/html; charset=\"iso-8859-1\"\n";
    $texte_html .= "Content-Transfer-Encoding: quoted-printeble\n\n";
    $texte_html .= $message;
    $texte_html .= "\n\n\n------=". $limite2 ."--\n";

    /* le fichier */
    $attachement = "------=". $limite ."\n";
    $attachement .= "Content-Type: ". $typemime ."; name=\"". $nomdoc ."\"\n";
    $attachement .= "Content-Transfer-Encoding: base64\n";
    $attachement .= "Content-Disposition: attachment; filename=\"". $nomdoc ."\"\n\n";

    $fd = fopen( $fichier, "r" );
    $contenu = fread( $fd, filesize( $fichier ) );
    fclose( $fd );
    $attachement .= chunk_split(base64_encode($contenu));

    $attachement .= "\n\n\n------=". $limite ."\n";
    return mail($to, $sujet, $texte_simple.$texte_html.$attachement, "Reply-to: ". $reply ."\nFrom: ". $from ."\n".$mail_mime);
}

// ----------------- Début configuration --------------------

// On récupère les données du formulaire
$nom = $_POST['nom'];
$email = $_POST['email'];

// Notez ici l'adresse qui recevra le mail et le fichier
$to = '[email protected]' . ', '; // notez la virgule
// L'adresse du visiteur récupérée plus haut
$to .= "$email";
// Le sujet du mail
$sujet = "Sujet";
// Votre message en html
$message = "
<head>
<title>Votre message en html</title>
<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>
</head>
<body>
<table width='100%' border='1' align='center' cellpadding='0' cellspacing='0' bordercolor='#000000' bgcolor='#FFFFFF'>
  <tr>
    <td><div align='center'><b> Merci  ". $nom .", nous avons bien reçu votre fichier </b></div></td>
  </tr>
</table>
</body>
</html>";
// Adresse de réponse au mail
$reply = "[email protected]";
// Expéditeur
$from = "[email protected]";

if(isset($_FILES['fichier']))
{
    // Changer fichier par l'intitulé configuré dans la page formulaire.php, si vous n'avez rien modifié, laissez tel quel
    $typemime = $_FILES['fichier']['type'];
    $fichier = $_FILES['fichier']['tmp_name'];
    $nomdoc = $_FILES['fichier']['name'];
    $taille = $_FILES['fichier']['size'];
    // Vous pouvez ajouter ou retirer des extensions si vous le souhaitez
    $extensions_ok = array('png', 'gif', 'jpg', 'jpeg', 'doc', 'rtf', 'pdf', 'xls', 'pps', 'ppt', 'zip', 'rar');
    // Configurez la taille maximale du fichier en octets, ici 2mo
    $taille_max = 2097152;
    
    unset($erreur);

    // vérifications
    if( !in_array( substr(strrchr($_FILES['fichier']['name'], '.'), 1), $extensions_ok ) )
    {
        // Vous pouvez changez l'intitulé de la réponse d'erreur si vous le souhaitez
        $erreur = 'Extension non autorisée !';
    }
    elseif( file_exists($fichier) && $taille > $taille_max)
    {
        // Vous pouvez changez l'intitulé de la réponse d'erreur si vous le souhaitez
        $erreur = 'Votre fichier doit faire moins de 2mo !';
        // ----------------- Fin configuration --------------------
    }
    else
    {
        mail_attachement_html($to, $sujet,$message,$fichier,$typemime,$nomdoc,$reply,$from);
    }
}
/* Erreur ? */
if(isset($erreur))
{
    echo '<p>'. $erreur .'</p>';
}
?>
</body>
</html>

par nick3340 » 17 sept. 2005, 16:52

J'ai essayé, mais c'est toujours pareil.

Warning: fread(): supplied argument is not a valid stream resource in /home/************/send.php on line 48

Warning: fclose(): supplied argument is not a valid stream resource in /home/************/send.php on line 49

Les lignes 48 -49 :
    $contenu = fread( $fd, filesize( $fichier ) );
    fclose( $fd );

par Cyrano » 17 sept. 2005, 08:03

Pour le message d'erreur de taille, tu as mis ceci:
elseif( file_exists($_FILES['fichier']['tmp_name']) and filesize($_FILES['fichier']['tmp_name']) > $taille_max)
Remplace le "and" par "&&" comme ceci:
elseif( file_exists($_FILES['fichier']['tmp_name']) && filesize($_FILES['fichier']['tmp_name']) > $taille_max)
Et refais un test.

par nick3340 » 17 sept. 2005, 05:24

Saisis-tu mieux expliqué comme ça ?
Oui merci, :D j'ai bien avancé.

Tout fonctionne sauf quand le visiteur met un fichier plus gros que la taille autorisée j'ai ça comme erreur :
Warning: fread(): supplied argument is not a valid stream resource in...
Normalement il devrait avoir : "Votre fichier doit faire moins de 2mo !"
Enfin, c'est pas très grave non plus.

Mes nouvelles pages :

Page form.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>titre</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
<!--
.texte12 {color: #000000; font-size: 12px; font-family: verdana,arial;}
-->
</style>
</head>

<body>
<FORM METHOD="POST" ACTION="send.php" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="2097152" /> 
<table width="100%" border="0" align="center" cellpadding="2" cellspacing="2">
  <tr bgcolor="#FFBB77" class="texte12">
    <td width="50%">Votre nom :</td>
    <td width="50%"><input name="nom" type="text" id="nom" value=""></td>
  </tr>
  <tr bgcolor="#FFBB77" class="texte12">
    <td width="50%">E-mail :</td>
    <td width="50%"><input name="email" type="text" id="email" value=""></td>
  </tr>
  <tr valign="top" bgcolor="#FFBB77" class="texte12">
    <td width="50%"><legend>Envoi de fichiers</legend>
        </td>
    <td width="50%">
      <!-- champs d'envoi de fichier, de type file -->
	  <fieldset>
      <label for="fichier">Fichier :</label>
      <input type="file" name="fichier"/>
      </fieldset></td>
  </tr>
  <tr bgcolor="#FFBB77">
    <td colspan="2"><div align="center">
	     <!-- bouton d'envoi -->
        <input type="submit" name="Submit" value="Valider">
    </div></td>
  </tr>
</table>
</body>
</html>
Page send.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>titre</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?php
function mail_attachement_html($to , $sujet , $message , $fichier , $typemime , $nomdoc , $reply , $from)
{
    $limite = "_parties_". md5(uniqid (rand()));

    $mail_mime = "Date: ".date("l j F Y, G:i")."\n";
    $mail_mime .= "MIME-Version: 1.0\n";
    $mail_mime .= "Content-Type: multipart/mixed;\n";
    $mail_mime .= " boundary="----=". $limite .""\n\n";

    $limite2 = "_parties_". md5 (uniqid (rand()));

    /* Le message en texte simple pour les navigateurs qui n'acceptent pas le HTML */
    $texte_simple .= "This is a multi-part message in MIME format.\n\n";
    $texte_simple .= "------=". $limite ."\n";
    $texte_simple .= "Content-Type: multipart/alternative;\n";
    $texte_simple .= "\tboundary="----=". $limite2 .""\n\n";

    $texte_simple .= "------=". $limite2 ."\n";
    $texte_simple .= "Content-Type: text/plain; \tcharset="iso-8859-1"\n";
    $texte_simple .= "Content-Transfer-Encoding: quoted-printable\n\n";
    $texte_simple .= strip_tags(eregi_replace("<br>", "\n", $message));
    $texte_simple .= "\n\n";

    /* le message en html original */
    $texte_html = "------=". $limite2 ."\n";
    $texte_html .= "Content-Type: text/html; charset="iso-8859-1"\n";
    $texte_html .= "Content-Transfer-Encoding: quoted-printeble\n\n";
    $texte_html .= $message;
    $texte_html .= "\n\n\n------=". $limite2 ."--\n";

    /* le fichier */
    $attachement = "------=". $limite ."\n";
    $attachement .= "Content-Type: ". $typemime ."; name="". $nomdoc .""\n";
    $attachement .= "Content-Transfer-Encoding: base64\n";
    $attachement .= "Content-Disposition: attachment; filename="". $nomdoc .""\n\n";

    $fd = fopen( $fichier, "r" );
    $contenu = fread( $fd, filesize( $fichier ) );
    fclose( $fd );
    $attachement .= chunk_split(base64_encode($contenu));

    $attachement .= "\n\n\n------=". $limite ."\n";
    return mail($to, $sujet, $texte_simple.$texte_html.$attachement, "Reply-to: ". $reply ."\nFrom: ". $from ."\n".$mail_mime);
} 

// ----------------- Début configuration --------------------

// On récupère les données du formulaire
$nom = $_POST['nom'];
$email = $_POST['email'];

// Notez ici l'adresse qui recevra le mail et le fichier
$to = '[email protected]' . ', '; // notez la virgule
// L'adresse du visiteur récupérée plus haut
$to .= "$email";
// Le sujet du mail
$sujet = "Sujet";
// Votre message en html
$message = "
<head>
<title>Votre message en html</title>
<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>
</head>

<body>
<table width='100%' border='1' align='center' cellpadding='0' cellspacing='0' bordercolor='#000000' bgcolor='#FFFFFF'>
      <tr>
        <td><div align='center'><b> Merci  $nom, Nous avons bien reçu votre fichier </b>
</div></td>
      </tr>
    </table>
	</body>
</html>";
// Changer fichier par l'intitulé configuré dans la page formulaire.php, si vous n'avez rien modifié, laissez tel quel
$typemime = $_FILES['fichier']['type'];
$fichier = $_FILES['fichier']['tmp_name'];
$nomdoc = $_FILES['fichier']['name'];
// Adresse de réponse au mail
$reply = "[email protected]";
// Expéditeur
$from = "[email protected]";
// Vous pouvez ajouter ou retirer des extensions si vous le souhaitez
$extensions_ok = array('png', 'gif', 'jpg', 'jpeg', 'doc', 'rtf', 'pdf', 'xls', 'pps', 'ppt', 'zip', 'rar');
// Configurez la taille maximale du fichier en octets, ici 2mo
$taille_max = 2097152;

if(isset($_FILES['fichier']))
{
unset($erreur);

// vérifications
if( !in_array( substr(strrchr($_FILES['fichier']['name'], '.'), 1), $extensions_ok ) )
{
// Vous pouvez changez l'intitulé de la réponse d'erreur si vous le souhaitez
$erreur = 'Extension non autorisée !';
}
elseif( file_exists($_FILES['fichier']['tmp_name'])
and filesize($_FILES['fichier']['tmp_name']) > $taille_max)
{
// Vous pouvez changez l'intitulé de la réponse d'erreur si vous le souhaitez
$erreur = 'Votre fichier doit faire moins de 2mo !';
// ----------------- Fin configuration --------------------
}
else
{
mail_attachement_html($to, $sujet,$message,$fichier,$typemime,$nomdoc,$reply,$from);
}
}
?>
    <p>
<!-- Erreur ? -->
<?php
if(isset($erreur)){
echo '<p>', $erreur ,'</p>';
}
?>

</p>
 

</body>
</html>

par Cyrano » 15 sept. 2005, 16:21

Non, la structure de $_FILES, c'est un tableau à deux dimensions: ce qui signifie qu'il y a un index et ce qu'on pourrait appeler un "sous-index"

Quand on met $_FILES['fichier']['name'], on décompose comme suit:
  • $_FILES est le nom de la variable super_globale;
  • fichier est le nom correspondant à l'attribut name du champ <input type="file" de ton formulaire;
  • name est l'index PHP correspondant au nom du fichier comprenant le nom et l'extension du fichier.
Si tu regardes bien ce que donne le var_dump de $_FILES, tu as obtenu ceci:

Code : Tout sélectionner

array(1) { ["doc"]=> array(5) { ["name"]=> string(8) "test.doc" ["type"]=> string(18) "application/msword" ["tmp_name"]=> string(14) "/tmp/phpUbljp5" ["error"]=> int(0) ["size"]=> int(25088) } }
Le premier index est indiqué au début : doc
Les sous-index sont : name, type, tmp_name, error et size.

Pour récupérer le nom dans ce cas là, il faut donc chercher $_FILES['doc']['name']

Saisis-tu mieux expliqué comme ça ?

par nick3340 » 15 sept. 2005, 15:50

Merci de m'aider ;)
Pour le type mime, tu peux faire un test sur la valeur en comparant à une liste prédéfinie qui te permet d'accepter ou d'interdire certains types de fichiers. Par exemple, crée un tableau indexé contenant une liste de types de fichiers autorisés et vérifie que le fichier choisi par l'internaute est bien dans la liste en utilisant in_array() : ça pourra en outre t'éviter des surprises désagréables.
Je verrais ça plus tard. Quand le script commencera à fonctionner un peu, pour l'instant comme je teste avec un fichier word je laisse :
$typemime = "application/msword";

Au fait, je n'ai pas érpondu à ta question pour "fichier = ???" regarde la liste affichée par la super-globale: tu as $_FILE['fichier']['name'] qui te donne le nom du fichier. Et pour nomdoc, je serais tenté de croire quela réponse est la même.
Désolé, mais j'ai du mal à comprendre, je suis un vrai débutant :lol:
J'ai essayé ça :
$fichier = $_FILE['doc'];
$nomdoc = $_FILE['name'];
en vain
:(

par Cyrano » 15 sept. 2005, 08:31

Bon, apparemment, ce n'est qu'une simple fonction qui envoie un courriel avec pière jointe en deux formats, texte brut et html, avec pièce jointe.

Au fait, je n'ai pas érpondu à ta question pour "fichier = ???" regarde la liste affichée par la super-globale: tu as $_FILE['fichier']['name'] qui te donne le nom du fichier. Et pour nomdoc, je serais tenté de croire quela réponse est la même.

Quant au script, voici une petite remise en forme mais avec seulement des détails "cosmétiques":
<?php
/**
 * Avertissement : Cette librairie de fonctions PHP est distribuee avec l'espoir 
 * qu'elle sera utile, mais elle l'est SANS AUCUNE GARANTIE; sans meme la garantie de 
 * COMMERCIALISATION ou d'UTILITE POUR UN BUT QUELCONQUE.
 * Elle est librement redistribuable tant que la presente licence, ainsi que les credits des 
 * auteurs respectifs de chaque fonctions sont laisses ensembles. 
 * En aucun cas, Nexen.net ne pourra etre tenu responsable de quelques consequences que ce soit
 * de l'utilisation ou la mesutilisation de ces fonctions PHP.
 */

/**
 * Titre : mail 
 * Auteur : JoseLuis Herranz - 
 * Email : [email protected]
 * Url : 
 * Description : Une légère évolution du script de Damien Seguy "mail_attachment". 
 * Maintenant il est possible d'envoyer un courrier en HTML avec un fichier attaché. ;-)
 */
function mail_attachement_html($to , $sujet , $message , $fichier , $typemime , $nom , $reply , $from)
{
    $limite = "_parties_". md5(uniqid (rand()));

    $mail_mime = "Date: ".date("l j F Y, G:i")."\n";
    $mail_mime .= "MIME-Version: 1.0\n";
    $mail_mime .= "Content-Type: multipart/mixed;\n";
    $mail_mime .= " boundary=\"----=". $limite ."\"\n\n";

    $limite2 = "_parties_". md5 (uniqid (rand()));

    /* Le message en texte simple pour les navigateurs qui n'acceptent pas le HTML */
    $texte_simple .= "This is a multi-part message in MIME format.\n\n";
    $texte_simple .= "------=". $limite ."\n";
    $texte_simple .= "Content-Type: multipart/alternative;\n";
    $texte_simple .= "\tboundary=\"----=". $limite2 ."\"\n\n";

    $texte_simple .= "------=". $limite2 ."\n";
    $texte_simple .= "Content-Type: text/plain; \tcharset=\"iso-8859-1\"\n";
    $texte_simple .= "Content-Transfer-Encoding: quoted-printable\n\n";
    $texte_simple .= strip_tags(eregi_replace("<br>", "\n", $message));
    $texte_simple .= "\n\n";

    /* le message en html original */
    $texte_html = "------=". $limite2 ."\n";
    $texte_html .= "Content-Type: text/html; charset=\"iso-8859-1\"\n";
    $texte_html .= "Content-Transfer-Encoding: quoted-printeble\n\n";
    $texte_html .= $message;
    $texte_html .= "\n\n\n------=". $limite2 ."--\n";

    /* le fichier */
    $attachement = "------=". $limite ."\n";
    $attachement .= "Content-Type: ". $typemime ."; name=\"". $nom ."\"\n";
    $attachement .= "Content-Transfer-Encoding: base64\n";
    $attachement .= "Content-Disposition: attachment; filename=\"". $nom ."\"\n\n";

    $fd = fopen( $fichier, "r" );
    $contenu = fread( $fd, filesize( $fichier ) );
    fclose( $fd );
    $attachement .= chunk_split(base64_encode($contenu));

    $attachement .= "\n\n\n------=". $limite ."\n";
    return mail($to, $sujet, $texte_simple.$texte_html.$attachement, "Reply-to: ". $reply ."\nFrom: ". $from ."\n".$mail_mime);
}
?>

par Cyrano » 15 sept. 2005, 08:05

Pour le type mime, tu peux faire un test sur la valeur en comparant à une liste prédéfinie qui te permet d'accepter ou d'interdire certains types de fichiers. Par exemple, crée un tableau indexé contenant une liste de types de fichiers autorisés et vérifie que le fichier choisi par l'internaute est bien dans la liste en utilisant in_array() : ça pourra en outre t'éviter des surprises désagréables.

Pour le script, il faut que je regarde de quoi il a l'air, je reviendrai dessus quand j'aurai vu de quoi il a l'air.

par nick3340 » 14 sept. 2005, 23:18

Merci pour ta réponse. :D

J'ai eu ça comme résultat :

Code : Tout sélectionner

array(1) { ["doc"]=> array(5) { ["name"]=> string(8) "test.doc" ["type"]=> string(18) "application/msword" ["tmp_name"]=> string(14) "/tmp/phpUbljp5" ["error"]=> int(0) ["size"]=> int(25088) } }
Si je comprends bien, je dois mettre ça ? :
$typemime = "application/msword";

Mais si le visiteur envoie un fichier excel ou autre, ça ne va pas fonctionner ?

Et pour les autres je ne sais pas du tout ce que je peux mettre :
$fichier = "???";
$nomdoc = "???";

De plus je ne reçois même pas de mail.
J'ai pris un script tout fait ici :
http://www.nexen.net/scripts/details.php?scripts=514
Apparemment il doit être incorrect ou incomplet ou plutot ça ne doit pas etre un script pour débutant :D

par Cyrano » 14 sept. 2005, 09:29

Salut,
déjà dans ta page de traitement, tu as une erreur: on imbrique pas deux fonctions de la manière dont tu le fais:
function xyz()
{
    function xyz()
    {
Comme en plus c'est exactement le même intitulé de fonction avec les mêmes paramètres, tu peux en supprimer une.

Ensuite, si tu as un fichier provenant un champ input de type file, tu peux récupérer les informations recherchées dans la super-globale $_FILES

Pour voir de quoi ça a l,air, fais ceci en début de page de traitement :
<pre>
<?php
var_dump($_FILES);
?>
</pre>
Tu vas voir s'afficher des informations ettu auras les nom des index à récupérer pour initialiser tes trois variables.

formulaire + fichier > envoi par mail html + le fichier

par nick3340 » 13 sept. 2005, 21:55

Bonjour,

J'aimerais que les visiteurs puissent m'envoyer un document par l'intermédiare d'un formulaire et j'aimerais le recevoir par mail et que le visiteur en reçoive une copie.

J'ai trouvé un script pouvant faire celà, mais celà ne marche pas, je ne sais pas quoi mettre ici :

$typemime = "???";
$fichier = "???";
$nomdoc = "???";

Je vous mets le code, il doit certainement avoir de grosses erreurs, mais je suis bien dans le forum des débutants :D

Formulaire :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Document sans nom</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
<!--
.texte10 {color: #000000; font-size: 10px; font-family: verdana,arial;}
.texte11 {color: #000000; font-size: 11px; font-family: verdana,arial;}
.texte12 {color: #000000; font-size: 12px; font-family: verdana,arial;}
-->
</style>
<?php
if(isset($_FILES['doc']))
{
// params
unset($erreur);
$extensions_ok = array('png', 'gif', 'jpg', 'jpeg', 'doc', 'rtf', 'pdf', 'xls', 'pps', 'ppt', 'zip', 'rar');
$taille_max = 2097152;
$dest_dossier = '/home/login/public_html/site/docs/';
// utilisez également des slashes sous windows : $dest_dossier = 'd:/damien/photos/';
// vérifications
if( !in_array( substr(strrchr($_FILES['doc']['name'], '.'), 1), $extensions_ok ) )
{
$erreur = 'extension non autorisée !';
}
elseif( file_exists($_FILES['doc']['tmp_name'])
and filesize($_FILES['doc']['tmp_name']) > $taille_max)
{
$erreur = 'Votre fichier doit faire moins de 2mo !';
}
// copie du fichier
if(!isset($erreur))
{
$dest_fichier = basename($_FILES['doc']['name']);
// formatage nom fichier
// enlever les accents
$dest_fichier = strtr($dest_fichier,
'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
// remplacer les caracteres autres que lettres, chiffres et point par _
$dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);
// copie du fichier
move_uploaded_file($_FILES['doc']['tmp_name'], $dest_dossier . $dest_fichier);
}
}
?>
</head>

<body>
<!-- Erreur ? -->
<?php
if(isset($erreur)){
echo '<p>', $erreur ,'</p>';
}
?>
<FORM METHOD="POST" ACTION="commande3.php" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="2097152" /> 
<table width="100%" border="0" align="center" cellpadding="2" cellspacing="2">
  <tr bgcolor="#FFBB77" class="texte12">
    <td>Nom de votre soci&eacute;t&eacute; (ou votre nom et pr&eacute;nom) </td>
    <td><input name="nom" type="text" id="nom" value=""></td>
  </tr>
  <tr bgcolor="#FFBB77" class="texte12">
    <td>E-mail</td>
    <td><input name="email" type="text" id="email" value=""></td>
  </tr>
  <tr valign="top" bgcolor="#FFBB77" class="texte12">
    <td><legend>Envoi de fichiers</legend>
        <!-- champs d'envoi de fichier, de type file --></td>
    <td>
      <fieldset>
      <label for="doc">Doc :</label>
      <input type="file" name="doc"/>
      <!-- bouton d'envoi -->
      <p>&nbsp;</p>
    </fieldset></td>
  </tr>
  <tr bgcolor="#FFBB77">
    <td colspan="2"><div align="center">
        <input type="submit" name="Submit" value="Valider">
    </div></td>
  </tr>
</table>
</body>
</html>
page de validation :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>titre</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
<!--
body,td,th {
	font-family: Verdana, Arial, Helvetica, sans-serif;
	font-size: 12px;
}
.Style1 {
	font-size: 14;
	font-weight: bold;
}
-->
</style>
</head>

<body>
<?php
$nom = $_POST['nom'];
$email = $_POST['email'];


$to = "$email";
$sujet = "Sujet";
$message = "Mon message";
$typemime = "???";
$fichier = "???";
$nomdoc = "???";
$reply = "[email protected]";
$from = "[email protected]";

function mail_attachement_html($to,$sujet,$message,$fichier,$typemime,$nomdoc,$reply,$from){
function mail_attachement_html($to , $sujet , $message , $fichier ,
        $typemime , $nomdoc , $reply , $from){
        $limite = "_parties_".md5(uniqid (rand()));

        $mail_mime = "Date: ".date("l j F Y, G:i")."\n";
        $mail_mime .= "MIME-Version: 1.0\n";
        $mail_mime .= "Content-Type: multipart/mixed;\n";
        $mail_mime .= " boundary=\"----=$limite\"\n\n";

        $limite2 = "_parties_".md5 (uniqid (rand()));


        //Le message en texte simple pour les navigateurs qui n'acceptent pas le HTML
        $texte_simple .= "This is a multi-part message in MIME format.\n\n";
        $texte_simple .= "------=$limite\n";
        $texte_simple .= "Content-Type: multipart/alternative;\n";
        $texte_simple .= "\tboundary=\"----=$limite2\"\n\n";

        $texte_simple .= "------=$limite2\n";
        $texte_simple .= "Content-Type: text/plain; \tcharset=\"US-ASCII\"\n";
        $texte_simple .= "Content-Transfer-Encoding: quoted-printable\n\n";
        $texte_simple .= strip_tags(eregi_replace("<br>", "\n", $message));
        $texte_simple .= "\n\n";

        //le message en html original
        $texte_html = "------=$limite2\n";
        $texte_html .= "Content-Type: text/html;
        charset=\"US-ASCII\"\n";
        $texte_html .= "Content-Transfer-Encoding: quoted-printeble\n\n";
        $texte_html .= $message;
        $texte_html .= "\n\n\n------=$limite2--\n";

        //le fichier
        $attachement = "------=$limite\n";
        $attachement .= "Content-Type: $typemime; name=\"$nom\"\n";
        $attachement .= "Content-Transfer-Encoding: base64\n";
        $attachement .= "Content-Disposition: attachment;
        filename=\"$nom\"\n\n";

        $fd = fopen( $fichier, "r" );
        $contenu = fread( $fd, filesize( $fichier ) );
        fclose( $fd );
        $attachement .= chunk_split(base64_encode($contenu));

        $attachement .= "\n\n\n------=$limite\n";
        return mail($to, $sujet, $texte_simple.$texte_html.$attachement, "Reply-to:
        $reply\nFrom:
        $from\n".$mail_mime);
}
}
?>
    <p>Merci</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>


</body>
</html>
Merci à ceux qui pourront m'aider. :D