Envoi d'un mail avec pièces jointes en PHP

Sudiste
Invité n'ayant pas de compte PHPfrance

12 déc. 2018, 12:00

Bonjour,

Eh bien j'aimerai pouvoir te fournir des logs d'erreurs, mais aucune n'est construite, je suis allé voir dans les logs d'OVH mais aucune log d'erreur n'apparait cliquable.

Image

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

12 déc. 2018, 23:52

Vu que tu es chez OVH, essaye de passer ton hébergement en mode développement.
https://docs.ovh.com/fr/hosting/configu ... ovhconfig/

Code : Tout sélectionner

environment=development
Quand tout le reste a échoué, lisez le mode d'emploi...

Sudiste
Invité n'ayant pas de compte PHPfrance

31 déc. 2018, 09:51

Bonjour!

J'espère que vous passez de bonnes fêtes! Désolé de l'absence, le taff me surmenait, j'avais pas le temps de passer du temps sur le PHP et du coup ça m'était sorti de la tête.

J'ai passé mon serveur en environnement de développement.
Il m'a d'abord affiché :
"Parse error: syntax error, unexpected '$demande' (T_VARIABLE) in /[...]/www/contactform.php on line 62"

Il manquait en effet un . dans mon code. Problème réglé, j'ai mis le point à sa place mais retour à la case départ, page vide et blanche et rien ne se passe. La page ne me renvoit pas sur mon site et je ne reçoit pas d'e-mail.

Si je n'ai plus de message d'erreur c'est qu'il n'y en a pas, mais il doit bien y avoir un problème dans mon code :|

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

01 janv. 2019, 22:51

Fais des var_dump() de tes variables là où tu penses que cela est nécessaire pour vérifier que tes variables ont les valeurs attendues et trouver à quel moment ton code ne s'exécute pas correctement.

Si tu as toujours une page blanche après avoir mis des var_dump(), c'est qu'il reste des erreurs peut être masquées par ton hébergeur.
Cf tuto ici : faq-tutoriels/page-blanche-script-php-c ... 73178.html
Quand tout le reste a échoué, lisez le mode d'emploi...

Sudiste
Invité n'ayant pas de compte PHPfrance

02 janv. 2019, 09:46

Bonjour, bonne année!

J'ai essayé d'installer quelques var_dump dans mon code mais mon hébergement ne me permet pas d'accéder à la console du serveur donc impossible pour moi de voir ce qu'il m'affichent, est-ce qu'il existe un moyen de voir cette console quand même?

J'utilise Firefox et la console de Firefox ne m'affiche rien de plus

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

02 janv. 2019, 10:37

Pas besoin d'accéder à la ligne de commande sur ton serveur pour faire du débugage.

Mets des var_dump() régulièrement dans ton code et trouve à quel moment ça ne se passe pas comme prévu
Quand tout le reste a échoué, lisez le mode d'emploi...

Sudiste
Invité n'ayant pas de compte PHPfrance

07 janv. 2019, 10:11

Alors j'ai du nouveau.

Le problème à tout cela était le fait que j'avais placé tout mon code dans une fonction "ajax()", et comme je n'ai JAMAIS fais appel à cette fonction, mon code ne s'est tout simplement jamais lu, bravo Sudiste! =D> =D>

Du coup les e-mails s'envoient parfaitement (excepté le faire que les accents s'affiche de la manière suivante "egrave;" mais je trouverais bien un moyen de régler ça).
Cependant les pièces jointes ne s'ajoutent pas au mail, je reposte ici le bout de code qui s'occupe des pièces jointes, si jamais vous trouvez une erreur merci de me le signaler, sachant que j'ai juste récupérer ce morceau de code depuis le tuto que j'ai cité au tout début du poste.

Code : Tout sélectionner

