probleme de reception d'email via un formulaire

Eléphanteau du PHP | 49 Messages

13 oct. 2011, 00:32

Bonjour, j'ai sur mon site un formulaire permettant de m'envoyer des annonces à publier.

Le probleme est que certaines annonces ne me parviennent pas, selon l'adresse mail de l'annonceur.

Quand ils envoient le message une fenêtre noire apparait avec comme message:
Class Mail, method attach : file can't be found
D'oû vient l'erreur?

Voici mon code sur la page annonce.php:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
   <head>
       <title>mon site</title>
       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
	   
	   <script type="text/javascript">  
    function bookmarksite(title, url, t){  
    if (document.all) {  
    window.external.AddFavorite(url, title);  
    t.style.behavior='url(#default#homepage)';  
    t.setHomePage('http://www.monsite.com/annonce.php');  
    } else if (window.sidebar) {  
    window.sidebar.addPanel(title, url, "");  
    }  
    }  
      </script>
	   
   </head>
  
   <body>
	 <?php
	
if (isset($_POST['nom']) AND isset($_POST['email'])AND isset($_POST['date'])AND isset($_POST['heure'])AND isset($_POST['titre'])AND isset($_POST['contenu'])AND isset($_POST['lieu']))
{
	include "libmail.php";
	
	$nom=$_POST['nom'];
	$email=$_POST['email'];
	$date=$_POST['date'];
	$heure=$_POST['heure'];
	$titre=$_POST['titre'];
	$contenu=$_POST['contenu'];
	$lieu=$_POST['lieu'];
	if (isset($_POST['lien']))
		$lien=$_POST['lien'];
	
	$m= new Mail; // le mail est créé
	$m->From( $_POST['email'] );
	$m->To( "[email protected]" );
	$m->Subject( "annonce ".$_POST['titre'] );	
	$imager = $_FILES['image']['tmp_name'];  // nom du fichier temporaire
	$nomimage = $_FILES['image']['name'];  // nom réel
	$message= " Nom : ".stripslashes($nom)."\n Email : ".$email."\n Date : ".$date."\n Heure : ".$heure."\n Titre :".stripslashes($titre)."\n Lieu : ".stripslashes($lieu)."\n Lien : ".$lien."\n Message : ".stripslashes($contenu)."\n";
	$m->Body( $message);	// corps du message
	$m->Priority(2) ;	// donne la priorité du mess
	if (isset($imager))
		$m->Attach( "$imager", "$nomimage" ) ;	// attache l image
	$m->Send();	// envoi le mail
?> <p><center> <?php echo" Votre annonce a été envoyé.";?></center></p><?php
//========== affichage de la page
?>

<h3>Passez votre annonce<form method=post action=annonce.php><input name=submit type=submit class="btn" value="                         "></form></h3>

	  <?php
mysql_connect("localhost", "admin", "password");
mysql_select_db("base de donnee");

$retour1 = mysql_query('SELECT * FROM baseannonce ORDER BY date LIMIT 0, 50');
while ($donnees = mysql_fetch_array($retour1))
{
	mysql_query('DELETE FROM annonce WHERE date < CURRENT_DATE()');
?>

<div id="annonces">
    <?php
    // On enlève les éventuels antislash PUIS on crée les entrées en HTML (<br />)
	$image = nl2br(stripslashes($donnees['image']));
	$titre = nl2br(stripslashes($donnees['titre']));
    $contenu = nl2br(stripslashes($donnees['contenu']));
    $lieu = nl2br(stripslashes($donnees['lieu']));
    $lien = nl2br(stripslashes($donnees['lien']));
    $heure = nl2br(stripslashes($donnees['heure']));
	?>
	<h4>      
<?php $tableau = explode('-',$donnees['date']);
	$date_normale = $tableau[2].'-'.$tableau[1].'-'.$tableau[0];
	$timestamp_jour = mktime(0,0,0,$tableau[1],$tableau[2],$tableau[0]);
	$numero_jour = date('w',$timestamp_jour);
	$semaine = array('Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi');
	$jour = $semaine[$numero_jour];
	$numero_mois = date('n',$timestamp_jour);
	$semaine = array('','janvier','février','mars','avril','mai','juin','juillet','août','septembre','octobre','novembre','décembre');
	$mois = $semaine[$numero_mois];
	echo $jour.' ';echo $tableau[2].' ';echo $mois.' ';echo $tableau[0].'  ';echo '-';echo $heure;?></h4>
			
<?php echo $titre; ?>
<?php echo '<img src="doc/'.$donnees['image'].'" alt="image"/>';  ?>
<?php echo $contenu;?>
<?php echo $lieu;?>
<?php echo '<a href="'.$donnees['lien'].'" onclick="window.open(this.href); return false;">'.$donnees['lien'].'</a>';?>
</div>
<?php
} // Fin de la boucle des annonces
?>

<?php

}
else if ((isset($_POST['submit']))&&($_POST['submit'] == "                         "))
{
// formulaire
?>
<div id="corpsform">
				
<form vname="FormName" action="annonce.php" method="post" enctype="multipart/form-data" name="form">
<table align=center height=400>
<tr><td align=right>Nom :</td><td align=left><input type="text" size="30" name="nom" value=""/></td></tr>
<tr><td align=right>Email : </td><td align=left><input type="text" size="30" name="email" value=""/></td></tr>
<tr><td align=right>Date : </td><td align=left><input type="text" size="30" name="date" value=""/></td></tr>
<tr><td align=right>Heure : </td><td align=left><input type="text" size="30" name="heure" value=""/></td></tr>
<tr><td align=right>Titre : </td><td align=left><input type="text" size="30" name="titre" value=""/></td></tr>
<tr><td align=right>Image (Max:2Mo) : </td><td align=left><input type="hidden" name="MAX_FILE_SIZE" value="2000000"><input name="image" type="file" size="30"></td></tr>
<tr><td align=right>Contenu :</td><td align=left><textarea rows="5" name="contenu" cols="30"></textarea></td></tr>
<tr><td align=right>Lieu : </td><td align=left><input type="text" size="30" name="lieu" value=""/></td></tr>
<tr><td align=right>Lien : <td align=left><input type="text" size="30" name="lien" value=""/></td></tr>
 
<tr><td colspan=2 align=center><input type="submit" name="submit" value="Envoyer" /></td></tr>
</table>
</form>

</div>
<?php
}
else
{
// si rien est envoyé, affichage des annonces
?>

<h3>Passez votre annonce<form method=post action=annonce.php><input name=submit type=submit class="btn" value="                         "></form></h3>

	  <?php
mysql_connect("localhost", "admin", "password");
mysql_select_db("base de donnee");

$retour1 = mysql_query('SELECT * FROM baseannonce ORDER BY date LIMIT 0, 50');
while ($donnees = mysql_fetch_array($retour1))
{
	mysql_query('DELETE FROM baseannonce WHERE date < CURRENT_DATE()');
?>

<div id="annonces">
    <?php
    // On enlève les éventuels antislash PUIS on crée les entrées en HTML (<br />)
	$image = nl2br(stripslashes($donnees['image']));
	$titre = nl2br(stripslashes($donnees['titre']));
    $contenu = nl2br(stripslashes($donnees['contenu']));
    $lieu = nl2br(stripslashes($donnees['lieu']));
    $lien = nl2br(stripslashes($donnees['lien']));
    $heure = nl2br(stripslashes($donnees['heure']));
	?>
	<h4>      
<?php $tableau = explode('-',$donnees['date']);
	$date_normale = $tableau[2].'-'.$tableau[1].'-'.$tableau[0];
	$timestamp_jour = mktime(0,0,0,$tableau[1],$tableau[2],$tableau[0]);
	$numero_jour = date('w',$timestamp_jour);
	$semaine = array('Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi');
	$jour = $semaine[$numero_jour];
	$numero_mois = date('n',$timestamp_jour);
	$semaine = array('','janvier','février','mars','avril','mai','juin','juillet','août','septembre','octobre','novembre','décembre');
	$mois = $semaine[$numero_mois];
	echo $jour.' ';echo $tableau[2].' ';echo $mois.' ';echo $tableau[0].'  ';echo '-';echo $heure;?></h4>
			
<?php echo $titre; ?>
<?php echo '<img src="doc/'.$donnees['image'].'" alt="image"/>';  ?>
<?php echo $contenu;?>
<?php echo $lieu;?>
<?php echo '<a href="'.$donnees['lien'].'" onclick="window.open(this.href); return false;">'.$donnees['lien'].'</a>';?>
</div>
<?php
} // Fin de la boucle des annonces
?>

	
<?php
	mysql_close();
}
?>	

   </body>
