Mail + pièce jointe PDF généré en PHP


xdeslandes
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 393
Inscription: 29 Déc 2004

Mail + pièce jointe PDF généré en PHP

Message le Ven Juil 29, 2011 15:10

Bonjour,

J'ai un script qui génère des bons de livraison (BL) en PDF ou en HTML (suivant un paramètre html=0 ou 1 dans l'url)
Après avoir épluché quelques posts, j'ai mis en place, en bas du BL HTML une fonctionnalité qui permet de saisir une adresse mail pour envoyer le BL au format PDF en PJ.

Le mail parvient bien au destinataire, avec une PJ au format PDF: mais ce fichier pdf joint est vide (ou réduit à 0 je ne sais pas): il fait 0 ko et ne peut être ouvert pas Adobe Reader.

J'ai tenté plusieurs soluces, mais en vain.

Explications techniques:
genrer_BL.php génère le BL au format DF ou HTML. Le format HTML affiche en plus un formulaire pour saisir l'adresse mail.
envoyer_mailBL.php reçoit le $_POST, traite l'adresse, envoie le mail avec ça comme code:
Code: Tout sélectionner
   // Destinataire du mail
   $destination = $_POST['mail_dest_bl'];
   // Expediteur du mail
   $from_mail = 'monadresse@mondomaine.com';
   $from_name = "Prénom NOM";
   // sujet du mail
   $sujet = '[Mon entreprise] - votre BL';
   // Chaine permettant de différencier les différentes parties du mail
   $uid = md5(uniqid(time()));
   $message = "Bonjour,\nVous trouverez en pièce jointe le BL demandé au format PDF.\n";
   $message .= $signature_mail;
   
   // Traitement pour attacher une PJ
   // D'abord on lit le fichier
   $fichier = 'generer_BL.php?id_course='.$_POST['id_course'].'&pj=BL-'.$_POST['num_BT'].'.pdf&html=0';
   $attachement = chunk_split(base64_encode($fichier));
   
   $header = "From: ".$from_name." <".$from_mail.">\r\n";
   $header .= "Reply-To: ".$from_mail."\r\n";
   $header .= "MIME-Version: 1.0\r\n";
   $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
   $header .= "This is a multi-part message in MIME format.\r\n";
   $header .= "--".$uid."\r\n";
   $header .= "Content-type:text/plain; charset=iso-8859-1\r\n";
   $header .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
   $header .= $message."\r\n\r\n";
   $header .= "--".$uid."\r\n";
   $header .= "Content-Type: application/pdf; name=\"BL-".$_POST['num_BT'].".pdf\"\r\n";
   $header .= "Content-Transfer-Encoding: base64\r\n";
   $header .= "Content-Disposition: attachment; filename=\"BL-".$_POST['num_BT'].".pdf\"\r\n\r\n";
   $header .= $attachement."\r\n\r\n";
   $header .= "--".$uid."--";   
   // enfin on envoi le mail
   $is_sent = @mail($destination, $sujet, "", $header);
   if ($is_sent)
   {
      header('Location: generer_BL.php?id_course='.$_POST['id_course'].'&html=1&mail=ok');
   }
   else echo 'Envoi raté:<br />'.$headers;

Avec $_POST['num_BT'] et $_POST['id_course'] qui étaient en type="hidden" dans le formulaire.

