[php] PDF-bestand (fpdf) als bijlage versturen (phpmailer)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • StephanVierkant
  • Registratie: Mei 2003
  • Laatst online: 26-04 22:45
Voor het versturen van facturen naar klanten, wil ik met een php-script een pdf-bestand als bijlage met een mail verzenden.

Met fpdf maak ik de pdf-bestanden, wat prima lukt. Door middel van phpmailer verstuur ik de mails, en ook dat levert geen problemen op. Een combinatie van beide lukt me echter niet zo best. Bijlages verzenden lukt wel, maar het PDF-bestand wordt niet meegezonden.

Ik vermoed dat het te maken heeft met de manier waarop fpdf het bestand opslaat. Ik heb de twee parameter van $pdf->Output(); aangepast en alle mogelijkheden (I, D, F en S) al geprobeerd, maar geen van allen werkt. Het bestand download.php?id=n genereert het pdf-bestand en mail.php verstuurt de mail.

Ik heb een klein debug-regeltje toegevoegd:
PHP:
1
2
3
4
if(!$mail->AddAttachment("download.php?id=1"))
{
    die("Het bestand is niet gevonden!");
}

Vul ik hier 'logo.jpg' in, krijg ik netjes een mailtje met het bestand, het pdf-bestand mailen lukt helaas niet.

Heeft iemand een idee waarom het niet werkt?

[ Voor 13% gewijzigd door StephanVierkant op 02-05-2008 21:31 . Reden: aanvulling debug ]


Acties:
  • 0 Henk 'm!

  • CyBeRSPiN
  • Registratie: Februari 2001
  • Laatst online: 21:07

CyBeRSPiN

sinds 2001

Misschien dat de HTTP header dan ook meekomt?
Wat lukt trouwens niet? kun je een willekeurige andere bijlage wél versturen?

Acties:
  • 0 Henk 'm!

  • StephanVierkant
  • Registratie: Mei 2003
  • Laatst online: 26-04 22:45
CyBeRSPiN schreef op vrijdag 02 mei 2008 @ 21:30:
Misschien dat de HTTP header dan ook meekomt?
Wat lukt trouwens niet? kun je een willekeurige andere bijlage wél versturen?
Een andere bijlage komt wel gewoon aan. Hoe voorkom ik dat de http-header mee wordt gezonden? Welke optie (s, i of d) moet ik gebruiken?

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Even opslaan in je filesystem, meesturen en daarna unlinken een optie?

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 08-05 16:20

Bosmonster

*zucht*

Ik vind het al knap dat dit met die image wel werkt.

Zie Cartman ^^

Acties:
  • 0 Henk 'm!

  • StephanVierkant
  • Registratie: Mei 2003
  • Laatst online: 26-04 22:45
Bosmonster schreef op vrijdag 02 mei 2008 @ 23:12:
Ik vind het al knap dat dit met die image wel werkt.

Zie Cartman ^^
Waarom zou die image niet moeten werken? Die staat namelijk al in een map, het pdf-bestand moet gegenereerd worden.

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Stephan4kant schreef op zaterdag 03 mei 2008 @ 01:24:
[...]

Waarom zou die image niet moeten werken? Die staat namelijk al in een map, het pdf-bestand moet gegenereerd worden.
Omdat gij een string toevoegt als attachment, geen bestand.

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • StephanVierkant
  • Registratie: Mei 2003
  • Laatst online: 26-04 22:45
Snake schreef op zaterdag 03 mei 2008 @ 01:26:
[...]

Omdat gij een string toevoegt als attachment, geen bestand.
Ik heb geprobeerd om het bestand eerst op te slaan en dan te versturen, maar dat werkt ook niet echt zoals ik wil.

Zijn er ook mogelijkheden met bijvoorbeeld fwrite()? Ik begrijp dat die functie een string opslaat als bestand. Ik probeer nu iets met een aangepast Example #1, maar dit werkt ook niet:
PHP:
1
2
$filename = 'factuur.pdft';
$somecontent = fopen("download.php?id=1", "r");

Acties:
  • 0 Henk 'm!

  • xces
  • Registratie: Juli 2001
  • Laatst online: 08-05 21:25

xces

To got or not to got..

