Project

General

Profile

Actions

Anomalie #1629

closed

Bug envoie courriel avec PHP8.1

Added by Michael Charaoui about 2 years ago. Updated over 1 year ago.

Status:
Fermé
Priority:
Normal
Category:
Emails
Target version:
Start date:
02/19/2022
Due date:
% Done:

100%

Estimated time:
Version utilisée:

Description

Bonjour,
Sur une installation toute nouvelle sur un serveur dédié VPS chez LWS tout neuf j'ai alors installé la galette sur une serveur Apache2.2 + PHP version 8.1.
Toute l'installation se fait correctement mais quand j'ai commencé à m'atteler au paramétrage de celle-ci pour l'envoi des mails je n'arrivais pas à envoyer un mail test aussi bien via la fonction phpmail() que via serveur SMTP
Je me suis gratouillé la tête et été voir dans les logs de la galette pour tomber sur l'erreur:
error sending message: preg_match(): passing null to parameter #2 ($subject) of type string is deprecated
J'ai fais une recherche sur le net et les informations que j'ai cru voir semblent êtres lié à la version de PHP.
J'ai alors remis une version de PHP 7.4 et comme par magie tout fonctionne correctement au niveau de l'envoie de mail.
Il faudrait donc prévoir de mettre à jour la galette afin qu'elle puisse être compatible avec les nouvelles versions de PHP8.x

Actions #1

Updated by Johan Cwiklinski about 2 years ago

  • Category set to Emails
  • Status changed from Nouveau to Commentaire

Salut,

Michael Charaoui a écrit :

error sending message: preg_match(): passing null to parameter #2 ($subject) of type string is deprecated

Il faut la stack complète de l'erreur.

Actions #2

Updated by Michael Charaoui about 2 years ago

Hello,
Ok qu'entends-tu par stack ? Pas l'habitude de faire du bug reporting.
Si tu me dis ce que c'est je le fais ^^
Merci par avance

Actions #3

Updated by Michael Charaoui about 2 years ago

Debian 11 (Bullseye) + ISPConfig 3
Apache
MySQL
PHP de 5 à 8.1
Perl
SSL
SMTP Postfix
POP/IMAP Courrier

Actions #4

Updated by Florian Hatat almost 2 years ago

Bonjour. Je pense avoir le même bug sur une instance PHP 8.1. Le fichier galette.log ne contient absolument aucune autre information que la seule ligne :

error sending message: preg_match(): passing null to parameter #2 ($subject) of type string is deprecated

La suite semble dire que l'appel fautif à preg_match se trouve dans phpmailer (dépendance externe). Je n'ai pas encore réussi à savoir si c'était un bug de phpmailer ou bien s'il est provoqué par Galette qui fait un appel incorrect.

Pour en savoir un peu plus, j'ai ajouté le code suivant en ligne 347 de GaletteMail.php, juste après le premier appel Analog::log("Error sending message"...) :

           Analog::log($e->getTraceAsString(),
                Analog::DEBUG
            );

J'obtiens une trace un peu plus explicite :

