[PHP] Mail Header PDF

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
Probleempje met mail attachment. Onderstaande code werkt helemaal, alleen de attachment (PDF bestand) kan niet door Acrobat Reader geopend worden:

Afbeeldingslocatie: http://www.webpro.nl/got/reader_error.gif

Dat is wel duidelijk, maar welke header zou ik dan moeten gebruiken (i.p.v. "application/pdf")?! Of doe ik toch iets anders fout?
(Ik heb ook dit topic hiervoor gebruikt: [rml][ PHP] MIME attachment voor Hotmail *[/rml])

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// [Create ezPDF file]

// [Write ezPDF file]

// Read data from file
$filename = 'pdf/output.pdf';
$handle = fopen($filename, 'rb');
$data = fread($handle,filesize($filename));
fclose($handle); 
$data = chunk_split(base64_encode($data));

// Set some mail headers and text
$recipient = "..."; 
$subject = "..."; 
$message = "Test.";

// Create boundary
$mimeBoundary = md5(uniqid(time())); 
    
// MIME header
$header = "MIME-Version: 1.0\r\n";
$header .= "From: ...<...>\r\n"; 
$header .= "Reply-To: ...\r\n";
$header .= "Content-Type: multipart/mixed;";
$header .= " boundary=\"".$mimeBoundary."\"\r\n";
    
// MIME message
$body = "--".$mimeBoundary."\r\n";
$body .= "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n";
$body .= "Content-Transfer-Encoding: 7bit\r\n";
$body .= $message."\r\n";
$body .= "--".$mimeBoundary."\r\n";

// Add attachment
$body .= "--".$mimeBoundary."\r\n";
$body .= "Content-Type: application/pdf; name=\"".filename."\"\r\n";
$body .= "Content-Disposition: attachment; filename=\"output.pdf\"\r\n";
$body .= "Content-Transfer-Encoding: base64\n\n";
$body .= $data."\n\n";
$body .= "--".$mimeBoundary."--\r\n\r\n"; 

// Send mail
mail($recipient, $subject, $body, $header);

Acties:
  • 0 Henk 'm!

  • TheDane
  • Registratie: Oktober 2000
  • Laatst online: 16:30

TheDane

1.618

ik heb deze 2:

code:
1
2
header( "Content-Disposition: attachment; filename=bla.pdf" );
header( "Content-type: application/octet-stream;");


maar als ik een pdf downloadbaar wil maken, dan moet ik dit doen:
code:
1
 header ("Location: pdfs/bla.pdf");