</html>
Modifié en dernier par cite carter le 17 oct. 2011, 18:55, modifié 1 fois.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

13 oct. 2011, 19:03

Je n'ai pas regardé le code, mais à vue de nez, puisque le message t'indique que le fichier à attacher au mail n'a pas été trouvé, j'en déduis que ton utilisateur upload un fichier et que celui-ci t'es envoyé par mail.

Si le fichier n'est pas trouvé, c'est qu'il n'a pas correctement été uploadé sur le serveur (peut être un problème de taille de fichier ?) Il faudrait donc vérifier que l'upload s'est effectué sans erreur avant d'essayer de joindre le fichier :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 49 Messages

13 oct. 2011, 20:17

Ok, merci pour la réponse rapide, et comment on fait ça?
Je ne suis pas trés calé en php.
Un étudiant en informatique m'avait aidé à créer le site mais aujourd'hui, il n'est plus dispo.

Eléphanteau du PHP | 49 Messages

17 oct. 2011, 18:52

Quelqu'un peux t'il me venir en aide, je ne trouve pas de piste.
J'ai testé un script qui s'appelle verification_formulaire de ce site http://aspirine.org/contact/verificatio ... laire.html mais il ne règle apparemment pas mon problème.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

18 oct. 2011, 11:16

salut,

perso je pense comme Ryle que ton upload est foireux.