generer_BVL.php génère le PDF avec mPDF (super d'ailleurs). Lorsqu'il est appelé avec le paramètre pj, il ressort le PDF avec ça:
Code: Tout sélectionner
   if (isset($_GET['pj']))
      $livraison_mpdf -> Output('', 'S');
   else
      $livraison_mpdf -> Output();
   exit;


Où peut se trouver mon souci ?


spout
WRInaute accro
WRInaute accro
 
Messages: 4379
Inscription: 14 Mai 2003

Re: Mail + pièce jointe PDF généré en PHP

Message le Ven Juil 29, 2011 15:22

Au lieu de réinventer toute la roue, tu as essayé l'envoi avec des libs style PHPMailer ou Swift Mailer ?


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8575
Inscription: 23 Nov 2005

Re: Mail + pièce jointe PDF généré en PHP

Message le Ven Juil 29, 2011 15:27

spout a écrit:PHPMailer ou Swift Mailer ?


+10 000

1. Génération de la PJ physiquement sur le serveur
2. Envoi du mail avec la PJ via PHPMailer
3. Suppression de la PJ

poulpe
WRInaute discret
WRInaute discret
 
Messages: 90
Inscription: 29 Juin 2004

Re: Mail + pièce jointe PDF généré en PHP

Message le Ven Juil 29, 2011 15:28

d'accord avec spout, swiftmailer va te permettre de faire ca simplement, et c'est une mecanique eproouvee...


xdeslandes
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 393
Inscription: 29 Déc 2004

Re: Mail + pièce jointe PDF généré en PHP

Message le Ven Juil 29, 2011 21:21

Wouaiiiis, bon d'accord. Cela me semblait être comme "utiliser une bombe nulcéaire pour tuer une mouche".
Je ne pense d'ailleurs pas que le souci soit logiciel/applicatif.

Mais bon, vous n'êtes pas les premiers à me le dire. Je tente PHPMailer et je reviens...


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8575
Inscription: 23 Nov 2005

Re: Mail + pièce jointe PDF généré en PHP

Message le Ven Juil 29, 2011 21:42

Il suffit de pas grand chose, lors de la constitution des en-têtes d'un mail, pour merdoyer et envoyer un truc mal interprété ou planté.

Tu as vérifié que le fichier que tu essaies d'envoyer était correctement généré ?


xdeslandes
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 393
Inscription: 29 Déc 2004

Re: Mail + pièce jointe PDF généré en PHP

Message le Sam Juil 30, 2011 14:44

Tu veux dire si ses en-têtes http l'étaient ?

En début de script PHP générateur du PDF, j'ai ça (donné par la web dev toolbar de Google Chrome):
Code: Tout sélectionner
include ($chem."mpdf51/mpdf.php");

qui se charge d'envoyer les en-têtes correct (j'espère).

Lorsque je génère le pdf "à la main", j'obtiens ça:
Code: Tout sélectionner
Request URL:http://plateforme.transporturgent.com/courses/generer_BL.php?id_course=7940&html=0
Request Method:GET
Status Code:200 OK
Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
[...]
Host:plateforme.transporturgent.com
If-Modified-Since:Sat, 30 Jul 2011 13:39:00 GMT
User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30
Query String Parametersview URL encoded
id_course:7940
html:0
Response Headers
Cache-Control:public, must-revalidate, max-age=0
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:44543
Content-Type:application/pdf
Content-disposition:inline; filename="mpdf.pdf"
Date:Sat, 30 Jul 2011 13:39:49 GMT
Expires:Sat, 26 Jul 1997 05:00:00 GMT
Keep-Alive:timeout=15, max=100
Last-Modified:Sat, 30 Jul 2011 13:39:51 GMT
Pragma:public
Server:Apache/2.2.16 (Unix) mod_ssl/2.2.16 OpenSSL/0.9.8o
Vary:Accept-Encoding,User-Agent
X-Powered-By:PHP/5.2.13-pl1-gentoo


(J'ai supprimé des infos concernant les cookies)

C'est bien ou pas ?

jcaron
WRInaute accro
WRInaute accro
 
Messages: 2685
Inscription: 13 Fév 2004

Re: Mail + pièce jointe PDF généré en PHP

Message le Sam Juil 30, 2011 16:38

A moins que j'aie besoin de lunettes, il manque quand même un énorme truc dans ton script: générer ou récupérer le PDF!

Tu fais:
Code: Tout sélectionner
$fichier = 'generer_BL.php?id_course='.$_POST['id_course'].'&pj=BL-'.$_POST['num_BT'].'.pdf&html=0';
$attachement = chunk_split(base64_encode($fichier));


Bref, ton fichier attaché, c'est juste l'URL (relative), pas le fichier lui-même. Si tu veux utiliser la logique que tu sembles privilégier (i.e. appeler le générateur de PDF à travers un appel http), il te manque un file_get_contents ou équivalent. Mais ça pose probablement un problème d'authentification (je suppose que tout le monde n'a pas accès à ce script), et c'est probablement un peu lourd pour pas grand chose, tu dois pouvoir gérer le PDF en interne directement, non?