XXX.XXX.XXX.XXX - 2022-04-25 14:37:47 - DEBUG - #0 [internal function]: {closure}()
#1 htdocs/vendor/phpmailer/phpmailer/src/PHPMailer.php(3510): preg_match()
#2 htdocs/vendor/phpmailer/phpmailer/src/PHPMailer.php(2784): PHPMailer\PHPMailer\PHPMailer->has8bitChars()
#3 htdocs/vendor/phpmailer/phpmailer/src/PHPMailer.php(1581): PHPMailer\PHPMailer\PHPMailer->createBody()
#4 htdocs/vendor/phpmailer/phpmailer/src/PHPMailer.php(1482): PHPMailer\PHPMailer\PHPMailer->preSend()
#5 htdocs/lib/Galette/Core/GaletteMail.php(320): PHPMailer\PHPMailer\PHPMailer->send()
#6 htdocs/lib/Galette/Controllers/GaletteController.php(416): Galette\Core\GaletteMail->send()
#7 [internal function]: Galette\Controllers\GaletteController->testEmail()
#8 htdocs/vendor/php-di/invoker/src/Invoker.php(74): call_user_func_array()
#9 htdocs/vendor/php-di/slim-bridge/src/ControllerInvoker.php(50): Invoker\Invoker->call()
#10 htdocs/vendor/slim/slim/Slim/Route.php(281): DI\Bridge\Slim\ControllerInvoker->__invoke()
#11 htdocs/lib/Galette/Middleware/Authenticate.php(173): Slim\Route->__invoke()
#12 [internal function]: Galette\Middleware\Authenticate->__invoke()
#13 htdocs/vendor/slim/slim/Slim/DeferredCallable.php(57): call_user_func_array()
#14 [internal function]: Slim\DeferredCallable->__invoke()
#15 htdocs/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(70): call_user_func()
#16 htdocs/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(117): Slim\Route->Slim\{closure}()
#17 htdocs/vendor/slim/slim/Slim/Route.php(268): Slim\Route->callMiddlewareStack()
#18 htdocs/vendor/slim/slim/Slim/App.php(503): Slim\Route->run()
#19 htdocs/vendor/akrabat/rka-slim-session-middleware/RKA/SessionMiddleware.php(47): Slim\App->__invoke()
#20 [internal function]: RKA\SessionMiddleware->__invoke()
#21 htdocs/vendor/slim/slim/Slim/DeferredCallable.php(57): call_user_func_array()
#22 [internal function]: Slim\DeferredCallable->__invoke()
#23 htdocs/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(70): call_user_func()
#24 htdocs/lib/Galette/Middleware/SmartyCsrf.php(94): Slim\App->Slim\{closure}()
#25 [internal function]: Galette\Middleware\SmartyCsrf->__invoke()
#26 htdocs/vendor/slim/slim/Slim/DeferredCallable.php(57): call_user_func_array()
#27 [internal function]: Slim\DeferredCallable->__invoke()
#28 htdocs/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(70): call_user_func()
#29 htdocs/vendor/slim/csrf/src/Guard.php(171): Slim\App->Slim\{closure}()
#30 [internal function]: Slim\Csrf\Guard->__invoke()
#31 htdocs/vendor/slim/slim/Slim/DeferredCallable.php(57): call_user_func_array()
#32 [internal function]: Slim\DeferredCallable->__invoke()
#33 htdocs/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(70): call_user_func()
#34 htdocs/lib/Galette/Middleware/TrailingSlash.php(81): Slim\App->Slim\{closure}()
#35 [internal function]: Galette\Middleware\TrailingSlash->__invoke()
#36 htdocs/vendor/slim/slim/Slim/DeferredCallable.php(57): call_user_func_array()
#37 [internal function]: Slim\DeferredCallable->__invoke()
#38 htdocs/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(70): call_user_func()
#39 htdocs/lib/Galette/Middleware/Language.php(104): Slim\App->Slim\{closure}()
#40 [internal function]: Galette\Middleware\Language->__invoke()
#41 htdocs/vendor/slim/slim/Slim/DeferredCallable.php(57): call_user_func_array()
#42 [internal function]: Slim\DeferredCallable->__invoke()
#43 htdocs/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(70): call_user_func()
#44 htdocs/lib/Galette/Middleware/Telemetry.php(146): Slim\App->Slim\{closure}()
#45 [internal function]: Galette\Middleware\Telemetry->__invoke()
#46 htdocs/vendor/slim/slim/Slim/DeferredCallable.php(57): call_user_func_array()
#47 [internal function]: Slim\DeferredCallable->__invoke()
#48 htdocs/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(70): call_user_func()
#49 htdocs/lib/Galette/Middleware/CheckAcls.php(144): Slim\App->Slim\{closure}()
#50 [internal function]: Galette\Middleware\CheckAcls->__invoke()
#51 htdocs/vendor/slim/slim/Slim/DeferredCallable.php(57): call_user_func_array()
#52 [internal function]: Slim\DeferredCallable->__invoke()
#53 htdocs/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(70): call_user_func()
#54 htdocs/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(117): Slim\App->Slim\{closure}()
#55 htdocs/vendor/slim/slim/Slim/App.php(392): Slim\App->callMiddlewareStack()
#56 htdocs/vendor/slim/slim/Slim/App.php(297): Slim\App->process()
#57 htdocs/includes/main.inc.php(159): Slim\App->run()
#58 htdocs/webroot/index.php(57): require_once('...')
#59 {main}

