8725 sujets

Développement web côté serveur, CMS

Bonsoir à vous,

j'utilise la fonction mail() du PHP pour envoyer un mail.

L'envoi du mail se passe bien mais le format du mail n'est pas tout à fait correct. Par exemple, les paramètres dans l'URL subissent des modifications.


$link = "http://monsiteweb.fr/user/activation.php?id=" . $user_id . '&e=' . $email . '&ssl=' . $encrypted_pass;
 
$message = '';
$message = '<!DOCTYPE html>';
$message .= '<html>';
$message .= '   <head>';
$message .= '       <meta charset=&quot;UTF-8&quot; />';
$message .= '   </head>';
$message .= '   <body>';
$message .= '       Bienvenue,<br /><br />';
$message .= '       <h2>Il ne vous reste que cette dernière étape pour activer votre compte !</h2>';
$message .= '       <p>';
$message .= '           Pour ce faire, il vous suffit de cliquer sur le lien suivant :<br /><br />';
$message .= '           <a href=&quot;' . $link . '&quot;>' . $link . '</a><br />';
$message .= '   </body>';
$message .= '</html>';
 
$headers = "";
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=UTF-8" . "\r\n";
$headers .= "Content-Transfer-Encoding: quoted-printable" . "\r\n";
 
// More headers
$headers .= "From: " . $from . "\r\n";
 
if (!mail($to, $subject, $message, $headers))
{
  $mail_status = "Erreur lors de l'envoi du mail !!!";
}


Quand je regarde le contenu du mail, il est affiché ceci :

http://monsiteweb.fr/user/activation.php?id?&e?245215@hotmail.be&ssl248748d218d9f6257c5407b9887e9f74a1ec8f70d746a6a4a4050730b736c00

alors que j'aurais dû avoir ceci :

http://monsiteweb.fr/user/activation.php??id=88&e=fc245215@hotmail.be&ssl=248748d218d9f6257c5407b9887e9f74a1ec8f70d746a6a4a4050730b736c00

Avez-vous une idée de la raison pour laquelle le corps de mon message est modifié ?

Merci d'avance.

Bonne soirée,

Thierry
Salut,

ça ressemble à un problème d'encodage Smiley ohwell

ça fait quoi ce header ? (je m'attarde sur celui la car il contient "Encoding" )

$headers .= "Content-Transfer-Encoding: quoted-printable" . "\r\n";


Je dirais que soit il faut autre chose (peut être rien et juste supprimer la ligne ?), soit il faut faire quelque chose de plus pour traiter les infos à partir de ce encoding la)

Bon courage
Modérateur
Bonjour,

La première chose à faire est de vérifier si $link contient bien ce que tu attends. Est-ce que tu l'as vérifié ?

Amicalement,
Bonjour à vous,

en effet, la variable $link contient bien la valeur que je m'attends à imprimer dans le mail c'est-à-dire :

http://monsiteweb.fr/user/activation.php?id=88&e=fc245215@hotmail.be&ssl=248748d218d9f6257c5407b9887e9f74a1ec8f70d746a6a4a4050730b736c00

mais je vois ceci :

http://monsiteweb.fr/user/activation.php?id?&e?245215@hotmail.be&ssl248748d218d9f6257c5407b9887e9f74a1ec8f70d746a6a4a4050730b736c00

Edit par parsimonhi: j'ai retiré les colorisations. Ça semble ne pas marcher comme attendu à l'intérieur d'un lien.

Merci d'avance.

Bonne journée,
Thierry
Modifié par parsimonhi (11 Mar 2022 - 14:10)
Modérateur
Bonjour,

Je suis d'accord avec Mathieuu, c'est probablement le Content-Transfer-Encoding: quoted-printable qui fait cette transformation inattendue. En effet, un "=" dans le texte d'origine signifie alors le début d'un encodage. En conséquence, tous les "=" de ton lien ne sont pas compris comme des "=", mais comme le début de caractères encodés. Et comme ce qui suit tes "=" dans le texte initial ne correspond pas à un encodage valide, il remplace ces "=" et ce qui les suit par des "?".

Remplace tes "=" par "=3D" dans $link. Peut-être que ça marchera.

EDIT: pourquoi veux-tu utiliser Content-Transfer-Encoding: quoted-printable?

Amicalement,
Modifié par parsimonhi (11 Mar 2022 - 14:37)
Bonjour Mathieuu et Parsimonhi,

tout d'abord, je tenais à vous remercier pour votre réponse à mon message.

J'ai modifié le code et maintenant, ça a l'air de fonctionner :


    $message = base64_encode($message);

    $headers = "";
    $headers = "MIME-Version: 1.0" . "\r\n";
    $headers .= "Content-type: text/html; charset=UTF-8" . "\r\n";
    $headers .= "Content-Transfer-Encoding: base64" . "\r\n";

    // More headers
    $headers .= "From: " . $from . "\r\n";

    if (!mail($to, $subject, $message, $headers))
    {
        $mail_status = "Erreur lors de l'envoi du mail !!!";
    }


J'ai dû utiliser la fonction "base64_encode" pour résoudre ce problème.

Maintenant, le lien s'affiche correctement dans le corps du message.

Par contre, j'ai encore 2 choses bizarres mais c'est moins grave :

1) le lien n'est pas cliquable directement à partir du mail. Il faut faire un copy/paste dans une nouvelle fenêtre afin de pouvoir l'exécuter.
2) l'affichage du mail ne prend pas en compte les tags HTML comme <p>, <h2>, ...

Encore merci pour votre aide et bonne journée à vous.

Thierry
Modérateur
Bonjour,

Dans ton php, tu mets href=&quot;' . $link . '&quot;. Si tu mets " au lieu de &quot;, il se passe quoi ?

Amicalement,
Meilleure solution
Smiley hum je ne comprends pas l’intérêt de faire un encodage en base 64 juste pour pouvoir lui dire que c'est encodé en base 64 Smiley ohwell

Tu ne peux pas juste supprimer ces 2 lignes ? :

$message = base64_encode($message);
$headers .= "Content-Transfer-Encoding: base64" . "\r\n";
Bonjour Mathieuu,

si je supprime ces 2 lignes, le lien n'est plus bon et les paramètres ne sont pas bien encodés.

De plus, dans le résumé du mail, il est mis "No message preview" et l'affichage du contenu ne fonctionne pas. Il affiche les tags HTML plutôt que de les "exécuter".

Ce qui est bizarre, c'est que j'ai été obligé de modifié le code PHP pour l'envoi d'un mail chez o2switch alors que ça fonctionnait avec le code précédent chez OVH.

Donc, je me demande s'il n'y a pas quelque chose à configurer chez l'hébergeur.

Merci d'avance.

Bonne journée,
Thierry
Bonjour parsimonhi,

en effet, j'ai fait votre test et j'ai enlevé le "&quot;" du contenu du lien de la variable $link et maintenant, je sais cliquer sur le lien se trouvant dans le mail.

Par contre, j'ai encore 2 choses bizarres mais c'est moins grave :

1) le lien n'est pas cliquable directement à partir du mail. Il faut faire un copy/paste dans une nouvelle fenêtre afin de pouvoir l'exécuter.
2) l'affichage du mail ne prend pas en compte les tags HTML comme <p>, <h2>, ...

Encore merci pour votre aide et bonne journée à vous.

Thierry