Au passage, l'utilisation de $_POST['truc'] sans filtrage, sans escape, sans rien, c'est quand même très dangereux.

Et l'utilisation de librairies adaptées pour générer le mail ce n'est effectivement pas forcément une mauvaise idée.

Jacques.


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8575
Inscription: 23 Nov 2005

Re: Mail + pièce jointe PDF généré en PHP

Message le Sam Juil 30, 2011 18:31

+1 Jcaron. En fait ce que je te demandais c'est si le fichier créé physiquement était correcte ou pas. Or a priori, tu ne génères pas ce fichier, je vois mal dans ce cas comment tu peux l'envoyer en PJ.


xdeslandes
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 393
Inscription: 29 Déc 2004

Re: Mail + pièce jointe PDF généré en PHP

Message le Sam Juil 30, 2011 21:41

Au passage, l'utilisation de $_POST['truc'] sans filtrage, sans escape, sans rien, c'est quand même très dangereux.

ici, ce n'est pas dangereux.

Ce que vous dites est juste. J'ai bien tenté de faire un file_get_content ou un fgets (je ne me souviens plus), mais j'avais alors un problème de récursivité.
J'ai bientôt terminé mon test avec phpmailer. Je vous tiens au jus.

jcaron
WRInaute accro
WRInaute accro
 
Messages: 2685
Inscription: 13 Fév 2004

Re: Mail + pièce jointe PDF généré en PHP

Message le Sam Juil 30, 2011 23:04

Il est très, très rare que ce ne soit pas dangereux. Les gens mal intentionnés ont généralement plus d'imagination que les ceux qui développent.

Jacques.


xdeslandes
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 393
Inscription: 29 Déc 2004

Re: Mail + pièce jointe PDF généré en PHP

Message le Mar Aoû 02, 2011 9:44

PhpMailer me répond:
Code: Tout sélectionner
Language string failed to load: recipients_failedmediaprodx@gmail.com


Kesako ? Comment réparer ?


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8575
Inscription: 23 Nov 2005

Re: Mail + pièce jointe PDF généré en PHP

Message le Mar Aoû 02, 2011 10:01

Il en est question ici : http://stephaneey.developpez.com/tutoriel/php/phpmailer/

Il faut faire un SetLanguage().


xdeslandes
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 393
Inscription: 29 Déc 2004

Re: Mail + pièce jointe PDF généré en PHP

Message le Mar Aoû 02, 2011 10:36

Merci.
Bon, tout est OK: mes mails partent (et arrivent), cela fonctionne aussi avec une PJ 'en dur' (un fichier pdf stocké à côté du script), mais lorsque je lui demande d'attacher mon fichier pdf généré à la volée comme ça:
Code: Tout sélectionner
   $fichier = 'generer_BL.php?id_course='.$_POST['id_course'].'&pj=BL-'.$_POST['num_BT'].'.pdf&html=0';
   $mail->AddAttachment($fichier);


on me répond
Code: Tout sélectionner
Could not access file: generer_BL.php?id_course=3350&pj=BL-003020811.pdf&html=0


C'est une question d'identification ?
Peut-être faut-il générer le fichier, puis l'enregistrer, l'attacher au mail, et accessoirement le supprimer ensuite ?


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8575
Inscription: 23 Nov 2005

Re: Mail + pièce jointe PDF généré en PHP

Message le Mar Aoû 02, 2011 10:45

xdeslandes a écrit:Peut-être faut-il générer le fichier, puis l'enregistrer, l'attacher au mail, et accessoirement le supprimer ensuite ?


Je pense plutôt que c'est ça. perso je n'ai jamais procédé autrement.

Mail + pièce jointe PDF généré en PHP

Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités