mail qui ne part jamais

Eléphant du PHP | 250 Messages

15 mai 2008, 22:39

Bonsoir
Je propose à votre sagacité un code (tout simple me semble-t-il) chargé d'envoyer un mail au format html avec pièce jointe. Ce mail est déclenché à l'arrivée sur la page de retour de Paypal, et l'email destinataire récupéré dans la $_SESSION.
Cela fait plusieurs jours que je bataille avec ça, et que j'obtiens comme seul résultat:
Le mail n'a pu être envoyé; contactez le webmaster, svp.
:evil:
C'est le seul message, pas de message d'erreur php.
Voici le code:
<?php

$delim = md5(uniqid(rand()));
//type MIME utilisé
$head = "MIME-Version: 1.0\n";
//type contenu et frontieres entre parties
$head .="Content-Type:multipart/mixed; boundary=\"$delim\" \n";
$head .="X-Priority: 1 \n";
$head .="\n";

//message à destination des logiciels ne lisant pas le type MIME
$msg .="Ce message est au format MIME -\n";
$msg .="\n";

//1ere partie du message
//on indique la frontière
$msg .="--$delim\n";
//on indique le contenu du message
$msg .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
$msg .= "Content-Transfert-Encoding:8bit\n";
$msg .= "\n";
$msg .= "Bonjour,\n
Merci et blablabla
A bientôt.\n";
$msg .= wordwrap($msg, 70);
$msg .= "\n";

//seconde partie du message : le fichier joint
$fichier = "lechemin vers le fichier.pdf";
$attache = file_get_contents($fichier);
$attache .= chunk_split(base64_encode($attache));
$msg .="--$delim\n";
$msg .= "Content-Type: application/pdf; name=\"$fichier\"\n";
$msg .= "Content-Transfert-Encoding: base64\n";
$msg .= "Content-Disposition: attachment; filename=\"$fichier\"\n";
$msg .= "\n";
$msg .= $attache . '\n';
$msg .= "\n";
$msg .= "--$delim--";
$dest = $_SESSION['email'] ;
$exp = "lemail@lesite";

if (mail($dest,$msg,"Reply-to:$exp\nFrom: $exp\n".$head))
{
  echo 'Le mail a été envoyé';
}
else
{
  echo 'Le mail n\'a pu être envoyé; contactez le webmaster, svp.';
}


?>
Voilà. Je désespère de pouvoir un jour y arriver...|*()
Merci d'avance à tous avis, commentaires, conseils, pistes.
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

ViPHP
ViPHP | 2291 Messages

16 mai 2008, 00:13

Salut,

Pour récupérée des variables de session il est indispensable de placer session_start() ; en début de page avant tout autre code.

:arrow: Comme tu n’a pas mis de session_star() ; tu ne possède donc aucune adresse d’expédition donc le mail ne sait pas partir.

:arrow: Enlève le . qui est placer à la première variable $msg et il de trop.

a+ :wink:

Eléphant du PHP | 250 Messages

16 mai 2008, 00:54

Hello.
Merci pour le . du 1er $msg! Par contre, mais c'est de ma faute je ne l'ai pas précisé dans mon post, j'ai bien une session_start(), que voici d'ailleurs:
<?php
 session_start();  
 if (!isset($_SESSION['identification']) || !isset($_SESSION['prenom']) || !isset($_SESSION['nom']) || !isset($_SESSION['email']) || !isset($_SESSION['adresse'])) { 
    header ('Location: ../index.php'); 
    exit();  
 }
