Projet

Général

Profil

Actions

Anomalie #1629

fermé

Bug envoie courriel avec PHP8.1

Ajouté par Michael Charaoui il y a environ 2 ans. Mis à jour il y a plus d'un an.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
Emails
Version cible:
Début:
19/02/2022
Echéance:
% réalisé:

100%

Temps estimé:
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

Mis à jour par Johan Cwiklinski il y a environ 2 ans

  • Catégorie mis à Emails
  • Statut changé de Nouveau à 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.

Mis à jour par Michael Charaoui il y a environ 2 ans

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

Mis à jour par Michael Charaoui il y a environ 2 ans

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

Mis à jour par Florian Hatat il y a presque 2 ans

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.

Mis à jour par Florian Hatat il y a presque 2 ans

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);
         }

Mis à jour par Florian Hatat il y a presque 2 ans

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.

Mis à jour par Johan Cwiklinski il y a presque 2 ans

  • Statut changé de Commentaire à In Progress
  • Assigné à mis à Johan Cwiklinski
  • Version cible mis à 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.

Mis à jour par Johan Cwiklinski il y a presque 2 ans

  • Statut changé de In Progress à Résolu
  • % réalisé changé de 0 à 100

Mis à jour par Johan Cwiklinski il y a presque 2 ans

  • Statut changé de Résolu à Fermé

Mis à jour par Michael Charaoui il y a plus d'un an

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

Mis à jour par Johan Cwiklinski il y a plus d'un an

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

Formats disponibles : Atom PDF