OVH Cloud OVH Cloud

Problème PHP

18 réponses
Avatar
Serge Nazarian
Bonjour,

Voici un bout de code PHP :

<?php
$email1='serge.nazarian@fai1.fr';
echo "ceci ne marche pas <$email1>\r\n";
echo "ceci marche < $email1 >\r\n";

$email2="serge.nazarian@fai2.fr";
echo "ceci ne marche pas <$email2>\r\n";
echo "ceci marche < $email2 >\r\n";
?>

Qui peut m'expliquer pourquoi ce programme renvoie :

ceci ne marche pas
ceci marche < serge.nazarian@fai1.fr >
ceci ne marche pas
ceci marche < serge.nazarian@fai2.fr >

autrement dit pourquoi < perturbe la chaîne de caractères s'il n'est
pas suivi d'une espace.
Moi, je cherche à afficher <serge.nazarian@fai.fr> sans espace.
Quelqu'un aurait-il une solution ?

Merci pour toute aide.
Cordialement,

--
Serge Nazarian
Pour m'écrire directement : http://cerbermail.com/?ZDkROVSJlu

8 réponses

1 2
Avatar
Serge Nazarian
Olivier Miakinen a écrit le 23/09/2016 :
Le 23/09/2016 08:54, Serge Nazarian a écrit :
[...] je cherche à envoyer un courriel (un mail en
franglais) dans un script PHP et que j'ai du mal avec le champ headers
(dont je veux bien qu'on m'explique toutes les subtilités ici ou
ailleurs).

Ok, je redirige vers fr.comp.lang.php.
Je suppose que tu utilises cette fonction d'envoi de courriel en PHP :
<http://php.net/manual/fr/function.mail.php>. Quels problèmes as-tu
exactement ?

Bonjour,
Je ne sais pas si ce que je mets dans $header est correct :
$header .= "From :".$nom." <".$email."> /r/n"
car l'affichage avec echo n'est pas bon, mais peut-être que l'envoi
avec $mail de PHP est bon quand même, d'après ce que je lis dans
<http://php.net/manual/fr/function.mail.php>.
Cordialement.
--
Serge Nazarian
Pour m'écrire directement : http://cerbermail.com/?ZDkROVSJlu
Avatar
Olivier Miakinen
Le 26/09/2016 11:03, Serge Nazarian a écrit :
Je suppose que tu utilises cette fonction d'envoi de courriel en PHP :
<http://php.net/manual/fr/function.mail.php>. Quels problèmes as-tu
exactement ?

Bonjour,
Je ne sais pas si ce que je mets dans $header est correct :

Non, ça ne l'est pas en effet. Je ne suis pas sûr de voir toutes les
erreurs car je ne connais pas le contenu de $header, $nom et $email
avant l'appel, mais il y a des erreurs évidentes rien que dans ce
que tu montres.
$header .

Puisque tu ajoutes quelque chose à un $header existant, il faudrait
déjà savoir ce qu'il y a dedans *avant*.
"From :"

Mettre l'espace après les deux-points et pas avant :
"From: "
.$nom." <".$email.

Il faudrait que $nom et $email soient syntaxiquement corrects, mais
je ne peux pas en juger comme ça. J'espère qu'ils ne viennent pas
directement d'une requête faite à l'utilisateur, sans contrôle, car
sinon ton script peut être utilisé pour spammer la terre entière.
Je ne plaisante pas.
"> /r/n"

Ça c'est la plus grosse erreur : rn et pas /r/n. Note que
l'espace avant n'est pas utile et pourrait être supprimée.
car l'affichage avec echo n'est pas bon, mais peut-être que l'envoi
avec $mail de PHP est bon quand même, d'après ce que je lis dans
<http://php.net/manual/fr/function.mail.php>.

:-D
Habituellement, on lit dans les forums d'entraide « ce que j'envoie
semble correct mais ça ne fonctionne pas ». Il est plus inhabituel
de lire « ce que j'envoie est incorrect mais ça devrait fonctionner
quand même »...
--
Olivier Miakinen
Avatar
Eric Demeester
Bonjour,
Olivier Miakinen (Mon, 26 Sep 2016 12:26:12 +0200 - fr.comp.lang.php) :
Le 26/09/2016 11:03, Serge Nazarian a écrit :
Je ne sais pas si ce que je mets dans $header est correct :
"> /r/n"

Ça c'est la plus grosse erreur : rn et pas /r/n. Note que
l'espace avant n'est pas utile et pourrait être supprimée.