Le preg_match fautif est dans la méthode has8bitChars de PHPMailer :

    public function has8bitChars($text)
    {
        return (bool) preg_match('/[\x80-\xFF]/', $text);
    }

Ce code est identique au HEAD du dépôt actuel de PHPMailer.

Je vais tenter d'autres tests pour trouver l'origine du bug, mais je suis preneur de conseils pour orienter mes recherches.

Actions #5

Updated by Florian Hatat almost 2 years ago

Je pense avoir progressé. Le patch suivant me permet de ne plus avoir l'erreur (mais une autre, celle-ci probablement due à ma propre configuration SMTP) :

--- "galette-0.9.6.1/galette/lib/Galette/Core/GaletteMail.php"    2021-12-16 06:31:12.000000000 +0100
+++ GaletteMail.php    2022-04-25 17:00:52.000000000 +0200
@@ -259,14 +259,13 @@
             $this->mail->AddReplyTo($this->getSenderAddress());
         }

         if ($this->html) {
             //the email is html :(
             $this->mail->AltBody = $this->cleanedHtml();
             $this->mail->IsHTML(true);
         } else {
             //the email is plaintext :)
-            $this->mail->AltBody = null;
+            $this->mail->AltBody = "";
             $this->mail->IsHTML(false);
         }

Actions #6

Updated by Florian Hatat almost 2 years ago

J'ai réglé mon souci de serveur SMTP et je confirme désormais que, sur mon serveur en PHP 8.1, ce patch permet l'envoi de l'e-mail de test depuis les préférences de Galette, alors que cela ne marchait pas auparavant.

Actions #7

Updated by Johan Cwiklinski almost 2 years ago

  • Status changed from Commentaire to In Progress
  • Assignee set to Johan Cwiklinski
  • Target version set to 1.0.0

Florian Hatat a écrit (#note-5):

Je pense avoir progressé. Le patch suivant me permet de ne plus avoir l'erreur (mais une autre, celle-ci probablement due à ma propre configuration SMTP) :
[...]

Merci pour le patch, la valeur par défaut de altBody dans PHPMailer est effectivement une chaîne vide.

Actions #8

Updated by Johan Cwiklinski almost 2 years ago

  • Status changed from In Progress to Résolu
  • % Done changed from 0 to 100
Actions #9

Updated by Johan Cwiklinski almost 2 years ago

  • Status changed from Résolu to Fermé
Actions #10

Updated by Michael Charaoui over 1 year ago

J'ai appliqué le correctif et effectivement cela permet de faire fonctionner quasiment complètement l'envoie mailing avec serveur PHP (PHP-FPM avec PHP 8.1 sous ISP_Config) sauf pour le cas suivant :
Je créer un nouvel Envoi et laissant interpréter les balises html cochées et je veux mettre une image dans mon email via l'icône image et je choisi un fichier sur mon disque dur que je souhaite inclure dans mon mail.
Je clique sur envoyer une fois l'image mise et j'ai alors le message suivant " Erreur de l’application " qui s'affiche.
Dans le log erreur apache j'ai:

[Tue Nov 29 12:04:54.787046 2022] [proxy_fcgi:error] [pid 82951] [client mon_adresse_ip:50978] AH01071: Got error 'PHP message: Galette error:\nType: PDOException\nCode: 22001\nMessage: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'mailing_body' at row 1\nFile: /var/www/clients/client1/web1/web/gestion/vendor/laminas/laminas-db/src/Adapter/Driver/Pdo/Connection.php\nLine: 376\nTrace: #0 /var/www/clients/client1/web1/web/gestion/vendor/laminas/laminas-db/src/Adapter/Driver/Pdo/Connection.php(376): PDO->query()\n#1 /var/www/clients/client1/web1/web/gestion/vendor/laminas/laminas-db/src/Adapter/Adapter.php(194): Laminas\\Db\\Adapter\\Driver\\Pdo\\Connection->execute()\n#2 /var/www/clients/client1/web1/web/gestion/lib/Galette/Core/Db.php(788): Laminas\\Db\\Adapter\\Adapter->query()\n#3 /var/www/clients/client1/web1/web/gestion/lib/Galette/Core/MailingHistory.php(450): Galette\\Core\\Db->execute()\n#4 /var/www/clients/client1/web1/web/gestion/lib/Galette/Core/MailingHistory.php(340): Galette\\Core\\MailingHistory->store()\n#5 /var/www/clients/client1/web1/web/gestion/lib/Galette/Controllers/Crud/...', referer: https://mon-domaine.fr/gestion/webroot/index.php/mailing?from=18
[Tue Nov 29 12:04:54.787139 2022] [proxy_fcgi:error] [pid 82951] [client mon_adresse_ip:50978] AH01071: Got error 'PHP message: PHP Fatal error: Uncaught Exception: Serialization of 'Closure' is not allowed in [no active file]:0\nStack trace:\n#0 {main}\n thrown in [no active file] on line 0', referrer: https://mon-domaine.fr/gestion/webroot/index.php/mailing?from=18

Par contre le mail part bien avec la pièce jointe mais il ne stock pas l'image dans le dossier attachments (j'ai vérifié les droits, ça ne change rien) et il ne stock pas non plus comme quoi il a envoyé le mail dans la page Envoi de la galette comme si je n'avais pas envoyé de mail.
Si j'envoie en pièce jointe ou sans image tout fonctionne

