PHPMailer récalcitrant

Avatar du membre
Eléphanteau du PHP | 30 Messages

26 janv. 2017, 14:24

Bonjour,

Je vous écris parce que je ne parviens pas à envoyer des mails en local.

Je suis en Linux, sous Xubuntu 16.04.
J'ai installé PHPMailer 5.2 avec composer, et mon composer.json est composé de ces lignes :

Code : Tout sélectionner

{     "require": {         "phpmailer/phpmailer": "^5.2"     } }
Mon code autoload_psr4 comprend ces lignes :

Code : Tout sélectionner

<?php // autoload_psr4.php @generated by Composer $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( );  
La partie de code où j'appelle PHPMailer au sein de mon app est le suivant :

Code : Tout sélectionner

if ($reponse['mode_reponse'] == "par_mail") {         require 'vendor/phpmailer/phpmailer/PHPMailerAutoload.php';         // require __DIR__.'/vendor/autoload.php';         $mail = new PHPMailer();         $mail->setFrom('noreply@[mail.com]', 'Entreprise');         $mail->addAddress($email, $user);         $mail->isHTML(true);  // Set email format to HTML         $mail->Subject = 'Votre question sur entreprise';         $mail->Body    = $msg_courtoisie;         $mail->addAttachment('img/entreprise.png');         if(!$mail->Send()) {             echo 'Le message n\'a pas été envoyé.';             echo 'Mailer Error: ' . $mail->ErrorInfo;         } else {             header("Location: question_sent.php");             exit;         } }  
Le chemin qui mène à mon Autoloader est OK.

J'ai vérifié mon fichier error.log, je pouvais y lire : sh: 1: /usr/sbin/sendmail: not found

J'ai donc installé sendmail à coups de sudo apt-get update + sudo apt-get install sendmail, mais rien n'y fait : le script s'exécute sans spécifier la moindre erreur, mais je ne reçois aucun des mails que je me destine.

Avez-vous une idée de piste de solution, svp ?
D'avance, merci pour votre aide ! :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

26 janv. 2017, 15:32

salut,

est ce que php est configuré avec error_reporting = E_ALL ? (+display_error = On)

si tu utilise un chargement automatique tu n'as pas besoin d'inclure ton fichier (donc la ligne avec le require est inutile voir peut provoquer une erreur avec l'autoload.
Ton fichier autoload est, pour ainsi dire, vide. Il manque plein de chose il ne doit donc pas fonctionner :-) (ce qui explique le require).

As-tu configuré php pour utiliser sendmail ?

@+
Il en faut peu pour être heureux ......

Avatar du membre
Eléphanteau du PHP | 30 Messages

26 janv. 2017, 16:52

Merci pour ta réponse rapide, Moogli.

Pour répondre à tes questions :
Mon php.ini comprend la ligne

error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
(pas seulement E_ALL : bien ou pas?)

Display_error était mis à off, mais j'avais un ini_set('display_errors', 1); au sommet mon fichier php. Quoi qu'il en soit, j'ai remis le display_error à on en local dans le php.ini, ça me paraît plus prudent, ça m'évitera d'oublier un ini_set lors de la mise en prod de mon app.

Autoload : Je ne charge rien automatiquement depuis mon application, donc le require me semble nécessaire ?
Si je le commente, j'obtiens l'erreur :
Fatal error: Uncaught Error: Class 'PHPMailer' not found in /var/www/html/app/question_add.php on line 106
( ! ) Error: Class 'PHPMailer' not found in /var/www/html/app/question_add.php on line 106

Pour ce qui est de la configuration de sendmail, j'avoue ne pas avoir fait ça très souvent...
J'ai mis en application ce tuto : http://lukepeters.me/blog/getting-the-p ... -on-ubuntu
- en vain -
pour php.ini, j'ai remplacé smtp = localhost par smtp = smtp.monhebergeur.com
- en vain -.

"Mais sans doute dois-je adapter la ligne liée à Unix comme je suis sous Linux", ai-je pensé...
Du coup j'ai adapté la ligne pour unix comme suit :
sendmail_path = "/usr/sbin/sendmail -t -i"

... en vain (= toujours pas de mail dans ma boîte de réception, spams y compris)

Voici la partie mail de mon fichier php.ini :

Code : Tout sélectionner

[mail function] ; For Win32 only. ; http://php.net/smtp SMTP = localhost ; SMTP = smtp.infomaniak.com ; http://php.net/smtp-port smtp_port = 25 ; For Win32 only. ; http://php.net/sendmail-from ;sendmail_from = [email protected] ; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). ; http://php.net/sendmail-path sendmail_path = "/usr/sbin/sendmail -t -i" ; Force the addition of the specified parameters to be passed as extra parameters ; to the sendmail binary. These parameters will always replace the value of ; the 5th parameter to mail(). ;mail.force_extra_parameters = ; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename mail.add_x_header = On ; The path to a log file that will log all mail() calls. Log entries include ; the full path of the script, line number, To address and headers. ;mail.log = ; Log mail to syslog (Event Log on Windows). ;mail.log = syslog
Qu'en dites-vous ?
Ai-je oublié quelque chose ? :|

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

26 janv. 2017, 17:45

error_reporting la partie & ~E_DEPRECATED & ~E_STRICT supprime les notifications des choses dépréciée et les avertissements pour utilisation de variable ou index qui n'existe pas (ce qui pourrait être le cas dans ton code.

le reste semble correct, il faudrait récuprer les log php et sendmail et voir ce qu'il se passe au niveau http.
as tu redémarré ton serveur web (ou phpfpm) depuis les modif de conf ?

@+
Il en faut peu pour être heureux ......

Avatar du membre
Eléphanteau du PHP | 30 Messages

26 janv. 2017, 18:01

J'ai donc mis l'error_reporting à error_reporting = E_ALL
J'ai reredémarré apache (sudo service apache2 restart)
Je me suis renvoyé un mail via mon app.
Et pas de mail.

Error.log me raconte ceci après envoi du formulaire :

[Thu Jan 26 16:59:48.789718 2017] [mpm_prefork:notice] [pid 17199] AH00169: caught SIGTERM, shutting down
[Thu Jan 26 16:59:49.912830 2017] [mpm_prefork:notice] [pid 17284] AH00163: Apache/2.4.18 (Ubuntu) configured -- resuming normal operations
[Thu Jan 26 16:59:49.912872 2017] [core:notice] [pid 17284] AH00094: Command line: '/usr/sbin/apache2'

les logs php et sendmail spécifiquement, je les récupère comment :oops: ?