8797 sujets

Développement web côté serveur, CMS

Bonjour,

Afin de poster automatiquement un courriel, j'emploie un code PHP du type :


<?php

$Destinataire = "un@courriel.com";
$Sujet = "Sujet du courriel";

$From  = "From:abc@domaine.com\n";
$From .= "MIME-version: 1.0\n";
$From .= "Content-type: text/html; charset= iso-8859-1\n";

$Message = "<b>Du code html</b>";

mail($Destinataire,$Sujet,$Message,$From);
?>


Pour définir la valeur de la variable "message", j'aurais aimé utiliser la fonction include(). Par exemple, au lieu de taper
<b>Du code html</b>
, j'utiliserais un
 include('page.php')
pour insérer du contenu HTML.

J'ai tenté la chose, sans succès Smiley biggol . Quelqu'un saurait-il comment faire? Merci à l'avance!

Nalita33
Modifié par nalita33 (24 Sep 2008 - 01:45)
dew a écrit :
$message = file_get_contents('page.php');


(PHP 4 >= 4.3.0, PHP 5)


Bonjour,

Je viens d'essayer cette fonction. Tout semble ok (pas de message d'erreur de la part du serveur), à l'exception que mon message arrive vide Smiley rolleyes . J'ai vérifié l'emplacement de mon fichier page.php, c'est correctement spécifié... Et bien entendu, ce fichier contient du code HTML valide. Que faire? Merci. Smiley cligne
$message n'est PAS $Message.

Attention aux majuscules!!!

__________
Autre option, à toujours privilégier quand on a un problème:

Débugger Smiley smile

echo "Le fichier page.php ".((file_exists("page.php"))?"existe bien":"n'existe pas");
echo "Il pèse ".filesize("page.php")." octets";
echo "Il contient la valeur <xmp>$message</xmp>";

En mettant ça avant ta fonction mail().

Si c'est bon, c'est que le problème vient de mail(), ce qui est peu probable.
Modifié par Nox (23 Sep 2008 - 18:08)
Nox a écrit :
$message n'est PAS $Message.

Attention aux majuscules!!!


Effectivement parfois le bogue est tout bête... Merci, je crois que c'était simplement un cas de majuscules.


Encore merci à tous ceux qui m'ont aidé! Smiley ravi
Rebonjour,

Je croyais ce post résolu, mais voilà qu'un nouveau problème est apparu.

Si le fichier page.php ne contient que du code HTML, tout baigne.

Mais si, dans ce fichier, j'utilise un quelconque code php (que ce soit un include(), un echo $variable, etc.), et bien le code est ignoré et ne fonctionne pas. Seul le HTML s'affiche. Je suspecte que ce soit en partie dû au fait que j'ai spécifié un format text/html pour l'envoi par e-mail du message. Comment procéder autrement pour que les fragments de code PHP soient aussi pris en compte?

Merci
Nalita33
Modérateur
Salut nalita33,

As tu essayé d'évaluer ta variable (eval())?


$message=file_get_contents("page.php");
$message=eval($message);


Là, je ne suis pas sur ma machine mais il me semble que cela devrait fonctionner. À moins que je me sois trompé, sorry/désolé/pas taper SVP.

++
Modifié par Nolem (23 Sep 2008 - 21:44)
Nolem a écrit :
Salut nalita33,

As tu essayé d'évaluer ta variable (eval())?


$message=file_get_contents("page.php");
$message=eval($message);


Là, je ne suis pas sur ma machine mais il me semble que cela devrait fonctionner. À moins que je me sois trompé, sorry/désolé/pas taper SVP.

++


Hum, je viens d'essayer, sans succès. Pourtant ça semble bien pour mon cas, le eval(). Peut-être juste un problème au niveau de la syntaxe dans l'emploi de ce truc? Je ne sais pas, je suis débutante en php.
Modérateur
Peut être faut il lire le fichier ligne par ligne :


$fichier= @fopen("page.php", "r");
fseek($fichier,0); //pointeur à zéro
if ($fichier) {
   while (!feof($fichier)) {
      $message=fgets($fichier, 4096);
      $message=eval($message);
   }
   fclose($fichier);
}


Sinon, tu peux essayer de cette manière :