Dans de nombreux cas (systèmes Unix en particulier), le "r" est inutile
voire nocif car risquant d'insérer des lignes vides, "n" suffit.
Habituellement, on lit dans les forums d'entraide « ce que j'envoie
semble correct mais ça ne fonctionne pas ». Il est plus inhabituel
de lire « ce que j'envoie est incorrect mais ça devrait fonctionner
quand même »...

La syntaxe est correcte, mais pour envoyer un courrier, pas pour
l'affichage dans une page HTML via echo ou print.
Voici un exemple qui fonctionne, servant à l'envoi d'un courrier de
confirmation suite au remplissage d'un formulaire en ligne, mais c'est
généralisable à tout envoi en texte brut :
// En-têtes du mail
// Expéditeur
$entete = "From: Expediteur n";
// Copie caché au gestionnaire du formulaire
$entete .= "Bcc: ";
// Précisions concernant le format d'envoi
$entete .= "MIME-Version: 1.0n";
$entete .= "Content-type: text/plain; charset=UTF-8n";
$entete .= "Content-Transfer-Encoding: quoted-printablen";
// Destinataire
$destinataire = "";
// Sujet
$sujet = "Compte-rendu des informations de votre formulaire"
// Corps du message
$message = "Bla bla bla";
// Envoi
$mail_ok = mail($destinataire, $subject, $message, $entete);
Avatar
Serge Nazarian
Eric Demeester a écrit le 26/09/2016 :
Bonjour,
Olivier Miakinen (Mon, 26 Sep 2016 12:26:12 +0200 - fr.comp.lang.php) :
Le 26/09/2016 11:03, Serge Nazarian a écrit :
Je ne sais pas si ce que je mets dans $header est correct :
"> /r/n"

Ça c'est la plus grosse erreur : rn et pas /r/n. Note que
l'espace avant n'est pas utile et pourrait être supprimée.

Dans de nombreux cas (systèmes Unix en particulier), le "r" est inutile
voire nocif car risquant d'insérer des lignes vides, "n" suffit.
Habituellement, on lit dans les forums d'entraide « ce que j'envoie
semble correct mais ça ne fonctionne pas ». Il est plus inhabituel
de lire « ce que j'envoie est incorrect mais ça devrait fonctionner
quand même »...

La syntaxe est correcte, mais pour envoyer un courrier, pas pour
l'affichage dans une page HTML via echo ou print.
Voici un exemple qui fonctionne, servant à l'envoi d'un courrier de
confirmation suite au remplissage d'un formulaire en ligne, mais c'est
généralisable à tout envoi en texte brut :
// En-têtes du mail
// Expéditeur
$entete = "From: Expediteur n";
// Copie caché au gestionnaire du formulaire
$entete .= "Bcc: ";
// Précisions concernant le format d'envoi
$entete .= "MIME-Version: 1.0n";
$entete .= "Content-type: text/plain; charset=UTF-8n";
$entete .= "Content-Transfer-Encoding: quoted-printablen";
// Destinataire
$destinataire = "";
// Sujet
$sujet = "Compte-rendu des informations de votre formulaire"
// Corps du message
$message = "Bla bla bla";
// Envoi
$mail_ok = mail($destinataire, $subject, $message, $entete);

Merci.
Mais $entete = "From: Expediteur n";
doit utiliser des variables postées dans un formulaire, $nom pour
Expediteur et $email pour
Est-ce que $entete = "From: ".$nom." <".$email.">n"; est correct ?
--
Serge Nazarian
Pour m'écrire directement : http://cerbermail.com/?ZDkROVSJlu
Avatar
Serge Nazarian
Olivier Miakinen a écrit le 26/09/2016 :
Il faudrait que $nom et $email soient syntaxiquement corrects, mais
je ne peux pas en juger comme ça. J'espère qu'ils ne viennent pas
directement d'une requête faite à l'utilisateur, sans contrôle, car
sinon ton script peut être utilisé pour spammer la terre entière.
Je ne plaisante pas.

Peux-tu m'en dire un peu plus sur le risque de « spammer la terre
entière » car effectivement $nom et $email proviennent d'un formulaire
rempli par l'utilisateur.
--
Serge Nazarian
Pour m'écrire directement : http://cerbermail.com/?ZDkROVSJlu
Avatar
Olivier Miakinen
Le 27/09/2016 09:13, Serge Nazarian a écrit :
Mais $entete = "From: Expediteur n";
doit utiliser des variables postées dans un formulaire, $nom pour
Expediteur et $email pour

Hum. Je vais répondre à ton autre message à ce propos.
Est-ce que $entete = "From: ".$nom." <".$email.">n"; est correct ?