for($i = 1; $i < 3; $i++) { $fichier = "att".$i; if(isset($_FILES[$fichier]) && $_FILES[$fichier]['name'] != ""){ //Vérifie sur formulaire envoyé et que le fichier existe $nom_fichier = $_FILES[$fichier]['name']; $source = $_FILES[$fichier]['tmp_name']; $type_fichier = $_FILES[$fichier]['type']; $taille_fichier = $_FILES[$fichier]['size']; if($nom_fichier != ".htaccess"){ //Vérifie que ce n'est pas un .htaccess if($type_fichier == "image/jpeg" || $type_fichier == "image/pjpeg" || $type_fichier == "application/pdf"){ //Soit un jpeg soit un pdf if ($taille_fichier <= 2097152) { //Taille supérieure à Mo (en octets) $tabRemplacement = array("é"=>"e", "è"=>"e", "à"=>"a"); //Remplacement des caractères spéciaux $handle = fopen($source, 'r'); //Ouverture du fichier $content = fread($handle, $taille_fichier); //Lecture du fichier $encoded_content = chunk_split(base64_encode($content)); //Encodage $f = fclose($handle); //Fermeture du fichier $email_message .= $pl . "--" . $boundary . $pl; //Deuxième séparateur d'ouverture $email_message .= 'Content-type:'.$type_fichier.';name="'.$nom_fichier.'"'."n"; //Type de contenu (application/pdf ou image/jpeg) $email_message .= 'Content-Disposition: attachment; filename="'.$nom_fichier.'"'."n"; //Précision de pièce jointe $email_message .= 'Content-transfer-encoding:base64'."n"; //Encodage $email_message .= "n"; //Ligne blanche. IMPORTANT ! $email_message .= $encoded_content."n"; //Pièce jointe }else{ //Message d'erreur $email_message .= $pl ."L'utilisateur a tenté de vous envoyer une pièce jointe mais celle ci était superieure à 2Mo.". $pl; } }else{ //Message d'erreur $email_message .= $pl ."L'utilisateur a tenté de vous envoyer une pièce jointe mais elle n'était pas au bon format.". $pl; } }else{ //Message d'erreur $email_message .= $pl ."L'utilisateur a tenté de vous envoyer une pièce jointe .htaccess.". $pl; } } $email_message .= $pl . "--" . $boundary . "--" . $pl; }
Le code est dans une boucle for car je veux accueillir jusqu'à 2 pièces jointes.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

07 janv. 2019, 11:22

Pour les pièces jointes dans les emails, je te recommande fortement d'utiliser une librairie comme PHPmailer ou Swiftmailer car c'est un peu particulier et pour être sûr que ça fonctionne chez tous les hébergeurs avec le moins de risque de rejet par les fournisseurs d'accès, il vaut mieux utiliser une librairie spécialisée.
https://github.com/PHPMailer/PHPMailer/ ... /README.md
https://swiftmailer.symfony.com/docs/introduction.html
Quand tout le reste a échoué, lisez le mode d'emploi...

Sudiste
Invité n'ayant pas de compte PHPfrance

07 janv. 2019, 12:21

Eh bien, ça à l'air bien beau tout ça, mais je préfèrerais rester sur ce que j'ai fais, car le code parait plus clair pour moi.

De plus, je n'ai aucune idée comment installer ces librairies étant donné que je n'ai pas de droits administrateurs sur mon serveur dédié.

Et enfin, je n'ai pas non plus envie de tout recommencer alors que je suis plus très loin du but.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

07 janv. 2019, 21:30

Bah comme tu veux mais ton code comporte pas mal d'erreurs (mauvais retour à la ligne, variable défini qui ne servent à rien, code obsolète qui te prends 3 lignes là où 1 suffirait...).

Or tant que ton code n'est pas parfait, les emails vont peut être partir de ton serveur mais vont être rejetés par les serveurs mail distants qui ne te diront pas pourquoi (et qui te prendront pour du spam), et donc ça sera quasiment impossible à débuguer.

Chez certains FAI ça fonctionnera (du genre pour les destinataires avec des emails @free.fr ou @laposte.net par exemple) mais chez d'autres ça ne fonctionnera pas (@gmail.com, @hotmail.com, ou @orange.fr par exemple...).
Et le pire c'est que ce sont des règles antispam et antivirus qui vont faire le tri pour savoir si ton mail est légitime ou pas et que leurs règles vont évoluer et donc un mail qui passera chez Gmail, ne passera peut être plus 1 mois plus tard car ils auront rendu + stricte le formattage du mail.
Bref, gros gros casse-tête en perspective.

Mais bien sûr tu fais comme tu veux. Je suis déjà passé par là et j'ai suffisamment galéré par le passé pour savoir que plus jamais je ne fais de mails complexes uniquement avec la fonction mail() de PHP car c'est un gros risque de tomber en spam sans savoir pourquoi.
Je t'aurai prévenu :-D
Quand tout le reste a échoué, lisez le mode d'emploi...

Sudiste
Invité n'ayant pas de compte PHPfrance

08 janv. 2019, 11:00

Tu m'as convaincu, j'ai modifié mon code pour accueillir le PHPMailer, car de toute manière j'étais bloqué à cause de ces pièces jointes.

Mais il me reste toujours un problème. Je n'ai pas d'accès SSH à mon serveur dédié donc impossible d'utiliser Composer pour installer PHPMailer. Une solution? Je pourrais l'installer manuellement, mais où?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

08 janv. 2019, 12:49

En fait tu peux utiliser Composer sur ta machine locale et ensuite uploader tous les fichiers récupérés vers ton serveur.

Ou sinon même sans utiliser composer, ça fonctionne, c'est indiqué dans le README :
Alternatively, if you're not using Composer, copy the contents of the PHPMailer folder into one of the include_path directories specified in your PHP configuration and load each class file manually:
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/to/PHPMailer/src/Exception.php';
require 'path/to/PHPMailer/src/PHPMailer.php';
require 'path/to/PHPMailer/src/SMTP.php';
Pour savoir quels sont les "include_path", tu peux regarder dans un phpinfo(), ou utiliser simplement le même répertoire que là où est ton fichier PHP si ce n'est que dans un seul script où tu as besoin de PHPmailer. Sinon tu peux définir un autre include_path avec la fonction PHP set_include_path()
https://php.net/set_include_path
Quand tout le reste a échoué, lisez le mode d'emploi...

Sudiste
Invité n'ayant pas de compte PHPfrance

08 janv. 2019, 15:31

Merci!

Le problème est enfin réglé! Je tourne enfin cette page mais je ne l'oublierai pas de si tôt, et ça m'aura permit de mieux comprendre le PHP, ce qui peut toujours être utile en soit.

Mes e-mails s'envoient parfaitement, pas de spam, mes pièces jointes sont là.

Je te remercie pour le temps que tu m'as consacré @rthur et à la prochaine peut-être.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

08 janv. 2019, 19:21

Avec plaisir, à bientôt ! :-D
Quand tout le reste a échoué, lisez le mode d'emploi...

cedd
Invité n'ayant pas de compte PHPfrance

23 janv. 2020, 00:00

Bonjour Sudiste, pourrais-tu m'envoyer ton code ?
Je tombe sur le même problème en partant du même code trouvé sur internet :(
Merci d'avance

Cedd