(met bovenstaande werkt 't vaak niet goed :? vreemdgenoeg)

Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
@TheDane: bedoel je nou dat het bij jou ook niet werkt? In ieder geval, met een "Content-Type: application/octet-stream;" werkt het ook niet.

Een file "force to download" moet overigens wel gewoon kunnen met:
PHP:
1
header("Content-Disposition: attachment; filename=\"".$filename."\"");

Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
Hier zat wel een foutje ($filename), maar dat was het dus niet:
PHP:
36
$body .= "Content-Type: application/pdf; name=\"".$filename."\"\r\n";

(hoezo subtiele kick :p)

Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
Ik kick dit topic, want ik zou toch wel heel graag een oplossing willen zien voor mijn probleem. Onderstaande code heb ik nu. Het PDF bestand wordt goed aangemaakt op de server, want als ik deze met FTP ophaal is deze gewoon te openen in Acrobat Reader. Dus er gaat iets fout bij de de- of encodering of verzending (zie foutmelding in TS). Heb ondertussen al lappen codes en tutorials (o.a. zend.com) doorgespit, maar ik kom er maar niet achter wat er fout is. De mail komt gewoon aan (ook zonder de plain text $message overigens), en het PDF bestand met de juiste grootte (filesize) wordt ge-attached, echter deze is 'corrupted'.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// [Create ezPDF file]

// [Write ezPDF file] 

$filename = 'pdf/output.pdf';

// Read data from file
$handle = fopen($filename, 'rb');
$data = fread($handle,filesize($filename));
fclose($handle); 
$data = chunk_split(base64_encode($data));

// Set some mail headers and text
$recipient = "..."; 
$subject = "Onderwerp"; 
$message = "Test.";

// Create boundary
$mimeBoundary = md5(uniqid(time())); 
    
// MIME header
$header = "MIME-Version: 1.0\r\n";
$header .= "From: ...<...>\r\n"; 
$header .= "Reply-To: ...\r\n";
$header .= "Content-Type: multipart/mixed;";
$header .= " boundary=\"".$mimeBoundary."\"\r\n";
    
// MIME message
$body = "--".$mimeBoundary."\r\n";
$body .= "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n";
$body .= "Content-Transfer-Encoding: 7bit\r\n";
$body .= $message."\r\n";

// Add attachment
$body .= "--".$mimeBoundary."\r\n";
$body .= "Content-Type: application/octetstream;\r\n";
$body .= "Content-Transfer-Encoding: base64\r\n";
$body .= "Content-Disposition: attachment; filename=\"output.pdf\"\n\n";
$body .= $data."\n\n";
$body .= "--".$mimeBoundary."--\r\n\r\n"; 

mail($recipient, $subject, $body, $header);

Acties:
  • 0 Henk 'm!

  • martijn_brinkers
  • Registratie: November 2001
  • Laatst online: 24-01 15:04
Je zou even kunnen proberen om de mail weg te schrijven als .eml (dus voordat je hem gaat versturen) en dan openen in outlook express. Als dat ook niet goed gaat dan ligt het aan het coderen in jouw PHP script. Als dat wel lukt wordt er onderweg (dus van mail server naar mail server) iets aangepast.

Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Misschien een tip om even op zoek te gaan naar de HTML Mime mail class van Richard Heyes.
http://phpclasses.syrned.com/browse/package/32.html
Hierin worden al dit soorrt probleempjes alvast voor je opgelost.
Is goed gedocumenteerd en incl. div. voorbeelden.

Acties:
  • 0 Henk 'm!

  • martijn_brinkers
  • Registratie: November 2001
  • Laatst online: 24-01 15:04
ik zie dat je op sommige plaatsen \n\n gebruikt. MIME specs schrijven \r\n voor dus \n\n moet worden \r\n\r\n. Wie weet ligt het daar aan.

Kan zijn dat je een typefout hebt gemaakt en \r\n bedoelde ipv. \n\n zoals er nu staat. Moet dus \r\n zijn.

[ Voor 29% gewijzigd door martijn_brinkers op 17-03-2004 12:00 ]


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
Bedankt voor de replies :)
[list]
• Eerst wegschrijven naar .eml levert ook een corrupte PDF op, dus gaat er voor het verzenden al iets mis.
• Met \r\n waar \n\n stond en dat soort dingen had ik al vaker geprobeerd (dan kwam er een PDF van enkele bytes uit of er ging iets anders mis), ik heb er nu wel \r\n\r\n van gemaakt. Lijkt in ieder geval beter.

Ik ga nu de link van beetle71 maar eens goed doornemen.

Edit: Overigens, zo komt het eruit te zien:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
MIME-Version: 1.0
From: ...<...>
Reply-To: ...
Content-Type: multipart/mixed; boundary="4569d4ee9d1e2b3acd43aef5554214e7"

--4569d4ee9d1e2b3acd43aef5554214e7
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Test.
--4569d4ee9d1e2b3acd43aef5554214e7
Content-Type: application/octetstream;
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="output.pdf"

JVBERi0xLjMKJeLjz9M.....MTkKJSVFT0YK


--4569d4ee9d1e2b3acd43aef5554214e7--

[ Voor 41% gewijzigd door X-Lars op 17-03-2004 12:14 ]


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
Ik ben er niet uitgekomen. Helaas, maar wil er ook niet al te veel tijd meer in steken, dus heb ik maar gewoon een HTML Mime mail class gebruikt. Vind het een beetje overkill namelijk, misschien strip ik nog wel het één en ander. Het biedt in ieder geval al wel de nodige flexibiliteit, die ik vast nog wel eens nodig ga hebben :)

Acties:
  • 0 Henk 'm!

  • 0528973
  • Registratie: Juni 2003
  • Laatst online: 15-05-2013
Misschien ligt het aan mij, maar als een PDF document inleest met fread ed en dat stop je in $data, en over data doe je chunk_split(base64_encode($data)), dan krijg je als ik het goed lees op de php.net site alleen de eerste 76 characters terug.
string chunk_split ( string body [, int chunklen [, string end]])

chunklen characters (defaults to 76).
lees maar na:
http://nl.php.net/manual/en/function.chunk-split.php

[ Voor 30% gewijzigd door 0528973 op 17-03-2004 13:08 ]