$fichier= @fopen("page.php", "r");
fseek($fichier,0); //pointeur à zéro
$message=fread($fichier,filesize("page.php"));
$message=eval($message);

fclose($fichier);



Le soucis est que je ne peux pas tester ton script sur la machine où je suis (cyber).

<<<EDIT
Là, je viens de regarder dans la doc PHP comment ouvrir le fichier php (fopen("","")). Si le code que je ne t'ai fait ne fonctionne pas essaie de faire ceci :
$fichier= @fopen("page.php", "rb");

Je ne sais pas si un fichier php est traité en mode binaire. Logiquement non . Mais j'ai un doute.
EDIT;


++
Modifié par Nolem (23 Sep 2008 - 23:09)
Nolem a écrit :
Peut être faut il lire le fichier ligne par ligne :


$fichier= @fopen("page.php", "r");
fseek($fichier,0); //pointeur à zéro
if ($fichier) {
   while (!feof($fichier)) {
      $message=fgets($fichier, 4096);
      $message=eval($message);
   }
   fclose($fichier);
}


Sinon, tu peux essayer de cette manière :

$fichier= @fopen("page.php", "r");
fseek($fichier,0); //pointeur à zéro
$message=fread($fichier,filesize("page.php"));
$message=eval($message);

fclose($fichier);



Le soucis est que je ne peux pas tester ton script sur la machine où je suis (cyber).


++


Hum, encore une fois, j'ai testé et ça ne marche pas. Et ce n'est pas une question de majuscules ou de variables mal nommées dans mon script, j'ai vérifié.... Smiley biggol Merci tout de même pour ton aide!

Nalita33
Nolem a écrit :


<<<EDIT
Là, je viens de regarder dans la doc PHP comment ouvrir le fichier php (fopen("","")). Si le code que je ne t'ai fait ne fonctionne pas essaie de faire ceci :
$fichier= @fopen("page.php", "rb");

Je ne sais pas si un fichier php est traité en mode binaire. Logiquement non . Mais j'ai un doute.
EDIT;

++


Après essai, le truc pour traitement en mode binaire ("rb") n'a pas davantage fait fonctionner la chose. Rezut...
Smiley confus
Possible et facile: La méthode a priviligier est d'utiliser ob_get_contents.

C'est un des rares moyen d'intercepter la sortie de PHP (code html, ce qui est envoyé par echo, etc).


ob_start();
include("page.php");
$message = ob_get_contents();
ob_end_clean();



C'est une méthode assez bourrine mais qui marche bien.

Déconseillé: Une autre méthode encore plus bourrine consiste à lancer une commade du style exec("php.exe -f page.php > page.html"). Le résultat sera dans page.html. La différence c'est que toutes les variables sont remises à zéro en quelques sorte (ce qui peut ne pas t'arranger).

Conseillé: Le mieux est tout de même de réécrire ta page page.php de façon à tout mettre proprement dans une variable:
$message= "<html><body>blabla";
$message.="etc";
$message.="fin</body></html>";


PS: Attention une fois de plus aux majuscules Smiley rolleyes
Modifié par Nox (23 Sep 2008 - 23:54)
eval() n'interprete que le code PHP, il ne comprendra pas ton code HTML, donc ce n'est pas la bonne méthode pour un fichier contenant les deux, à moins que tu ne fasses comme Nox indique, en mettant tout ton contenu dans une variable PHP. Mais c'est pas forcément plus pratique à relire.

exec sur un mutualisé a très peu de chance de fonctionner ^^

Le moyen est comme l'a indiqué Nox d'utiliser ob_get_contents(); de la manière qu'il a indiqué
Nox a écrit :
Possible et facile: La méthode a priviligier est d'utiliser ob_get_contents.

C'est un des rares moyen d'intercepter la sortie de PHP (code html, ce qui est envoyé par echo, etc).


ob_start();
include("page.php");
$message = ob_get_contents();
ob_end_clean();



Gé-ni-al! C'est en plein la fonction que je cherchais. Et tout fonctionne merveilleusement. Je privilégie cette façon de procéder (plutôt que l'option de tout réécrire avec la concaténation) parce que le contenu de page.php est très très long (du genre paperasserie administrative!).

Merci encore pour ce coup de main et pour avoir commenté et illustré différentes possibilités de parvenir au même résultat.

Nalita33 Smiley lol