[Résolu] PHP 8 et envois de mails : headers cassés

Hello,

J’ai passé plusieurs heures sur un problème technique sur les envois de mails suite à des passages en PHP 8.x. J’ai hésité à en faire un ticket sur le git de SPIP mais au final j’ai l’impression que cela a plus ça place ici, au moins pour éviter que d’autres perdent autant de temps que moi si ce problème vous arrive.

Sur un site SPIP 4.4.x que je venais de passer en PHP 8.x j’ai constaté un souci assez « silencieux » et pernicieux. Les emails partaient bien comme sous PHP 7.4, mais arrivaient avec des entêtes (headers) mal formées. Concrètement, cela brouillait l’affichage de l’expéditeur (« From ») avec d’autres métadonnées, bien que le contenu du mail soit délivré.

Ce problème est spécifique à l’utilisation de la fonction native mail() sous PHP 8 (il est très probable que des librairies comme PHPMailer gèrent cela en interne et ne soient pas affectées).

Le souci vient d’un changement de standard dans PHP 8 concernant la gestion des retours à la ligne dans les entêtes des mails. PHP 8 est devenu beaucoup plus strict et attend des retours chariot spécifiques (\r\n, comme voulu par la RFC à ce sujet)… sauf que SPIP utilise encore des headers avec des retours chariots \n ! Exemple : inc/envoyer_mail.php · 5.x · spip / ecrire · GitLab PHP 8 ne les interprète plus correctement comme des séparateurs d’entêtes, ce qui corrompt le formatage du mail.

Si vous n’arrivez pas à vous endormir ce soir je vous laisse lire les 70 messages de débat étalés sur 3 ans sur ce changement apporté par PHP 8 :

De notre côté nous avons activé une nouvelle directive de configuration introduite justement pour pallier ce cas de figure :
mail.mixed_lf_and_crlf = On

Cette option permet de retrouver le comportement plus tolérant de PHP 7, acceptant à la fois les \n et les \r\n dans les headers sans casser l’envoi.

Nous avons fait des tests avec des envois vers :

Aucun problème à signaler, l’activation ce cette directive semble fonctionner, au moins sur notre infrastructure.

2 « J'aime »

Bonjour @Mathieu_L

Merci pour ce retour documenté.

Je pense que ce bug est passé sous les radars parce que je crois que nous utilisons majoritairement Facteur et un SMTP (ce qui est généralement le seul moyen propre d’avoir une config avec DKIM,SPF, DMARC correcte).

Mais ce que tu relèves est un vrai bug avec une régression du comportement de SPIP en PHP 8.

Je t’invite donc à faire un ticket spécifique et sa piste de résolution \r\n.
Et si tu peux faire une MR… Ce serait merveilleux.

Merci.

Oui je rejoins l’avis de RealEt ca meriterait une MR.

Et donc ça n’est pas un problème de SPIP mais de configuration de PHP cf PHP 8 et envois de mails : sous Linux changer la configuration du php.ini (#104) · Issues · spip / ecrire · GitLab