Discussion:
une petite erreur avec PHP mail(), help!
(trop ancien pour répondre)
sab
2009-03-20 11:10:16 UTC
Permalink
Bonjour et d'avance merci:

J'ai un formulaire que j'envoie par PHP mail()

mon formulaire commence bien evidemment par:
<form method="post" action="envoi.php">
Ci dessous le code de: ENVOI.PHP

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1252">
<title>envoi.php</title>
</head>
<body>
<?php

// récuperation des variables provenant du formulaire
$prenomnom = $_POST['T1'];
$email = $_POST['T4'];
$qualite = $_POST['T2'];
$adresse = $_POST['T3'];
$telephone = $_POST['T5'];
$mobile = $_POST['T6'];

//E-mail auquel sera envoyé le formulaire
$destinataire = '***@club-internet.fr';

//sujet du mail envoyé
$sujet = 'Formulaire d'inscription';

//test pour vérifier que les champs sont bien tous remplis !!
if( !empty($prenomnom) && !empty($email) && !empty($adresse) ){

// création du message, les \n permettent de faire un saut de ligne
$message = "Une réponse est parvenue sur le
site\n\nNom:\n$prenomnom\n\nEmail:\n$email\n\nQualité:\n$qualite
\n\nAdresse:\n$adresse\n\nTéléphone:\n$telephone\n\nMobile:\n$mobile";

// On envoi le mail
if( mail($destinataire, $sujet, $message, "From: $email") )

// Si tout se passe bien on affiche un message de succès d'envoi
{header("Location: http://a.demxxxeurop.fr/merci.htm");}

// Si on rencontre un problème de réseau (connection serveur etc...)
else{ echo 'Une erreur est survenue lors de l\'envoi du message';}

}

// Si tous les champs ne sont pas remplis
else{ echo 'Merci de remplir tous les champs';}
?>
</body>
</html>

Lorsque je ne rempli pas les 3 champs obligatoire j'ai bien le
message:"merci de remplir tous les champs" et lorsque tous les champs
sont remplis et que je fais envoi le formulaire est bien expédié sur
mon email. MAIS je n'ai pas la page de remerciement et qui indique que
le formulaire est bien parti: nommmée "merci.htm" . A la place
s'affiche ma un message d'erreur:

Warning: Cannot modify header information - headers already sent by
(output started at /mnt/147/sda/5/8/a.demxxxeurop/envoi.php:9) in
/mnt/147/sda/5/8/a.demxxxeurop/envoi.php on line 43

Il y a forcement une erreur quelque part dans mon code qui empeche
d'afficher apres l'envoi la page de remerciement