?>
J'en profite pour préciser aussi qu'il y a déjà un form avec envoi de mail sur le site qui fonctionne bien (le form....le site aussi d'ailleurs :lol: ) donc que cela ne pourrait venir du php-ini...
Si tu vois autre chose dunbar merci d'avance, je suis preneur! :pouce:
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

ViPHP
ViPHP | 2291 Messages

16 mai 2008, 07:41

si tu place le bout de code suivant juste avant ton FORM
echo '<pre>';
print_r($_SESSION);
echo '</pre>';
Qu'obtient tu ?

Eléphant du PHP | 250 Messages

16 mai 2008, 08:21

Bonjour dunbar
Aussi matinal que moi je vois! :wink:
J'obtiens un array, complet, que voici:
Array
(
    [identification] => 38
    [prenom] => mon prenom
    [nom] => mon nom
    [email] => [email protected]
    [adresse] => mon adresse
)
.... :?: :?: :?: :?: :?:
Etonnant non?
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

ViPHP
ViPHP | 2291 Messages

16 mai 2008, 08:25

Bonjour dunbar
Aussi matinal que moi je vois! :wink:
J'obtiens un array, complet, que voici:
Array
(
    [identification] => 38
    [prenom] => mon prenom
    [nom] => mon nom
    [email] => [email protected]
    [adresse] => mon adresse
)
.... :?: :?: :?: :?: :?:
Etonnant non?
Salut,
Oui surtout que chez moi ton code fonctionne :-k
On pourrais voir le code complet de ta page :!: :wink:

Eléphant du PHP | 250 Messages

16 mai 2008, 21:35

Bonsoir
Heuuu...il fonctionne chez toi :?: :?: :?:
Diantre!
En attendant de comprendre voici les codes:
1) L'en tête =

Code : Tout sélectionner

<?php include ('../codes/session.php'); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Journaux Intimes, Le pdf!</title> <link href="../styles/styldo.css" rel="stylesheet" type="text/css" media="screen" /> <!--[if lte IE 6]> <link rel="stylesheet" type="text/css" href="../styles/chie.css" media="screen" /> <![endif]--> </head> <body>
2) La div où se place le widget:

Code : Tout sélectionner

<div id="cont-txt-droit"> <p class="texte-page"> <?php echo ("Bonjour $prenom $nom"); ?> <br /> Vous venez d'effectuer le paiement via paypal®, et blablabla <form method="post" action="mail-auto.php"> <input type="submit" name="mail" value="Cliquez ici pour recevoir votre commande..." /> </form> Nous vous remercions encore de votre commande, et vous souhaitons une agr&eacute;able lecture. <br /> <br /> <br /> <a href="deconnexion.php">Cliquez ici pour revenir &agrave; l'accueil du site de XXXXX.</a> </p> </div><!--fin texte droit-->
Tu noteras que je récupère les nom et prenom en utilisant là aussi $_SESSION...et ça marche
Pour le reste tu as vu..
Merci de ton aide, et de celle de tous
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

ViPHP
ViPHP | 2291 Messages

16 mai 2008, 21:49

Essaye ceci pour voir :wink:
Ton code
if (mail($dest,$msg,"Reply-to:$exp\nFrom: $exp\n".$head))
Correction
if (mail($dest,$msg,"Reply-to:$exp\nFrom: $exp\n",$head))
Ceci dit même si il fonctionne il est mal fait se formulaire tu devrais le refaire
par exemple dans le message on optiendrais
Content-Transfert-Encoding: base64\n";
et d'autre encore :wink:
Modifié en dernier par dunbar le 16 mai 2008, 22:03, modifié 1 fois.

Eléphant du PHP | 250 Messages

16 mai 2008, 22:02

Bonsoir dunbar
Et merci, bien vu là aussi :wink: ...mais toujours:
Le mail n'a pu être envoyé; contactez le webmaster, svp.
|*()
C'est à ne plus rien y comprendre....
Je continues à chercher de mon côté, mais j'avoue m'y perdre.. #-o
Et tu me dis que chez toi ça fonctionne???
Je précise que je teste ça en ligne, et pas en local avec wamp.
Que pourrais je tester encore pour cerner le problème?
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

ViPHP
ViPHP | 2291 Messages

16 mai 2008, 22:17