Pascal


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
Euhm.. weet ik zo niet, maar bij mij komt alle data wel over. De filesize is immers correct, maar misschien zegt dat ook wel niet alles. Onderstaande manier heb ik ook wel geprobeerd, maar werkte voor mij niet. Ik denk bij nader inzien dat daar ergens de fout wel eens zou kunnen liggen.
code:
1
2
3
4
5
6
7
$data = '';
if ($handle = fopen($filename, 'rb')) {
    while (!feof($handle)) {
        $data .= fread($handle, 1024);
    }
    fclose($handle);
}

Later meer :)


Edit: ook bij de class die ik gebruik zit een function _getEncodedData($data, $encoding) waarin dat op die manier gebeurd.

[ Voor 26% gewijzigd door X-Lars op 17-03-2004 13:18 ]


Acties:
  • 0 Henk 'm!

  • 0528973
  • Registratie: Juni 2003
  • Laatst online: 15-05-2013
Controleer voor de grap eens de grote van $data direct na het inlezen van het bestand en dan de grootte van $data na
$data = chunk_split(base64_encode($data));
Als hier een verschil inzet(wat ik vermoed) dan heb je de fout :)


Misschien moet je dat veranderen in iets als
[code]
$data = chunk_split(base64_encode($data), strlen($data));
[/code]

Pascal


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
0528973 schreef op 17 maart 2004 @ 13:07:
[...] en over data doe je chunk_split(base64_encode($data)), dan krijg je als ik het goed lees op de php.net site alleen de eerste 76 characters terug. [...]
Dat lees je denk ik toch niet goed IMHO :)
Can be used to split a string into smaller chunks which is useful for e.g. converting base64_encode output to match RFC 2045 semantics. It inserts end (defaults to "\r\n") every chunklen characters (defaults to 76). It returns the new string leaving the original string untouched.
Oftewel, hij verdeelte de string in chunks door er (default) "\r\n" tussen te voegen.

Acties:
  • 0 Henk 'm!

  • 0528973
  • Registratie: Juni 2003
  • Laatst online: 15-05-2013
hmm... idd je hebt helemaal gelijkt.... verkeerd gelezen 8)7

Pascal


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
Nou ja, de manier waarop ik het inlees maakt niet uit. Vanalles geprobeerd. Ik laat het er nu echt even bij.

Acties:
  • 0 Henk 'm!

Verwijderd

ik heb je scriptje getest met een pdf file en het werkt gewoon hoor.
volgens mij is je pdfje brak, bijna onmogelijk dat die base64 encode stuff maar 1 regeltje oplevert in je mail.
check je pdf file.... lijkt me

Acties:
  • 0 Henk 'm!

  • 0528973
  • Registratie: Juni 2003
  • Laatst online: 15-05-2013
Gelukkig ben ik niet de enige die idd die ene regel in je mailtje vreemd vond. Ik dacht niet dat het aan het pdf'je zou liggen maar aan die chunk_split functie, maar nu ik die idd beter gelezen heb zou ik ook zeggen dat het alleen nog maar aan het pdf'je in kwestie kan liggen.

Wordt het desbetreffende pdf'je wel correct gemaild met die mail classe?

Pascal


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
Bedankt voor alle moeite :) De PDF staat goed op de server, de PDF komt per mail ook goed over met de gebruikte class. Maar dus niet met mijn brouwsel, weird dus dat dan wel goed gaat bij woeitje :?

Edit:
code:
1
JVBERi0xLjMKJeLjz9M.....MTkKJSVFT0YK

Is trouwens gewoon ff korter gemaakt voor de overzichtelijkheid, in werkelijkheid krijg ik gewoon de hele bunch aan bytes binnen hoor :)

[ Voor 35% gewijzigd door X-Lars op 17-03-2004 14:21 ]


Acties:
  • 0 Henk 'm!

  • 0528973
  • Registratie: Juni 2003
  • Laatst online: 15-05-2013
Okay, dat had te verwachten geweest...
Btw als het met die classe wel lukt, sla de output daar dan is van op en zoek de verschillen qua aanmaken van het mailtje is uit... Waarschijnlijk is het maar een heel klein iets...

Pascal


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
Sorry dat ik hier niet meer op gereageerd heb. Ik heb besloten de mail class te gebruiken (link naar die class staat hierboven wel ergens). Waarom het wiel opnieuw uitvinden? Het is bovendien makkelijk te hergebruiken (euh.. daar is een class ook voor bedoeld ja) op allerlei manieren, met/zonder html/attachment, etc. Tevens zijn die classes uitvoerig getest op bugs etc. Toch bedankt voor alle reacties! :)
Pagina: 1