8778 sujets

Développement web côté serveur, CMS

Pages :
Bonjour,
décidément, le changement d'hébergeur a apporté quelque perturbations sur mon site. Mais je n'ai pas la preuve que c'est ce changement qui en est responsable.
Les messages que j'expédie sur le formulaire du site depuis chez moi n'arrivent pas sur la boîte mail désignée. Il partent bien, sans erreur, mais arrivent nulle part. J'ai tenté sur un mobile, c'est la même chose. Et la boîte mail fonctionne, indépendamment du formulaire.
Je parle bien d'un envoi en ligne, sur le site, pas en local.
Le nouvel hébergement fonctionne avec php 8.3. J'ai tenté de changer pour php 7.3 (les formulaires de mes autres sites sont sur php 7.1 et fonctionnent). Ça n'a rien changé.
Bonsoir, vous utilisez la fonction mail() de PHP? Si oui vérifier le retour de cette fonction qui devrait retourner true. En cas de retour false c'est que certainement la fonction mail() n,'est pas active sur ce nouvel hébergeur.
Sinon préciser la manière dont sont envoyé les mail par PHP.
Voici, dans mon php, ce qui expédie le contenu du formulaire.
Sur trois sites différents, ça a fonctionné jusqu'à présent. Ça ne fonctionne plus uniquement sur le site avec un nouvel hébergeur.
 $retour = mail('nom@domaine.fr', 'Envoi depuis le formulaire', 
$_POST['message'],
$_POST['mailpost'], '');
    if ($retour);       
    }
}

Je vais voir ça plus précisément demain.
Merci
Modérateur
Bonjour,

Le test pourrait-être réduit à :
	if(mail('nom@domaine.fr', 'Envoi depuis le formulaire', 
	$_POST['message'],
	$_POST['mailpost'], '')) {
		echo 'mail envoyé';
	}    
	else {
		echo 'Une erreur est survenue à l\'envoi du mail. ' .error_get_last()['message']; 
	}
}


Ensuite, si l'adresse mail d'envoi utilisée et celle du serveur/hébergement ne correspondent pas , il est possible que ce mail soit automatiquement rejeté par le service de messagerie du destinataire.

Si le serveur est mutualisé, c'est aussi compliqué, le serveur de messagerie peut-être déjà blacklisté à cause d'autres utilisateurs qui par le passé en ont fait un mauvais usage.

PHPMailer et une boite mail bien configurée (serveur de messagerie) peut éviter ce genre de mauvaises surprises et à montrer patte blanche. https://github.com/PHPMailer/PHPMailer

La fonction mail() , même si disponible, n'est pas fiable (peut aussi être bridée par l'hebergeur) et a la base il faut au moins utiliser une adresse mail correspondant au nom de domaine pour espérer voir les mails atteindre leurs destinations, au moins pire, on les retrouveras dans les spams.

Si ces mails te sont destinés, il peut aussi être judicieux d'en faire une copie sur le site . Par exemple en les reformatant dans un fill RSS privé.

Cdt

edit
Quel est ce nouveau hebergeur qui te fait des miséres Smiley smile ?