Snake schreef op zaterdag 03 mei 2008 @ 01:26:
[...]
Omdat gij een string toevoegt als attachment, geen bestand.
phpmailer verwacht hier een bestand wat al op de lokale schijf staat. Zoals je zelf al aangeeft werkt een plaatje wel. Als je nu dat "?id=1" weghaalt, stuurt hij dan je PHP file mee? Ik vermoed nl. van wel. Je het een aantal opties:
a) zorgen dat "download,php?id=1" een juiste factuur (in de browser) weergeeft, d.w.z. dat je zeker weet dat dat script werkt.
b) daarnaast in je mail script dezelfde factuur genereren, en meesturen (d.w.z. maak een klasse voor het genereren van je factuur)
of (c) zorgen in je mailscript dat je "download.php?id=x" aanroept. Als je geluk hebt kan het zo:
file_get_contents('http://<jouwdomain>/download.php?id=1") maar dan moeten wel de url_wrappers aanstaan. Hier komt vervolgens 1 blok data uit wat je weg kan schrijven naar 1 file. Deze file kun je vervolgens toevoegen; versturen en na het versturen de temp file weggooien ;)

Acties:
  • 0 Henk 'm!

  • b19a
  • Registratie: September 2002
  • Niet online
Met xces. PHPMailer gaat nu de inhoud van het bestand "download.php?id=x" proberen op te halen; niet de uitvoer, die je wilt. Je kunt dus of de externe URL van dat downloadscript opgeven (dan gaat het sowieso goed), of je systeem iets verbouwen en de pdf tijdelijk op je schijf bewaren.

[ Voor 5% gewijzigd door b19a op 03-05-2008 15:43 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:09

Creepy

Tactical Espionage Splatterer

Stephan4kant schreef op zaterdag 03 mei 2008 @ 01:57:
[...]

Ik heb geprobeerd om het bestand eerst op te slaan en dan te versturen, maar dat werkt ook niet echt zoals ik wil.

Zijn er ook mogelijkheden met bijvoorbeeld fwrite()? Ik begrijp dat die functie een string opslaat als bestand. Ik probeer nu iets met een aangepast Example #1, maar dit werkt ook niet:
PHP:
1
2
$filename = 'factuur.pdft';
$somecontent = fopen("download.php?id=1", "r");
Misschien handig om je even wat beter te verdiepen in de werking van PHP en het verschil tussen clientside en serverside goed te bekijken. download.php?id=1 is een clientside (!) aanroep. Als je dit vanaf je server wilt aanroepen zul je een absolute URL moeten gebruiken zodat fopen e.d. snappen dat je het via een URL wilt benaderen en niet direct via het filesystem. Nu ziet fopen alleen een string "download.php?id=1" en probeert dat als bestand op te halen en dat werkt uiteraard niet. Als je nu zou proberen om "download.php" als parameter te gebruiken dan zal je zien dat je je .php bestand als attachment invoegt en niet de uitvoer van je PHP bestand.

Ik kan me overigens niet voorstellen dat je de output van je PDF generator niet direct kan opvangen en als attachment kan meegeven.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • flashin
  • Registratie: Augustus 2002
  • Laatst online: 17-12-2023
Ik kan me overigens niet voorstellen dat je de output van je PDF generator niet direct kan opvangen en als attachment kan meegeven.
Idd. Dit kan bij phpmailer met de functie AddStringAttachment() !

Hoef je niet veel voor te veranderen dus ;)
PHP:
1
2
3
4
5
6
<?php 
if(!$mail->AddStringAttachment("http://1.1.1.1/download.php?id=1", "attachmentnaam.pdf")) 
{ 
    die("Het bestand is niet gevonden!"); 
} 
?> 

[ Voor 9% gewijzigd door flashin op 03-05-2008 13:27 ]


Acties:
  • 0 Henk 'm!

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 05-03 20:03
flashin schreef op zaterdag 03 mei 2008 @ 13:25:
[...]
Idd. Dit kan bij phpmailer met de functie AddStringAttachment() !

Hoef je niet veel voor te veranderen dus ;)
PHP:
1
2
3
4
5
6
<?php 
if(!$mail->AddStringAttachment("http://1.1.1.1/download.php?id=1", "attachmentnaam.pdf")) 
{ 
    die("Het bestand is niet gevonden!"); 
} 
?> 
Ehm die code gaat ook echt niet werken hoor. Tenzij je de string 'http://1.1.1.1/download.php?id=1' als pdf attachement wilt meesturen... Wat volgens mij niet de bedoeling is. Je mag je ook nogeens in de rest van het verhaal van crisp verdiepen.

De methode AddStringAttachment verwacht de volgende argumenten:

PHP:
1
AddStringAttachment($string, $filename, $encoding, $type)


je zou dus iets als dit moeten doen:
PHP:
1
2
$pdfDocument = createPDFDocument();
$mailer->AddStringAttachment($pdfDocument, 'pdfBestand.pdf', 'base64', 'application/pdf');

If I can't fix it, it ain't broken.


Acties:
  • 0 Henk 'm!

  • StephanVierkant
  • Registratie: Mei 2003
  • Laatst online: 26-04 22:45
Ik sla nu het bestand op in een temp-directory, en voeg hem dan als bijlage toe. Werkt perfect.

Acties:
  • 0 Henk 'm!

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 05-03 20:03
Gebruik je ook een unieke naam voor dat tijdelijke bestand? Anders zou je nog weleens problemen kunnen krijgen bij (bijna) gelijktijdige requests voor het mailen van een factuur.

If I can't fix it, it ain't broken.


Acties:
  • 0 Henk 'm!

  • StephanVierkant
  • Registratie: Mei 2003
  • Laatst online: 26-04 22:45
Ik voeg het $id van de factuur toe (factuur_5623.pdf bijvoorbeeld). Lijkt me geen probleem.
Pagina: 1