Un test essaye celui-ci
<?php
session_start();
$email_dest            = $_SESSION['email'];
$nom_expediteur        = 'dunbar';
$exp                   = 'lemail@lesite';

     $headers  ='From: '.$nom_expediteur.'<'.$exp.'>'."\n";          //----> Mail de l'expiditeur<-----//
     $headers .='Content-type: text/plain; charset=iso-8859-1'."\n";  //----> Type d'encodage du mail <----//
     $headers .='Content-Transfer-Encoding: 64bit'."\n";               //----> Niveau de crytage du mail <---//
     $headers .='X-MSMail-Priority: Normal'."\n";                     //----> Niveau de priorité du mail <---//
     $headers .='X-Originating-IP: [0.0.0.0]'."\n";                   //----> Adresse IP de l'expéditeur <---//

     $objet    = 'Objet du mail';
     $message  =  'Bonjour '.$_SESSION['nom']."\n\n".
     $message .=  'blablabla bliblibli blobloblob blublubli. '."\n\n".
                 '++++++++++++++++++++++++++++++++++++++++++++++++++++++'."\n".
                 'Cordialement '.$nom_expediteur."\n";


      if(mail($email_dest,$objet,$message,$headers))

	      {

          echo '<center><p> Envoi réussi</p>';

          }
     else
          {
          echo 'Le mail n\'a pu être envoyé';
          }
?>

ViPHP
ViPHP | 2291 Messages

16 mai 2008, 22:20

Bonsoir dunbar
Et merci, bien vu là aussi :wink: ...mais toujours:
Le mail n'a pu être envoyé; contactez le webmaster, svp.
|*()
C'est à ne plus rien y comprendre....
Je continues à chercher de mon côté, mais j'avoue m'y perdre.. #-o
Et tu me dis que chez toi ça fonctionne???
Je précise que je teste ça en ligne, et pas en local avec wamp.
Que pourrais je tester encore pour cerner le problème?
La fonction mail() est active sur ton serveur :?:
Si tu ne sait pas essaye de voir avec phpinfo

Eléphant du PHP | 250 Messages

16 mai 2008, 22:29

:shock: :shock: :?: :?:
C'est ça! ça marche!!!!!!!!!!
Mais je ne comprends plus...J'ai toujours cru que session_start() devait commencer AVANT tout le reste; autre chose, je n'ai pas ajouté la pièce jointe (un pdf) à ton test. Je vais essayer de l'ajouter, mais pense tu déjà que cela aussi puisse générer un pb?
EDIT
Oui oui, la fonction mail() est bien active; je l'utilise déjà sur une autre page du site...
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

ViPHP
ViPHP | 2291 Messages

16 mai 2008, 22:35

Oui en effet le session_start() doit commencer avant tout autre code
mais cette réflection me fait peur :wink:
Pourquoi dit tu cela :?:

Eléphant du PHP | 250 Messages

16 mai 2008, 22:50

Pour moi, et c'est ainsi que j'architecture par exemple cette page, c'est:

Code : Tout sélectionner

session_start(); /<entête xhtml> /<body>/la structure de la page/</body>
et là, j'ai bêtement copié ton test AVEC un session_start :oops: ....(wouaouh 2 session_start(); !!!
De ton test et de mon code je dirais que le tien est en "Content-Type: texte" et le mien en "Content-Type: multipart"; le tien sans pièce jointe le mien avec. Le tien fonctionne...pas le mien :cry:
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

ViPHP
ViPHP | 2291 Messages

16 mai 2008, 22:54

Pour moi, et c'est ainsi que j'architecture par exemple cette page, c'est:

Code : Tout sélectionner

session_start(); /<entête xhtml> /<body>/la structure de la page/</body>
et là, j'ai bêtement copié ton test AVEC un session_start :oops: ....(wouaouh 2 session_start(); !!!
De ton test et de mon code je dirais que le tien est en "Content-Type: texte" et le mien en "Content-Type: multipart"; le tien sans pièce jointe le mien avec. Le tien fonctionne...pas le mien :cry:
J'avais raison d'avoir peur :wink:
Il faudrait nous donner le code de toute ta page comme elle es et pas en morceau :P se sera plus simple
toi
session_start(); /<entête xhtml> /<body>/la structure de la page/</body
et normalement
<?php
session_start();
?>

/<entête xhtml> /<body>/la structure de la page/</body
Il faut séparer le code php du code html
je te conseil le tuto suivant