Peut-être as tu encore quelques petites choses à configurées comme https://www.cloudflare.com/fr-fr/learning/email-security/dmarc-dkim-spf/ par exemples Smiley cligne
Modifié par gcyrillus (19 Jan 2025 - 13:16)
Bonjour,
je n’avais donné que la partie d’expédition du formulaire, mais echo et else pour vérifier l’envoi du message sont bien présents dans mon code. Ils sont juste un peu plus haut sur la page. Echo retourne bien le message "Votre message a été transmis", texte que j’ai écrit moi-même. Mais ce message arrive nulle part, même pas dans les spams.
D’autre part, bien sûr que je suis sur le même domaine que l’hébergement. C’est une précaution indispensable.
Je vais les contacter, afin d’avoir des précisions et savoir s’ils n’ont pas bridé La fonction couriel.
J’attends leur réponse, dès lundi.
Ce nouvel hébergeur se nomme Eazy-Hebergement. J’étais d’ailleurs chez eux il y a deux ans. J’avais changé parce que leur mutualisé n’était pas en SSL. C’est maintenant chose faite. Je suis aussi mal tombé, ils l’avouent eux-même, ils sont sur une grosse mise à jour de leurs serveurs et nous demandent d’être patient sur les éventuels problèmes.
Peut-être que le problème vient de là.
Précision : L'hébergeur a son propre service de messagerie "Vous pouvez également consulter vos mails depuis l'interface suivante : https://webmail.easy-hebergement.net/mail-b"
Je l'ai consulté, les envois du formulaire ne sont pas là non plus.
Modifié par Bongota (19 Jan 2025 - 14:02)
Voilà l’'explication (le service d’aide travaille le dimanche?!)
------------
La fonction native phpmail utilisant des mails non authentifiés n’est plus active depuis mi-2022.
Elle servait surtout à des spammers faisant de l’usurpation d’identité...
Pour luter contre le spam et des activités de phishing, nous avons été contraints de désactiver cette fonction sur nos serveurs.
Afin d’envoyer des emails depuis vos scripts php, il est nécessaire de s’authentifier auprès d’un serveur SMTP avec un compte courriel valide (easy-hebergement par exemple).
L’utilisation de mails authentifiés nous permet d’améliorer le niveau global de sécurité lié à nos hébergements, de lutter contre le spam et le piratage.
Un exemple de mise en œuvre dans notre FAQ?:
https://www.easy-hebergement.fr/foire-aux-questions/envoyer-des-mails-authentifies
------------
Il me reste donc à mettre ça en place.
ps : Je viens de télécharger PHPMailer. Dans le code php, je vois ça :
$courriel->Host = "smtp.domaine.fr"; /OK
    $courriel->Port = 587; /OK
    $courriel->Username = "nom.nomdefamille@domaine.fr"; /OK
    $courriel->Password = "motdepasse4321"; /Mais ici ?

Quel est ce mot de passe qu'il faut donner ici ? Celui du mail ? Je n'avais jamais vu ça sur un script php.
Modifié par Bongota (19 Jan 2025 - 16:09)
Modérateur
Bonjour
a écrit :
Quel est ce mot de passe qu'il faut donner ici ? Celui du mail ? Je n'avais jamais vu ça sur un script php.

C'est effectivement ton mot de passe de messagerie. PHPMailer utilise ta messagerie et les infos à passer sont les mêmes que que celle que tu utiliserais avec un logiciel de messagerie pour configurer une boite mail. C'est ta messagerie qui envoi le mail, pas ton script qui lui ne transmet que les infos nécessaires.

cdt
Modifié par gcyrillus (20 Jan 2025 - 09:16)
Je me bats avec PHPMailer et j'ai cette erreur, lorsque je lance un message sur le formulaire
Parse error: syntax error, unexpected 'use' (T_USE) in /public_html/mail.php on line 85

Une partie du code. La ligne 85 concerne justement le "use".

//Importer les classes PHPMailer dans l'espace de noms global 
//Celles-ci doivent être en haut de votre script, pas à l'intérieur d'une fonction 
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require_once "vendor/autoload.php";
Modérateur
Bonsoir,

c'est probablement du à une typo précédent cette ligne. un point virgule manquant ou autre portion de code mal fermé/terminé. Tu devrais le percevoir dans ton éditeur .

cdt
Bonjour,
rien à faire, j’ai passé le script sur un test en ligne (plusieurs même). Le test me signale pas l’erreur éventuelle dont tu parles, une virgule ou une accolade manquante, mais une erreur sur les adresses données sur use.
Je n’ai jamais mis en place PHPMailer et, hormis les champs serveur, courriel et mot de passe, je ne sais pas quoi remplir ailleurs. Voici le code complet (j’ai modifié le passe et l’adresse).
<?php
require_once(‘phpmailer/PHPMailerAutoload.php’);
$courriel = new PHPMailer;

