Page 1 sur 2
envoyer le pdf par mail plutôt que l'afficher
Posté : 13 mai 2007, 18:20
par jay64
Bonjour à tous,
Je génère une facture au format pdf et qui se construit dynamiquement.
Actuellement, la seule chose que je sais faire, c'est l'afficher à l'écran, mais moi je voudrais plutôt qu'elle soit automatiquement envoyée par mail en PJ à mon client.
Actuellement, mon code se termine par cette fonction :
$pdf->Output();
Pourriez-vous m'aider SVP ?
Merci !
Posté : 13 mai 2007, 19:54
par jpaul
Bonjour,
J'ai cru comprendre que tu utilises fpdf...
La première chose pour envoyer pâr mail est de générer un fichier.
Actuellement, en utilisant $pdf->Output(); sans aucun paramètre, le fichier est envoyé au navigateur.
La documentation indique les paramètres :
http://www.fpdf.org/fr/doc/output.htm
A ta place, je mettrais :
$fichier_pdf=uniqid (); // pour générer un nom de fichier
$pdf->Output($fichier_pdf,"F"); // pour sauvegarder le fichier
Ensuite, il suffit d'envoyer le fichier en pièce jointe et de le supprimer ensuite. En recherchant avec Google, il y a beaucoup d'exemples d'envoi de documents en pièce jointe, là on m'appelle pour aller manger

et je n'ai pas le temps de détailler...
Posté : 13 mai 2007, 23:10
par jay64
Bon, ok, je suis sur la bonne voie !
J'arrive désormais à enregistrer mon pdf sur un emplacement de mon serveur.
Maintenant, je bloque complet pour les envois mails avec pièce jointe. Cela fait 2 heures que je recherche à travers ce forum et sur google, mais je n'arrive pas à trouver le moindre scripte que je suis capable d'adapter.
Enfin, je suis quand même parti là dessus mais je ne reçois jamais le moindre mail :
<?
$to = "[email protected]";
$subject = "sujet test";
$message = "voici votre facture !";
$pj = "../admin/archivage_factures/2007/200700001.pdf";
function envoyermailpj($to, $subject, $message, $pj) {
$limite = "_parties_".md5(uniqid (rand()));
$mail_mime = "Date: ".date("l j F Y, G:i")."\n";
$mail_mime .= "MIME-Version: 1.0\n";
$mail_mime .= "Content-Type: multipart/mixed;\n";
$mail_mime .= " boundary=\"----=$limite\"\n\n";
$texte = "Ceci est un message au format MIME.\n";
$texte .= "------=$limite\n";
$texte .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
$texte .= "Content-Transfer-Encoding: 7bit\n\n";
$texte .= $message;
$texte .= "\n\n";
$attachement = "";
// fichier 1
$fichier = $pj;
$fp = fopen($fichier, "rb");
$pg = fread($fp,filesize($fichier));
fclose($fp);
$attachement .= "------=$limite\n";
$attachement .= "Content-Type: application/octet-stream; name=\"facture.pdf\"\n";
$attachement .= "Content-Transfer-Encoding: base64\n";
$attachement .= "Content-Disposition: attachment; filename=\"facture.pdf\"\n\n";
$attachement .= chunk_split(base64_encode($pg));
$attachement .= $pg;
$attachement .= "\n\n\n------=$limite\n";
$headers = 'From: [email protected]' . "\r\n" .
'Reply-To: [email protected]' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $texte.$attachement, $headers.$mail_mime);
}
?>
Merci d'avance pour votre aide !
Posté : 14 mai 2007, 09:29
par jpaul
Hum je ne vois pas comment se fait le passage de la variable fichier dans ton code d'envoi de pièce jointe...
Je n'ai pas retrouvé le site à partir duquel je me suis inspiré quand j'ai eu à faire ça mais voici un URL qui propose une fonction qui, en première lecture, semble OK :
http://www.phpcs.com/code.aspx?ID=26501
Comme il s'agit d'une fonction, je pense qu'il suffit de la prendre telle qu'elle en lui passant les bons paramètres.
J'édite le message car je pense avoir retrouvé le site qui m'a servi d'exemple :
http://www.toutestfacile.com/php/cours/mail_2.php5
Posté : 14 mai 2007, 12:08
par jay64
Merci jpaul pour t aréponse, cependant :
Tout d'abord, cel lien ne fonctionne pas !
Pour ce qui de mon code ci-dessus, je cherche à envoyer un fichier existant sur un emplacement de mon serveur : "../admin/archivage_factures/2007/200700001.pdf"
Le problème, c'est que je ne sais justement pas comment m'y prendre pour l'inclure en PJ dans le mail. Mon script est surement faux puisque je ne pense pas m'y être pris correctement.
Je tourne en rond avec tous les autres scripts que je peux trouver par ci par là. J'ai l'impression qu'à chaque fois, on montre comment envoyer un fichier que l'on a choisi à l'aide d'un formulaire, ce qui n'est évidemment pas mon cas.
Merci !
Posté : 14 mai 2007, 14:17
par iclo
Visiblement, maintenant le lien fonctionne, et l'exemple me semble très clair et convient visiblement bien à ce que tu souhaites faire.
Posté : 14 mai 2007, 14:26
par jay64
Visiblement, maintenant le lien fonctionne, et l'exemple me semble très clair et convient visiblement bien à ce que tu souhaites faire.
Ben non, désolé, je vous assure que la page apparait, avec son entete, mais tout le reste est vide, je n'ai absolument rien !