Oui, ou plus simplement : $entete = "From: $nom <$email>n";
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 27/09/2016 09:18, Serge Nazarian m'a répondu :
Il faudrait que $nom et $email soient syntaxiquement corrects, mais
je ne peux pas en juger comme ça. J'espère qu'ils ne viennent pas
directement d'une requête faite à l'utilisateur, sans contrôle, car
sinon ton script peut être utilisé pour spammer la terre entière.
Je ne plaisante pas.

Peux-tu m'en dire un peu plus sur le risque de « spammer la terre
entière » car effectivement $nom et $email proviennent d'un formulaire
rempli par l'utilisateur.

Très volontiers.
Dans un courriel, ce qui sépare les entêtes du contenu du message,
c'est juste deux sauts de ligne de suite. Avoir un contrôle sur une
partie du contenu d'un entête suffit alors pour ajouter d'une part
de nombreux autres entêtes, d'autre part le corps du message lui-même.
Pour cela, il suffit que le paramètre $nom ou $email contienne par
exemple :
"n
Subject: achetez mon beau produitn
To: <adresse_spammée_1>n
To: <adresse_spammée_2>n
...
To: <adresse_spammée_3000>n
n
J'ai un superbe produit à vendre, achetez-le.n
Allez sur <site_de_spam>.n
...
...n"
Le spammeur peut faire mieux, d'abord en complétant le champ From
au lieu de l'interrompre brutalement, et aussi en envoyant son
spam en MIME Multipart, ce qui relègue le *vrai* contenu de ton
message dans une zone cachée (il ne reste donc plus que le spam
et rien d'autre).
Heureusement, on peut s'en protéger. La solution /a minima/ consiste
à vérifier que les champs $nom et $email ne contiennent aucun saut
de ligne.
Tu peux aller plus loin, en vérifiant d'abord que l'adresse de courriel
est syntaxiquement correcte : <http://faqfclphp.free.fr/#rub5.3>. Pour
bien faire, il faudrait aussi encoder le nom selon MIME (RFC 2047) si
jamais il contient des caractères non ASCII, mais je parierais bien
que la classe PHPMailer indiquée par Jean-François sait le faire.
--
Olivier Miakinen
Avatar
Serge Nazarian
Olivier Miakinen a écrit le 27/09/2016 :
Le 27/09/2016 09:18, Serge Nazarian m'a répondu :
Il faudrait que $nom et $email soient syntaxiquement corrects, mais
je ne peux pas en juger comme ça. J'espère qu'ils ne viennent pas
directement d'une requête faite à l'utilisateur, sans contrôle, car
sinon ton script peut être utilisé pour spammer la terre entière.
Je ne plaisante pas.

Peux-tu m'en dire un peu plus sur le risque de « spammer la terre
entière » car effectivement $nom et $email proviennent d'un formulaire
rempli par l'utilisateur.

Très volontiers.
Dans un courriel, ce qui sépare les entêtes du contenu du message,
c'est juste deux sauts de ligne de suite. Avoir un contrôle sur une
partie du contenu d'un entête suffit alors pour ajouter d'une part
de nombreux autres entêtes, d'autre part le corps du message lui-même.
Pour cela, il suffit que le paramètre $nom ou $email contienne par
exemple :
"n
Subject: achetez mon beau produitn
To: <adresse_spammée_1>n
To: <adresse_spammée_2>n
...
To: <adresse_spammée_3000>n
n
J'ai un superbe produit à vendre, achetez-le.n
Allez sur <site_de_spam>.n
...
...n"
Le spammeur peut faire mieux, d'abord en complétant le champ From
au lieu de l'interrompre brutalement, et aussi en envoyant son
spam en MIME Multipart, ce qui relègue le *vrai* contenu de ton
message dans une zone cachée (il ne reste donc plus que le spam
et rien d'autre).
Heureusement, on peut s'en protéger. La solution /a minima/ consiste
à vérifier que les champs $nom et $email ne contiennent aucun saut
de ligne.
Tu peux aller plus loin, en vérifiant d'abord que l'adresse de courriel
est syntaxiquement correcte : <http://faqfclphp.free.fr/#rub5.3>. Pour
bien faire, il faudrait aussi encoder le nom selon MIME (RFC 2047) si
jamais il contient des caractères non ASCII, mais je parierais bien
que la classe PHPMailer indiquée par Jean-François sait le faire.

Merci pour cette très claire explication.
--
Serge Nazarian
Pour m'écrire directement : http://cerbermail.com/?ZDkROVSJlu
1 2