il est bon de vérifier correctement cet upload avant d'essayer d'utiliser ce même fichier.

tu peux voir comment faire dans la doc http://www.php.net/manual/fr/features.f ... method.php

Après dans le forum contribution AB fournit une classe qui fait papa maman avec ce genre de chose ;)

@+
Il en faut peu pour être heureux ......

ViPHP
ViPHP | 2577 Messages

18 oct. 2011, 14:21

        $imager = $_FILES['image']['tmp_name'];  // nom du fichier temporaire
        $nomimage = $_FILES['image']['name'];  // nom réel
        $message= " Nom : ".stripslashes($nom)."\n Email : ".$email."\n Date : ".$date."\n Heure : ".$heure."\n Titre :".stripslashes($titre)."\n Lieu : ".stripslashes($lieu)."\n Lien : ".$lien."\n Message : ".stripslashes($contenu)."\n";
        $m->Body( $message);    // corps du message
        $m->Priority(2) ;       // donne la priorité du mess
        if (isset($imager))
Le isset($imager) ne sert à rien puisque renseigné quelques lignes avant. Par contre tu pourrais utiliser $_FILES['image']['error'] pour savoir si l'upload s'est bien déroulé.

Sauf erreur de ma part, je n'ai pas vu le code supprimant le fichier temporaire uploadé. Il doit falloir faire du ménage ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

18 oct. 2011, 14:25

Sauf erreur de ma part, je n'ai pas vu le code supprimant le fichier temporaire uploadé. Il doit falloir faire du ménage ?
Sauf erreur de ma part c'est fait par php (ou apache) pour ce qui est du fichier suite à l'utilisation du formulaire (un ramasse miette à la fin de l'exécution du script ?)

Par contre il n'utilise pas de copie directement le fichier temporaire mis à disposition par apache, peut être est ce la soucis :)
Il en faut peu pour être heureux ......

ViPHP
ViPHP | 2577 Messages

18 oct. 2011, 14:35

PHP doit savoir lire le fichier temporaire donc l'utiliser directement doit être pas trop mal pour l'envoi par mail.
$m->Attach( "$imager", "$nomimage" );

D'après le post seules quelques annonces passent mal. Cela confirme le problème d'upload (taille du fichier ?). Il pourrait être intéressant de rajouter le paramètre HTML pour indiquer une taille de fichier max et prévenir l'utilisateur avant la tentative d'upload.

Eléphanteau du PHP | 49 Messages

18 oct. 2011, 15:36

Le paramètre pour la taille est déjà indiqué
<td align=right>Image (Max:2Mo) : </td><td align=left><input type="hidden" name="MAX_FILE_SIZE" value="2000000"><input name="image" type="file" size="30"></td>
J'ai fait un test avec une image beaucoup moins lourde et ça n'a pas fonctionné non plus.

Mazarini, est-ce que je dois retirer juste cette ligne " if (isset($imager)) " ou plus. Et oû mettre celle-ci " $_FILES['image']['error'] "

ViPHP
ViPHP | 2577 Messages

18 oct. 2011, 15:49

As tu regardé le contenu de $_FILES['image']['error'] ?
Est ce que l'erreur est systématique ou ne concerne que certaine image (cf "certaines annonces ne me parviennent pas")

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

18 oct. 2011, 16:01

wé on reste d'accord avec nous même c'est cool :)

faut gére l'upload un minimum :)


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 49 Messages

18 oct. 2011, 16:22

L'erreur n'est pas systématique, je reçois des annonces avec une image jointe sur ma boite mail, mais quelques personnes m'ont signalé qu'ils n'y parvenaient pas et avaient le message d'erreur, j'ai testé à mon tour le formulaire avec différentes adresses mails et j'ai eu une fois aussi l'erreur.
Maintenant pour vérifier l'upload en php, je ne suis pas assez calé en php( grand débutant), c'est pourquoi je m'adresse à vous.

Eléphanteau du PHP | 49 Messages

18 oct. 2011, 16:54

Faut-il remplacer " if (isset($imager)) " par " if ($_FILES['image']['error']==0) tout simplement ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

19 oct. 2011, 15:17

non pas ainsi

d'ailleurs ce isset est inutile vu que tu affecte cette variable au dessus.
un isset sur $_FILES['image'] oui et vérifier que $_FILES['image']['error'] soit égale à zéro bien sur une bonne solution.

Après en fonction de la valeur de $_FILES['image']['error'] tu peux indiqué de quoi il s'agit au "client".

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 49 Messages

19 oct. 2011, 22:55

J'ai testé avec ce code:
if ((isset($_FILES['image']['name'])&&($_FILES['image']['error']==0)))
et avec une petite valeur de taille d'image
image (max:40 Ko) <input type="hidden" name="MAX_FILE_SIZE" value="40000"><input name="image" type="file" size="30">
J'ai envoyé une annonce avec une image plus lourde que la valeur, le message a quand même aboutit mais sans l'image et pas de message d'erreur à l'envoie.
Je pensais que l'annonce n'aurait pas été envoyée et que j'aurais eu un message d'erreur me l'indiquant.