Actions #11

Updated by Johan Cwiklinski over 1 year ago

Michael Charaoui a écrit (#note-10):

J'ai appliqué le correctif et effectivement cela permet de faire fonctionner quasiment complètement l'envoie mailing avec serveur PHP (PHP-FPM avec PHP 8.1 sous ISP_Config) sauf pour le cas suivant :
Je créer un nouvel Envoi et laissant interpréter les balises html cochées et je veux mettre une image dans mon email via l'icône image et je choisi un fichier sur mon disque dur que je souhaite inclure dans mon mail.
Je clique sur envoyer une fois l'image mise et j'ai alors le message suivant " Erreur de l’application " qui s'affiche.
Dans le log erreur apache j'ai:

[Tue Nov 29 12:04:54.787046 2022] [proxy_fcgi:error] [pid 82951] [client mon_adresse_ip:50978] AH01071: Got error 'PHP message: Galette error:\nType: PDOException\nCode: 22001\nMessage: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'mailing_body' at row 1\nFile: /var/www/clients/client1/web1/web/gestion/vendor/laminas/laminas-db/src/Adapter/Driver/Pdo/Connection.php\nLine: 376\nTrace: #0 /var/www/clients/client1/web1/web/gestion/vendor/laminas/laminas-db/src/Adapter/Driver/Pdo/Connection.php(376): PDO->query()\n#1 /var/www/clients/client1/web1/web/gestion/vendor/laminas/laminas-db/src/Adapter/Adapter.php(194): Laminas\\Db\\Adapter\\Driver\\Pdo\\Connection->execute()\n#2 /var/www/clients/client1/web1/web/gestion/lib/Galette/Core/Db.php(788): Laminas\\Db\\Adapter\\Adapter->query()\n#3 /var/www/clients/client1/web1/web/gestion/lib/Galette/Core/MailingHistory.php(450): Galette\\Core\\Db->execute()\n#4 /var/www/clients/client1/web1/web/gestion/lib/Galette/Core/MailingHistory.php(340): Galette\\Core\\MailingHistory->store()\n#5 /var/www/clients/client1/web1/web/gestion/lib/Galette/Controllers/Crud/...', referer: https://mon-domaine.fr/gestion/webroot/index.php/mailing?from=18
[Tue Nov 29 12:04:54.787139 2022] [proxy_fcgi:error] [pid 82951] [client mon_adresse_ip:50978] AH01071: Got error 'PHP message: PHP Fatal error: Uncaught Exception: Serialization of 'Closure' is not allowed in [no active file]:0\nStack trace:\n#0 {main}\n thrown in [no active file] on line 0', referrer: https://mon-domaine.fr/gestion/webroot/index.php/mailing?from=18

Par contre le mail part bien avec la pièce jointe mais il ne stock pas l'image dans le dossier attachments (j'ai vérifié les droits, ça ne change rien) et il ne stock pas non plus comme quoi il a envoyé le mail dans la page Envoi de la galette comme si je n'avais pas envoyé de mail.
Si j'envoie en pièce jointe ou sans image tout fonctionne

Il s'agit d'un autre bug, merci de bien vouloir ouvrir une issue séparée.

Actions

Also available in: Atom PDF