Chercher l'erreur!!
Olivier Miakinen
2009-03-20 11:47:54 UTC
Permalink
[ je ne suis pas sûr d'avoir déjà envoyé cette réponse ou non -- pardon
si c'était le cas ]

Bonjour,
Post by sab
J'ai un formulaire que j'envoie par PHP mail()
<form method="post" action="envoi.php">
Ci dessous le code de: ENVOI.PHP
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1252">
Moui bof... il y a un peu plus standard comme jeu de caractères que
windows-1252...
Post by sab
[...]
<?php
[...]
$email = $_POST['T4'];
[...]
//test pour vérifier que les champs sont bien tous remplis !!
if( !empty($prenomnom) && !empty($email) && !empty($adresse) ){
Tu n'as pas vérifié que $email ne contenait pas de sauts de ligne.
Post by sab
// création du message, les \n permettent de faire un saut de ligne
$message = "Une réponse est parvenue sur le
site\n\nNom:\n$prenomnom\n\nEmail:\n$email\n\nQualité:\n$qualite
\n\nAdresse:\n$adresse\n\nTéléphone:\n$telephone\n\nMobile:\n$mobile";
Attention, tu utilises autre chose que de l'US-ASCII (« réponse »,
« Qualité », « Téléphone »), aussi il serait bon de déclarer le jeu de
caractères. Cela dit, si c'est toi le destinataire et que tu n'es pas
gêné, c'est ton problème.
Post by sab
// On envoi le mail
if( mail($destinataire, $sujet, $message, "From: $email") )
Avec un $email si peu vérifié, ton formulaire peut servir de relais à
spam, par paquets de mille destinataires. Cf. la réponse que j'ai déjà
faite à remy.
Post by sab
// Si tout se passe bien on affiche un message de succès d'envoi
{header("Location: http://a.demxxxeurop.fr/merci.htm");}
Ça ne peut pas marcher : les entêtes ont déjà été envoyés.
Post by sab
Warning: Cannot modify header information - headers already sent by
(output started at /mnt/147/sda/5/8/a.demxxxeurop/envoi.php:9) in
/mnt/147/sda/5/8/a.demxxxeurop/envoi.php on line 43
RTFM !

Qui plus est, c'est exactement le même problème que remy, et je l'ai
déjà renvoyé vers <http://faqfclphp.free.fr/#rub2.12>.
Post by sab
Chercher l'erreur!!
Y a qu'à lire la doc.

<cit. http://fr.php.net/header>
Remember that header() must be called before any actual output is
sent, either by normal HTML tags, blank lines in a file, or from PHP.
</cit.>

<cit. http://fr.php.net/manual/fr/function.header.php>
N'oubliez jamais que header() doit être appelée avant que le moindre
contenu ne soit envoyé, soit par des lignes HTML habituelles dans le
fichier, soit par des affichages PHP.
</cit.>
CrazyCat
2009-03-20 15:00:18 UTC
Permalink
Post by Olivier Miakinen
Post by sab
// Si tout se passe bien on affiche un message de succès d'envoi
{header("Location: http://a.demxxxeurop.fr/merci.htm");}
Ça ne peut pas marcher : les entêtes ont déjà été envoyés.
Au risque d'être hors-sujet, je me permet tout de même cette remarque:
autant que faire se peut, effectuer d'abord les traitements PHP et
ensuite la génération de la page.

Dans le cas de pages traitant des formulaires, j'irais même plus loin:
faire le traitement dans une autre page qui ensuite effectuera une
redirection vers la page html, afin d'éviter un multipostage à coup de
rechargements.
--
Réseau IRC Francophone: http://www.zeolia.net
Aide et astuces : http://www.g33k-zone.org
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr
sab
2009-03-20 19:26:03 UTC
Permalink
Post by Olivier Miakinen
[ je ne suis pas sûr d'avoir déjà envoyé cette réponse ou non -- pardon
si c'était le cas ]
Bonjour,
Post by sab
J'ai un formulaire que j'envoie par PHP mail()
<form method="post" action="envoi.php">
Ci dessous le code de: ENVOI.PHP
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1252">
Moui bof... il y a un peu plus standard comme jeu de caractères que
windows-1252...
Ah ben ça s'est front Page!! un peu vieillot mais pour ce que je fais
cela me suffit!!
Post by Olivier Miakinen
Post by sab
[...]
<?php
[...]
$email = $_POST['T4'];
[...]
//test pour vérifier que les champs sont bien tous remplis !!
if( !empty($prenomnom) && !empty($email) && !empty($adresse) ){
Tu n'as pas vérifié que $email ne contenait pas de sauts de ligne.
Que veux tu dire $email est l'email que la personne a rempli dans le
champs "mail" du formulaire.
Post by Olivier Miakinen
Post by sab
// création du message, les \n permettent de faire un saut de ligne
$message = "Une réponse est parvenue sur le
site\n\nNom:\n$prenomnom\n\nEmail:\n$email\n\nQualité:\n$qualite
\n\nAdresse:\n$adresse\n\nTéléphone:\n$telephone\n\nMobile:\n$mobile";
Attention, tu utilises autre chose que de l'US-ASCII (« réponse »,
« Qualité », « Téléphone »), aussi il serait bon de déclarer le jeu de
caractères. Cela dit, si c'est toi le destinataire et que tu n'es pas
gêné, c'est ton problème.
oui c'est moi qui receptionne le formulaire sur mon mail et cela
fonctionne tres bien la presentation est tout a fait correcte et je ne
sais surtout pas comment faire autremùent!!
Post by Olivier Miakinen
Ça ne peut pas marcher : les entêtes ont déjà été envoyés.
Post by sab
Warning: Cannot modify header information - headers already sent by
(output started at /mnt/147/sda/5/8/a.demxxxeurop/envoi.php:9) in
/mnt/147/sda/5/8/a.demxxxeurop/envoi.php on line 43
RTFM !
Qui plus est, c'est exactement le même problème que remy, et je l'ai
déjà renvoyé vers <http://faqfclphp.free.fr/#rub2.12>.
Post by sab
Chercher l'erreur!!
Ben comme je ne fais que de l'html et de temps en temps j'accomode un
petit script PHP "à ma sauce" c'est pour cela que je viens demander un
petit depannage , car cela ne doit pas etre grand chose a changer dans
le script...
mais quoi..??
Olivier Miakinen
2009-03-20 23:06:26 UTC
Permalink
Post by Olivier Miakinen
Post by sab
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1252">
Moui bof... il y a un peu plus standard comme jeu de caractères que
windows-1252...
Ah ben ça c'est front Page!! un peu vieillot mais pour ce que je fais
cela me suffit!!
Ah ! ;-)

Note que tu peux toujours remplacer windows-1252 par ISO-8859-1 après
coup, si jamais tu n'utilises aucune des caractères spécifiques à
windows-1252.
Post by Olivier Miakinen
Post by sab
[...]
<?php
[...]
$email = $_POST['T4'];
[...]
//test pour vérifier que les champs sont bien tous remplis !!
if( !empty($prenomnom) && !empty($email) && !empty($adresse) ){
Tu n'as pas vérifié que $email ne contenait pas de sauts de ligne.
Que veux tu dire $email est l'email que la personne a rempli dans le
champs "mail" du formulaire.
Je veux dire que si tu remplaces « la personne » par « un robot
spammeur », alors dans $_POST['T4'] il peut remplacer :
"***@mon.adresse.example.com"
par :
"***@mon.adresse.example.com\r\n
To: ***@spammer.com\r\n
To: ***@spammer.com\r\n
...
...
To: ***@spammer.com\r\n
Subject: achetez mon VlAGR@\r\n
\r\n
... contenu du spam ..."

Ledit robot spammeur peut t'envoyer cette requête POST à raison de
quelques centaines par minute, ce qui fait plusieurs centaines de
milliers d'adresses spammées à la minute grâce à ton formulaire.
Post by Olivier Miakinen
Post by sab
// création du message, les \n permettent de faire un saut de ligne
$message = "Une réponse est parvenue sur le
site\n\nNom:\n$prenomnom\n\nEmail:\n$email\n\nQualité:\n$qualite
\n\nAdresse:\n$adresse\n\nTéléphone:\n$telephone\n\nMobile:\n$mobile";
Attention, tu utilises autre chose que de l'US-ASCII (« réponse »,
« Qualité », « Téléphone »), aussi il serait bon de déclarer le jeu de
caractères. Cela dit, si c'est toi le destinataire et que tu n'es pas
gêné, c'est ton problème.
oui c'est moi qui receptionne le formulaire sur mon mail et cela
fonctionne tres bien la presentation est tout a fait correcte et je ne
sais surtout pas comment faire autremùent!!
Pour faire autrement, il faudrait rajouter les entêtes MIME qui vont
bien dans le paramètre header. Si tu as envie de bien faire les choses,
va voir les réponses que j'ai faites il y a quelques jours à Pascale.
Mais bon, ne t'embête pas avec ça tant que tu es le seul concerné et
que « chez toi ça marche »©.
Post by Olivier Miakinen
Ça ne peut pas marcher : les entêtes ont déjà été envoyés.
[...]
<http://faqfclphp.free.fr/#rub2.12>.
Ben comme je ne fais que de l'html et de temps en temps j'accomode un
petit script PHP "à ma sauce" c'est pour cela que je viens demander un
petit depannage , car cela ne doit pas etre grand chose a changer dans
le script...
mais quoi..??
En clair, au lieu d'avoir :

-----------------------------------------------------------
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1252">
<title>envoi.php</title>
</head>
<body>
<?php
...
if (...) { header(...) }
else { echo 'Merci de remplir tous les champs'; }
?>
</body>
</html>
-----------------------------------------------------------

... tu dois avoir :
-----------------------------------------------------------
<?php
...
if (...) { header(...); exit; }
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1252">
<title>envoi.php</title>
</head>
<body>
<p>
Merci de remplir tous les champs
</p>
</body>
</html>
-----------------------------------------------------------

*MAIS* à moins d'être parfaitement au point en ce qui concerne la
sécurité et les techniques de spam, il est *TRÈS* déconseillé d'utiliser
la fonction mail() en lui passant des données venant d'un formulaire...


Cordialement,
--
Olivier Miakinen
sab
2009-03-22 22:28:36 UTC
Permalink
Bonjour et merci de vos reponses..
Post by Olivier Miakinen
Je veux dire que si tu remplaces « la personne » par « un robot
...
...
\r\n
... contenu du spam ..."
dans:
if( mail($destinataire, $sujet, $message, "From: $email") )

je peux tres bien ne pas mettre "from: $email" si cela pose trop de
probleme de securité ça ne me derange pas c'etait simplement par
facilité ainsi quand je recevais sur mon mail le formulaire , je
n'avais qu'a faire "répondre" dans mon logiciel de messagerie pour
repondre à la personne qui avait envoyé le formulaire depuis le site
mais je peux tout aussi bien recopier le champ email dans le formulaire
que j'ai reçu.
A moins qu'il y est une façon simple d'empecher les sauts de lignes
dans le champ email.
Post by Olivier Miakinen
-----------------------------------------------------------
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1252">
<title>envoi.php</title>
</head>
<body>
<?php
...
if (...) { header(...) }
else { echo 'Merci de remplir tous les champs'; }
?>
</body>
</html>
-----------------------------------------------------------
-----------------------------------------------------------
<?php
...
if (...) { header(...); exit; }
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1252">
<title>envoi.php</title>
</head>
<body>
<p>
Merci de remplir tous les champs
</p>
</body>
</html>
Donc dans "envoi.php" il suffit de commencer par le code php: <?php
........?> et ensuite le code html : <html> avec bien evidemment son
head et ensuite son body </html>
Un truc qui me semble byzarre tout de meme c'est que dans le code php
j'ai un "if" mais je n'ai plus aucun "else"

Bon je vais essayer tout de meme

Merci
Olivier Miakinen
2009-03-22 23:13:42 UTC
Permalink
Post by sab
[...]
if( mail($destinataire, $sujet, $message, "From: $email") )
je peux tres bien ne pas mettre "from: $email" si cela pose trop de
probleme de securité ça ne me derange pas c'etait simplement par
facilité ainsi quand je recevais sur mon mail le formulaire , je
n'avais qu'a faire "répondre" dans mon logiciel de messagerie pour
repondre à la personne qui avait envoyé le formulaire depuis le site
Oui, je comprends bien.
Post by sab
mais je peux tout aussi bien recopier le champ email dans le formulaire
que j'ai reçu.
A moins qu'il y ait une façon simple d'empecher les sauts de lignes
dans le champ email.
Oui, par une expression rationnelle. Tu peux même en profiter pour
rejeter un grand nombre de chaînes qui n'ont aucune chance d'être une
adresse de courriel. Cf. <http://faqfclphp.free.fr/#rub5.3>.

$ltext = '[A-Za-z0-9!#$%&\'*+/=?^_`{|}~-]+';
$rtext = '[A-Za-z0-9-]+';
$pattern = ":^$ltext(\.$ltext)*@$rtext(\.$rtext)+$:";
if (preg_match($pattern, $email)) {
// Ok, adresse non dangereuse
$safefrom = "From: $email";
} else {
// pas une vraie adresse, danger !
$message .= "\nadresse de courriel prétendue=$email";
$safefrom = "From: $destinataire"; // défini en dur plus haut
}
if (mail($destinataire, $sujet, $message, $safefrom)) {
...
}
Post by sab
[...]
[...]
Merci d'alléger au maximum les citations quand tu réponds. Il est rare
qu'une citation si longue passe le cap de la modération.
Post by sab
Donc dans "envoi.php" il suffit de commencer par le code php: <?php
........?> et ensuite le code html : <html> avec bien evidemment son
head et ensuite son body </html>
Exactement. Parce que les entêtes ne peuvent être envoyés qu'au début.
Au premier octet de contenu envoyé, cela clôt la liste des entêtes.
Post by sab
Un truc qui me semble bizarre tout de meme c'est que dans le code php
j'ai un "if" mais je n'ai plus aucun "else"
Pour simplifier le code, j'ai mis un « exit » juste après la commande
header().

Tu peux préférer mettre un :
else {
suivi de :
?>
suivi du code HTML,
pour finir par :
<?php
}
?>
mais moi je trouve ça peu lisible (et pour tout dire très moche). Il y a
d'autres possibilités mais je trouve que la solution du « exit » est la
plus propre.
sab
2009-03-23 16:19:38 UTC
Permalink
Bonjour et merci...

tel quel cela ne fonctionnait pas encore...(j'avais encore une alerte)
j'ai adapté un tout petit peu (en supprimant le double "If" ) et c'est
nickel! J'ai rajouté la vérification de l'email qui elle aussi en cas
de "faux" emails est parfaite et fonctionne. J'arrive donc à ce code ci
dessous. Mon formulaire ainsi renvoyé est il maintenant sécurisé?

<?php
// récuperation des variables provenant du formulaire
$prenomnom = $_POST['T1'];
$email = $_POST['T4'];
$qualite = $_POST['T2'];
$adresse = $_POST['T3'];
$telephone = $_POST['T5'];
$mobile = $_POST['T6'];

//E-mail auquel sera envoyé le formulaire
$destinataire = '***@club-internet.fr';

//on verifie le champs email pour ne pas avoir de spam
$ltext = '[A-Za-z0-9!#$%&\'*+/=?^_`{|}~-]+';
$rtext = '[A-Za-z0-9-]+';
$pattern = ":^$ltext(\.$ltext)*@$rtext(\.$rtext)+$:";
if (preg_match($pattern, $email)) {
// Ok, adresse non dangereuse
$safefrom = "From: $email";
} else {
// pas une vraie adresse, danger !
$message .= "\nadresse de courriel prétendue=$email";
$safefrom = "From: $destinataire"; // défini en dur plus haut
}
//sujet du mail envoyé
$sujet = 'Formulaire de contact';

// création du message, les \n permettent de faire un saut de ligne
$message = "Une réponse est parvenue sur le site
\n\nNom:\n$prenomnom\n\nEmail:\n$email\n\nQualité:\n$qualite
\n\nAdresse:\n$adresse\n\nTéléphone:\n$telephone\n\nMobile:\n$mobile";

//test pour vérifier que les champs sont bien tous remplis !!
if( !empty($prenomnom) && !empty($email) && !empty($adresse) ){

// On envoi le mail
mail($destinataire, $sujet, $message, $safefrom);

//et on affiche un message de succès d'envoi
header("Location: http://a.dexxxxrope.free.fr/merci.htm"); }

else {
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1252">
<title>envoi.php</title>
</head>
<body>
<p> Merci de remplir les champs obligatoires: nom, adresse et email
</p>
</body>
</html>
<?php
}
?>

Voila j'ai mis l'option else (avec exit cela fonctionnait aussi)
uniquement pour moi car dans 6 mois quand j'aurais besoin de revenir
dessus ou autre, j'aurais la bonne syntaxe if..else et la façon de
l'ecrire.!!

Si l'on voulait pinailler on pourrait rajouter une alerte au cas ou il
y ait une panne duserveur qui ne veuille pas envoyer le mail et
afficher une page ou l'on dirait que le formulaire n'a pu etre envoyé
et de recommencer ulterieurement...mais je suppose que si la fonction
Php mail d'un serveur ne fonctionne pas le serveur lui meme doit
envoyer une alerte non? dans ce cas cela ferait double emploi...

Merci bien
Olivier Miakinen
2009-03-24 02:10:10 UTC
Permalink
[...] Mon formulaire ainsi renvoyé est il maintenant sécurisé?
Ça me semble bon. J'ai juste une remarque mais sans impact sur la sécurité.
$message .= "\nadresse de courriel prétendue=$email";
Je ne l'avais pas précisé, mais ceci est à faire *après* avoir rempli
$message avec tout le reste (nom, prénom, etc.), sinon la valeur est
écrasée par la suite.
// création du message, les \n permettent de faire un saut de ligne
$message = "Une réponse est parvenue sur le site
\n\nNom:\n$prenomnom\n\nEmail:\n$email\n\nQualité:\n$qualite
\n\nAdresse:\n$adresse\n\nTéléphone:\n$telephone\n\nMobile:\n$mobile";
C'est ça qu'il fallait mettre avant le « $message .= ... ».
Voila j'ai mis l'option else (avec exit cela fonctionnait aussi)
uniquement pour moi car dans 6 mois quand j'aurais besoin de revenir
dessus ou autre, j'aurais la bonne syntaxe if..else et la façon de
l'ecrire.!!
Tu fais bien comme tu veux ! ;-)
Si l'on voulait pinailler on pourrait rajouter une alerte au cas ou il
y ait une panne duserveur qui ne veuille pas envoyer le mail et
afficher une page ou l'on dirait que le formulaire n'a pu etre envoyé
et de recommencer ulterieurement...
Si le serveur web fonctionne mais pas le serveur SMTP, alors
effectivement tu pourrais envisager une page d'erreur spécifique
car je ne vois pas, sinon, comment l'utilisateur pourrait être
prévenu. Mais j'ai une meilleure idée : l'utilisateur n'en a rien
à faire de tes problèmes internes, alors plutôt que lui retourner
un code d'erreur tu pourrais stocker dans un fichier ou une base de
données les infos que tu n'as pas pu t'envoyer par courriel.

À charge pour toi, ensuite, de vérifier de temps en temps s'il n'y
a pas justement des données en attente.
mais je suppose que si la fonction
Php mail d'un serveur ne fonctionne pas le serveur lui meme doit
envoyer une alerte non?
Je ne pense pas, non. Mais je peux me tromper.

Sinon, voici un code un peu amélioré par rapport au précédent :

<?php
// récuperation des variables provenant du formulaire
$prenomnom = $_POST['T1'];
$email = $_POST['T4'];
$qualite = $_POST['T2'];
$adresse = $_POST['T3'];
$telephone = $_POST['T5'];
$mobile = $_POST['T6'];

//E-mail auquel sera envoyé le formulaire
$destinataire = '***@club-internet.fr';

//test pour vérifier que les champs sont bien tous remplis !!
if( !empty($prenomnom) && !empty($email) && !empty($adresse) ){

// création du message, les \n permettent de faire un saut de ligne
$message = "Une réponse est parvenue sur le site\n\n" .
"Nom:\n$prenomnom\n\nEmail:\n$email\n\nQualité:\n$qualite\n\n" .
"Adresse:\n$adresse\n\nTéléphone:\n$telephone\n\nMobile:\n$mobile";

//on verifie le champ email pour ne pas avoir de spam
$ltext = '[A-Za-z0-9!#$%&\'*+/=?^_`{|}~-]+';
$rtext = '[A-Za-z0-9-]+';
$pattern = ":^$ltext(\.$ltext)*@$rtext(\.$rtext)+$:";
if (preg_match($pattern, $email)) {
// Ok, adresse non dangereuse
$safefrom = "From: $email";
} else {
// pas une vraie adresse, danger !
$message .= "\n\nadresse de courriel prétendue=$email";
$safefrom = "From: $destinataire"; // défini en dur plus haut
}
//sujet du mail envoyé
$sujet = 'Formulaire de contact';

// On envoi le mail
mail($destinataire, $sujet, $message, $safefrom);

//et on affiche un message de succès d'envoi
header("Location: http://a.dexxxxrope.free.fr/merci.htm");

} else {
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1252">
<title>envoi.php</title>
</head>
<body>
<p> Merci de remplir les champs obligatoires: nom, adresse et email
</p>
</body>
</html>
<?php
} // fin du « if (champs non vides) ... else ... »
?>


Cordialement,
--
Olivier Miakinen
Continuer la lecture sur narkive:
Loading...