Posté : 14 mai 2007, 14:33
par jpaul
Bon en fait j'avais mal lu, ton code est OK mais il manque simplement l'appel à la fonction que tu as déclarée.
Rajoute une ligne :
envoyermailpj($to, $subject, $message, $pj);
Et ca devrait rouler

Posté : 14 mai 2007, 15:06
par jay64
ah oui, c'est mieux !
Sauf que la PJ est bien un fichier pdf, portant le nom demandé, mais ne faisant que 4ko, donc impossible à ouvrir et ne correspondant pas à mon fichier d'origine.
J'ai du me louper dans l'attachement au fichier ! Pourtant, mon chemin semble bon, et je confirme que le fichier appelé est valide et s'ouvre correctement en temps normal.
Posté : 14 mai 2007, 15:08
par jay64
ah oui, c'est mieux !
Sauf que la PJ est bien un fichier pdf, portant le nom demandé, mais ne faisant que 4 octets, donc impossible à ouvrir et ne correspondant pas à mon fichier d'origine.
J'ai du me louper dans l'attachement au fichier ! Pourtant, mon chemin semble bon, et je confirme que le fichier appelé est valide et s'ouvre correctement en temps normal.
Posté : 14 mai 2007, 15:12
par jpaul
Si ça peut t'aider j'ai fait un test et ça marche, je récupère bien le fichier que j'ai copié.
J'ai juste changé :
$to = "
[email protected]";
$pj = "Order_FR_HSB_DHSA_558299614_2006-12-13.pdf";
(Order_FR_HSB_DHSA_558299614_2006-12-13.pdf est un vieux fichier pdf que j'ai recopié dans mon répertoire de tests...
$to = "[email protected]";
$subject = "sujet test";
$message = "voici votre facture !";
$pj = "Order_FR_HSB_DHSA_558299614_2006-12-13.pdf";
envoyermailpj($to, $subject, $message, $pj);
Posté : 14 mai 2007, 15:45
par jay64
en fait, la seule différence entre toi et moi c'est l'emplacement de ce fichier pdf.
Toi tu l'as dans le même répertoire que celui de ton script php, alors que moi je vais le chercher ailleurs (../blabla...)
Posté : 14 mai 2007, 15:52
par jpaul
Si le ../blabla... est correct, ça devrait marcher.
Par contre si tu ne testes pas sous windows, il faut faire attention à la casse (majuscules/minuscules), tu peux avoir 2 fichiers distincts sous linux/unix (dont les noms différent par les majuscules) alors que sous windows ce serait le même fichier.
Pour le moment, je ne vois que cela qui pourrait expliquer ton problème.
Posté : 14 mai 2007, 17:12
par jay64
Bon, après plusieurs tests, voici ce que je peux dire :
Quand je place le pdf dans le même dossier que mon script, ça fonctionne trés bien, puisque ma variable est ainsi définie : $pj = "200700001.pdf";
Par contre, dès que je vire le pdf pour le mettre dans un autre dossier et que je l'appelle via un chemin relatif, alors là badaboum, ça ne marche plus.
Pourtant, ce n'est pas une histoire de casse car j'ai tout en minuscule.

Posté : 14 mai 2007, 17:16
par jay64
Bien voilà que ça marche maintenant ........
Bizarre bizarre, j'ai comme l'impression que ma PJ avait disparue de mon serveur dans l'emplacement que j'appelais. J'ai du faire une fausse manip sans m'en rendre compte et je bataillais pour rien en fait !
Merci en tout cas jpaul, tu m'as bien aidé !