Page 1 sur 2

probleme de reception d'email via un formulaire

Posté : 13 oct. 2011, 00:32
par cite carter
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>

Re: probleme de reception d'email via un formulaire

Posté : 13 oct. 2011, 19:03
par Ryle
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 :)

Re: probleme de reception d'email via un formulaire

Posté : 13 oct. 2011, 20:17
par cite carter
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.

Re: probleme de reception d'email via un formulaire

Posté : 17 oct. 2011, 18:52
par cite carter
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.

Re: probleme de reception d'email via un formulaire

Posté : 18 oct. 2011, 11:16
par moogli
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 ;)

@+

Re: probleme de reception d'email via un formulaire

Posté : 18 oct. 2011, 14:21
par Mazarini
        $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 ?

Re: probleme de reception d'email via un formulaire

Posté : 18 oct. 2011, 14:25
par moogli
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 :)

Re: probleme de reception d'email via un formulaire

Posté : 18 oct. 2011, 14:35
par Mazarini
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.

Re: probleme de reception d'email via un formulaire

Posté : 18 oct. 2011, 15:36
par cite carter
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'] "

Re: probleme de reception d'email via un formulaire

Posté : 18 oct. 2011, 15:49
par Mazarini
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")

Re: probleme de reception d'email via un formulaire

Posté : 18 oct. 2011, 16:01
par moogli
wé on reste d'accord avec nous même c'est cool :)

faut gére l'upload un minimum :)


@+

Re: probleme de reception d'email via un formulaire

Posté : 18 oct. 2011, 16:22
par cite carter
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.

Re: probleme de reception d'email via un formulaire

Posté : 18 oct. 2011, 16:54
par cite carter
Faut-il remplacer " if (isset($imager)) " par " if ($_FILES['image']['error']==0) tout simplement ?

Re: probleme de reception d'email via un formulaire

Posté : 19 oct. 2011, 15:17
par moogli
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".

@+

Re: probleme de reception d'email via un formulaire

Posté : 19 oct. 2011, 22:55
par cite carter
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.