//Importer les classes PHPMailer dans l’espace de noms global 
//Celles-ci doivent être en haut de votre script, pas à l’intérieur d’une fonction 
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require_once "vendor/autoload.php";
//Le chargeur automatique de Load Composer 
require 'vendor/autoload.php’;
//Créer une instance ; passer `true` active les exceptions 
$courriel = new PHPMailer(true);
try {
    //Paramètres du serveur
    $courriel->SMTPDebug = SMTP???::DEBUG_SERVER;                      // Activer la sortie de débogage détaillée
    $courriel->isSMTP();                                            // Envoi via SMTP
    $courriel->Host       = 'courriel-b.easy-hebergement.net’;                     //Définir le serveur SMTP pour envoyer via
    $courriel->SMTPAuth   = true;                                   //Activer l’authentification SMTP 
    $courriel->Username   = 'mon_adresse_mail_chez_l’hébergeur’;                     //nom d’utilisateur SMTP 
    $courriel->Password   = 'le_pass_du_mail’;                               // Mot de passe SMTP
    $courriel->SMTPSecure = PHPMailer???::ENCRYPTION_SMTPS;            //Activer le chiffrement TLS implicite 
    $courriel->Port       = 993;                                    //Port TCP auquel se connecter ; utilisez 587 si vous avez défini `SMTPSecure = PHPMailer???::ENCRYPTION_STARTTLS` (993, c’est celui de l’hébergeur)

    //Destinataires
    $courriel->setFrom('from@example.com’, 'Mailer’);
    $courriel->addAddress('Une adresse courriel ici’, 'il’);     //Ajouter un destinataire
    $courriel->addAddress('japheth@example.com’);               //Le nom est facultatif
    $courriel->addReplyTo('info@example.com’, 'Information’);
    $courriel->addCC('cc@example.com’);
    $courriel->addBCC('bcc@example.com’);

     //Pièces jointes 
    $courriel->addAttachment('/var/tmp/file.tar.gz’);         //Ajouter des pièces jointes
    $courriel->addAttachment('/tmp/image.jpg’, 'new.jpg’);    //Le nom est facultatif

    //Contenu
    $courriel->isHTML(true);                                  // Définissez le format de l’adresse électronique sur HTML
    $courriel->Subject = 'Sujet’;
    $courriel->Body    = 'Ceci est le corps du message HTML <b>en gras???!</b>';
    $courriel->AltBody = 'Ceci est le corps en texte brut pour les clients de messagerie non-HTML’;

    $courriel->send();
    echo 'Votre message a bien été envoyé';
} catch (Exception $e) {
    echo "Votre message n’a pas pu être envoyé. Erreur Mailer???: {$courriel->ErrorInfo}";
}}
?>

Pour le moment, c’est en haut du scrip que les erreurs arrivent.
Modifié par Bongota (25 Jan 2025 - 20:49)
Bonjour,
Pour la ligne du require tu commence la string par un cote simple (') et tu la ferme avec une apostrophe (’). Cela ne peut fonctionner ainsi, utilise le même caractère pour définir le début et la fin d'une chaine de caractère.
Ceci dit, pourquoi faire un require de ce qui est déjà requis la ligne juste au dessus avec un require_once()???
Supprime le require que tu as ajouté.

Pour ma part je me demande si tu as bien les class PHPMailer, SMTP, et Exeption qui sont requisses et doivent être dans un répertoire précis.
Quel est la hiérarchie des tes fichiers? (y compris la présence du répertoire vendor)
Je vois tout ça et te donne la hiérarchie de mes fichiers demain dimanche. Je suis justement un peu perdu de ce côté, étant donné que c'est la première fois que je mets ce code en place.
Étrange, les cotes. J'ai copié le code ailleurs, je n'ai pas changé ces accents.
Modérateur
Bonsoir,

idem que casper2 pour les quotes ou apostrophes bizarre que l'on voit dans ton script, qui ne vont pas tous par paires non plus .
Les premières choses à corriger seraiten par exemple de reprendre ce script pour que tous soient ouverts et fermés ainsi que d'autres bizarreries et surtout ne plus tenter de traduire un script avec google translate ou autre outil en ligne ou copier/coller un script depuis une page traduite automatiquement
<?php
	require_once('phpmailer/PHPMailerAutoload.php');
	//$courriel = new PHPMailer;
	
	//Importer les classes PHPMailer dans l’espace de noms global 
	//Celles-ci doivent être en haut de votre script, pas à l’intérieur d’une fonction 
	use PHPMailer\PHPMailer\PHPMailer;
	use PHPMailer\PHPMailer\SMTP;
	use PHPMailer\PHPMailer\Exception;
	
	//Le chargeur automatique de Load Composer 
	require_once "vendor/autoload.php";

	//Créer une instance ; passer `true` active les exceptions 
	$courriel = new PHPMailer(true);
	try {
		//Paramètres du serveur
		$courriel->SMTPDebug = SMTP::DEBUG_SERVER;                      // Activer la sortie de débogage détaillée
		$courriel->isSMTP();                                            // Envoi via SMTP
		$courriel->Host       = 'courriel-b.easy-hebergement.net';                     //Définir le serveur SMTP pour envoyer via
		$courriel->SMTPAuth   = true;                                   //Activer l’authentification SMTP 
		$courriel->Username   = 'mon_adresse_mail_chez_l’hébergeur';                     //nom d’utilisateur SMTP 
		$courriel->Password   = 'le_pass_du_mail';                               // Mot de passe SMTP
		$courriel->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;            //Activer le chiffrement TLS implicite 
		$courriel->Port       = 993;                                    //Port TCP auquel se connecter ; utilisez 587 si vous avez défini `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS` (993, c’est celui de l’hébergeur)
		
		//Destinataires
		$courriel->setFrom('from@example.com', 'Mailer');
		$courriel->addAddress('Une adresse courriel ici', 'il');     //Ajouter un destinataire
		$courriel->addAddress('japheth@example.com');               //Le nom est facultatif
		$courriel->addReplyTo('info@example.com', 'Information');
		$courriel->addCC('cc@example.com');
		$courriel->addBCC('bcc@example.com');
		
		//Pièces jointes 
		$courriel->addAttachment('/var/tmp/file.tar.gz');         //Ajouter des pièces jointes
		$courriel->addAttachment('/tmp/image.jpg', 'new.jpg');    //Le nom est facultatif
		
		//Contenu
		$courriel->isHTML(true);                                  // Définissez le format de l’adresse électronique sur HTML
		$courriel->Subject = 'Sujet';
		$courriel->Body    = 'Ceci est le corps du message HTML <b>en gras???!</b>';
		$courriel->AltBody = 'Ceci est le corps en texte brut pour les clients de messagerie non-HTML';
		
		$courriel->send();
		echo 'Votre message a bien été envoyé';
	}
	catch (Exception $e) {
		echo "Votre message n’a pas pu être envoyé. Erreur : {$courriel->ErrorInfo}";
	}
?>


Sinon, reprendre le script d'origine et traduire les commentaires et textes un à un et réajuster le nom des variables une à une.

Cdt
Modifié par gcyrillus (26 Jan 2025 - 07:42)
Bonsoir, je vois déjà un problème l'usage de
$courriel = new PHPMailer;

avant la déclaration de la class PHPMailer!!!
Je recommande la suppression de cette ligne puisque la variable $courriel est définie plusieurs lignes plus bas.
Bonjour,

voici mon aborescnece. Je l'ai installé à la main, en le décompressant. Peut-être qu'il manque quelque chose. Il est conseillé d'installer avec composer, mais ça n'a pas fonctionné.
À la racine de mon site, il y a un répertoire qui se nomme PHPMailer. À l'intérieur de ce répertoire, il y a six fichiers : .ediroconfig, COMMITMENT, composer.jsan, get_oauth_token.php, LICENCE, README.md, SECURITY.md, VERSION.
Il y a aussi deux répertoires : src et mlanguage. Dans src, il y a DNSConfigurator.php, Excpetion.php, OAuth.php, OAuthTokenProvider.php, PHPMailer.php, POP3.php, SMTP.php. Dans language, il y a de très nombreux fichiers sur les langues.
upload/1737882084-67790-phpmailer.png
upload/1737882178-67790-php-dns.png

Enfin, et c'est peut-être là que ça coince aussi, le script php de l'envoi du formulaire, celui que j'ai donné plus haut, porte le nom de mon ancien script php d'avant "mail.php". J'ai bien sûr enlevé la partie originale de l'expédition du mail pour la remplacer par le nouveau script. Comme j'ai compris, il faut pouvoir atteindre certains fichiers inclus dans le dossier PHPMail et les chemins me semblent pas corrects. C'est de ce côté que je ne comprens pas.
Pour les cotes, je n'ai rien traduit, j'ai pris sur le net comme c'était.
Bonjour,
>> Il est conseillé d'installer avec composer, mais ça n'a pas fonctionné.
Exact, c'est ce qui est plus facile à utiliser. Composer (que vous pouvez obtenir via https://getcomposer.org/ ) est un gestionnaire de dépandance, l'équivalent en PHP de npm en JavaScript. Il n'est pas certain que vous disposiez de composer sur votre hébergement ( voir si il y a de la documentation la dessus en vous connectant à votre espace client) si bien qu'il existe une autre méthode pour l'utilisation.

>> Peut-être qu'il manque quelque chose.
Oui, comme je le pensais vous n’appelez pas les class nécessaire pour l'utilisation de cette librairie. La procédure est décrite dans le readme sur le github du projet dans la partie installation.
Voir => https://github.com/PHPMailer/PHPMailer?tab=readme-ov-file#installation--loading
La ligne suivante :
//Load Composer's autoloader
require 'vendor/autoload.php';

est à utiliser dans le cas de l'usage de composer, autoload.php à la responsabilité de charger les class de façon automatisée et ce quel qu'elle soit et quel soit le nombre.
Comme vous n'utilisez apparemment pas composer sur le serveur distant, commenter cette ligne et remplacer par un appel des fichiers nécessaire grâce à un require suivit du chemin exact de l'emplacement des class.

>> porte le nom de mon ancien script php d'avant "mail.php"
Normalement le nom du fichier qui contient l'appel à la librairie importe peu (sauf configuration spécifique du serveur d’hébergement, mais j'en doute fort).
Le chemin des fichiers nécessaires à la librairie est lui capital pour le fonctionnement de celle-ci.
N’hésitez pas à lire et relire le fichier readme.md il contient toutes les informations d'utilisation.
J’ai changé toutes les cote afin de les harmoniser. J’ai supprimé ce qui devait l’être, suivants vos conseils.
J’ai ajouté require afin de charger les trois class manquantes. Une question, je suppose que le chemin à donner dans require est celui sur mon espace chez l’hébergeur. Chez eux, mon site est à leur racine /. Donc, normalement sans le / puisque c’est un chemin absolu. Voici ce qui est indiqué sur la doc de Gitub
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/to/PHPMailer/src/Exception.php'; /Sur ces trois lignes, j'ai mis le chemin direct du dossier PHPMailer à la racine chez mon hébergeur. C'est bon ?
require 'path/to/PHPMailer/src/PHPMailer.php;
require 'path/to/PHPMailer/src/SMTP.php';

Mais j’ai toujours Parse error?: syntax error, unexpected token "use" in /public_html/courriel.php on line 88
Modifié par Bongota (26 Jan 2025 - 15:21)
Modérateur
Sans vouloir apporter de la confusion et si tu as seulement dézipper les fichier depuis l'archive github tu ne devrais n'avoir besoin que du dossier src dans lequel se trouvent les différentes class que PHPMailer peut utilisé et le dossier language si tu souhaite une autre langue que l'anglais.

Il te faut alors charger les class dont tu as besoin qui se trouvent dans le dossier src
Par exemple

Si tu prend l'exemple simple sur github https://github.com/PHPMailer/PHPMailer/tree/master?tab=readme-ov-file#a-simple-example

il te faut ajouter en debut du code de l'exemple
	
// debut fichier  php 
	require_once 'src/PHPmailer.php';	
	require_once 'src/SMTP.php';	
	require_once 'src/Exception.php';

(chemin à partir du script vers le dossier et fichiers à charger)
Prévoir aussi les dossiers tmp et fichier que le script utilise pour l'exemple des pièces jointes.

L'exemple suivant servirait à changer la langue par défaut
//To load the French version
$mail->setLanguage('fr', 'language/');

depuis une structure ressemblant à

scriptMail.php
src/
language/

Modifié par gcyrillus (26 Jan 2025 - 15:20)
On vient de croiser nos posts !!!
C'est donc fait comme tu le préconise, mais toujours l'erreur signalée plus haut.
Je vois que tu utilises require_once à la place de require seul ?
Modérateur
Bongota a écrit :
On vient de croiser nos posts !!!
C'est donc fait comme tu le préconise, mais toujours l'erreur signalée plus haut.
Je vois que tu utilises require_once à la place de require seul ?


Pas tout a fait, tu dois charger les fichier et class en amont, une fois charger, use ne provoqueras plus d'erreur car les noms d'espaces et class seront disponibles Smiley cligne ,

Pour le require_once ça mange pas de pain Smiley cligne
Modifié par gcyrillus (26 Jan 2025 - 15:30)