[PHP]Mail met een pdf file als bijlage

Pagina: 1
Acties:
  • 509 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • vakantieman
  • Registratie: November 2003
  • Laatst online: 07-08 00:13
Ik ben nu ongeveer alle Topics over PHP, Mail(), PDF enzo gelezen.
Ik heb bijna alles uitgeprobeerd maar niets geeft de oplossing. Ik gebruik nu het onderstaande script om een PDF bestand wat al gemaakt is en goed is( ik kan hem namelijk gewoon openen) te mailen. Ik krijg nu alleen in outlook een hoop shit en in andere emailclients niets.

Dit is mijn script :

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$path = "upload/hello.pdf";
$fp = fopen($path, 'r');
do //we loop until there is no data left
{
       $data = fread($fp, 8192);
       if (strlen($data) == 0) break;
       $content .= $data;
} while (true);

$content_encode = chunk_split(base64_encode($content));
$message .= $content_encode . "\n";
$message .= "--" . $boundary . "\n";

$headers  = "From: \"Me\"<me@here.com>\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"";
mail(me@me.nl', 'Email with attachment from PHP', $message, $headers);
?>


Een fragment uit het bericht wat verstuurd wordt in outlook :
5cGUvWE9iamVjdAovU3VidHlw ZS9JbWFnZQovV2lkdGggMjUwCi9IZWlnaHQgMjI1Ci9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9y U3BhY2UvRGV2aWNlUkdCCi9GaWx0ZXJbL0RDVERlY29kZV0KL0RlY29kZVBhcm1zWzw8Pj5dCi9M Z

Kan iemand mij helpen want ik weet niet wat ik nu nog verkeerd doe?

[ Voor 8% gewijzigd door NMe op 26-04-2005 23:54 . Reden: code tags toegevoegd ]


Acties:
  • 0 Henk 'm!

  • Gwaihir
  • Registratie: December 2002
  • Niet online
Post eens de relevante headers, zo'n fragment halverwege zegt niet veel.

Acties:
  • 0 Henk 'm!

  • vakantieman
  • Registratie: November 2003
  • Laatst online: 07-08 00:13
Dit zijn de internetheaders uit outlook :

Message-ID: <20050426213801.15748.qmail@me.nl>
To: me@me.nl
Subject: Email with attachment from PHP
From: "Me" <me@here.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=""

Het rare halve gedeelte van hierboven staat in het bericht niet in de header.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

$boundary is blijkbaar leeg, nogal wiedes dat ie problemen heeft. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • vakantieman
  • Registratie: November 2003
  • Laatst online: 07-08 00:13
Dat klopt een stukje code stond uit, niet echt slim
de code die ik nu heb is als volgt :
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

$boundary = '-----=' . md5( uniqid ( rand() ) );

$path = "upload/hello.pdf";
$fp = fopen($path, 'r');
do //we loop until there is no data left
{
       $data = fread($fp, 8192);
       if (strlen($data) == 0) break;
       $content .= $data;
} while (true);

$content_encode = chunk_split(base64_encode($content));
$message .= $content_encode . "\n";
$message .= "--" . $boundary . "\n";

$headers  = "From: \"Me\"<me@here.com>\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"";
mail('arjan@2wadd.nl', 'Email with attachment from PHP', $message, $headers);
?>


Het resultaat is nu de volgende header :

From: "Me" <me@here.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="-----=3e346563c6ffaa8171f2268e0689f2cc"

Het mailtje is leeg en er is geen bijlage. Iemand een idee?

Acties:
  • 0 Henk 'm!

  • Kuhlie
  • Registratie: December 2002
  • Niet online
Bekijk eens een normaal mailtje met een attachment en vergelijk die met die van jou. Misschien helpt dat?

Acties:
  • 0 Henk 'm!

  • vakantieman
  • Registratie: November 2003
  • Laatst online: 07-08 00:13
Een header van een mail met een PDF bijlage ziet er als volgr uit :

Content-class: urn:content-classes:message
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----_=_NextPart_001_01C5474F.2C2A7C5C"

Het lijkt erop maar hij is niet hetzelfde, ik heb alleen geen idee hoe nu verder?
Heeft iemand het al voor elkaar?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Probeer eens een newline tussen het contenttype en de boundary?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Misschien een idee om even in de RFC te kijken. Hoofdstuk 7.2 gaat over multipart mail. Twee dingen vielen me op, 1:
The body must then contain one or more "body parts," each preceded by an encapsulation boundary, and the last one followed by a closing boundary.
Boundary moet dus ook vóór een body part worden weergegeven.

en 2:
A body part that starts with a blank line, therefore, is allowed and is a body part for which all default values are to be assumed. In such a case, the absence of a Content-Type header field implies that the corresponding body is plain US-ASCII text.
Elke deel van het bericht dat geen plain-text is zou dus een content-type header moeten krijgen. Na deze header moet een lege regel en dan de data. Je mail body zou er dus ongeveer zo uit moeten zien:

code:
1
2
3
4
5
6
7
8
9
10
11
--boundary
Content-Type: text/plain

**Normale text van het bericht**
--boundary
Content-Type: application/x-pdf (uit het hoofd ;)
Content-Disposition: attachment; filename=bestand.pdf;
Content-transfer-encoding: base64

**base64encoded PDF**
--boundary--

Let op dat de laatste boundary wordt aangegeven met twee hyphens op het eind...

edit:
Content-Disposition is allicht ook handig :)

[ Voor 6% gewijzigd door T-MOB op 27-04-2005 01:53 ]

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Owkee.. nu maar ff getest, zo werkte het bij mij:
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
 //should be a "more unique" string, worked for the test
$boundary = 'afghaghagh';

//read PDF (note the 'rb'for binary mode)
$file = 'file.pdf'; $pdf = '';
$handle = fopen($file,"rb");
while ($tmpstring = fgets($handle, 8096)) { 
    $pdf .= $tmpstring; 
}
fclose($handle);

//base-64 encode the pdf
$pdf = chunk_split(base64_encode($pdf)); 

//recipent email
$recipient = 'email@adrdress.com';

$subject = 'Test email met attachment'; 

$headers  = 'MIME-Version: 1.0' ."\r\n"
          . 'Content-type: multipart/mixed; boundary="' .$boundary .'"' ."\r\n" 
          . 'From: Sender <Sender@domain.com>' ."\r\n"
          . 'To: ' .$recipient ." \r\n"
          . 'Reply-To: Someone@domain.com ' ."\r\n"
          . 'X-Mailer: Herman, PHP4 webserver';

$message = '--' .$boundary ."\r\n"
         . 'Content-Type: text/plain' ."\r\n\r\n"
         . 'Dit is een testje met multipart email' ."\r\n"
         . '--' .$boundary ."\r\n"
         . 'Content-Type: application/pdf' ."\r\n"
         . 'Content-Disposition: attachment; filename=bestand.pdf;' ."\r\n"
         . 'Content-transfer-encoding: base64' ."\r\n\r\n"
         . $pdf ."\r\n"
         . '--' .$boundary .'--';

mail($recipient, $subject, $message, $headers);

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Rac-On
  • Registratie: November 2003
  • Niet online
je zou natuurlijk ook kunnen overwegen het pear-object mail hier voor te gebruiken, ipv het wiel opnieuw uit te vinden...

doet niet aan icons, usertitels of signatures


Acties:
  • 0 Henk 'm!

  • Suepahfly
  • Registratie: Juni 2001
  • Laatst online: 17-09 17:05
ik benz zelf nogal fan van deze mail class

PHP:
1
2
3
4
5
6
7
8
include("libmail.php");
$mail = new Mail;
$mail->From("me@me.tld");
$mail->To("you@you.tld")
$mail->Subject("Hoi een mailtje");
$mail->Body("Dit is een email");
$mail->Attacht("/path/naar/bestand.pdf","x-application/pdf");
$mail->Sent();


Is alles wat je hoeft te doen om een mailtje met attachment te sturen. Hij kan geloof ik ook mixed content aan (text + html) en dingen als Priority, ReplyTo en extra headers

Acties:
  • 0 Henk 'm!

  • PhoeniX-
  • Registratie: Juni 2000
  • Laatst online: 01-09 10:26
rac-on schreef op woensdag 27 april 2005 @ 12:11:
je zou natuurlijk ook kunnen overwegen het pear-object mail hier voor te gebruiken, ipv het wiel opnieuw uit te vinden...
Ik gebruik ook de PEAR modules daarvoor. Mail en Mail_mime doen precies wat ik (en jij denk ik ook) wil. Het stukje code om alles voor elkaar te krijgen is erg simpel:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
include ("./Mail/Mail.php");
include ("./Mail_Mime/mime.php");
$mail = new Mail_mime("\n");
                
$bericht = "Bericht";
$mail->setTXTBody($bericht);
$mail->addAttachment($pdfcontent, 'application/pdf', 'test.pdf', false);
$hdrs = array(
        'From'    => 'bla@bla.nl',
        'Subject' => "Een pdf"
);
$body = $mail->get();
$hdrs = $mail->headers($hdrs);

$send =& Mail::factory('mail');


En daarmee is het eigenlijk gebeurd. ($pdfcontent bevat de filedata voor de pdf)

Acties:
  • 0 Henk 'm!

  • DutchTSE
  • Registratie: Februari 2003
  • Niet online
Hopelijk mag ik even kicken....

Ik heb precies hetzelfde probleem:

Op windows (mailserver argosoft mailserver) werkt het wel prima, op linux (qmail) krijg ik het volgende:
Content-Type: multipart/mixed;
boundary="==Multipart_Boundary_x205e2b3f8f78f942a76db0a9ca4b8d3ex"
This is a multi-part message in MIME format.
--==Multipart_Boundary_x205e2b3f8f78f942a76db0a9ca4b8d3ex
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

[Bericht]

--==Multipart_Boundary_x205e2b3f8f78f942a76db0a9ca4b8d3ex
Content-Type: {application/pdf};
name="[filenaam].pdf"
Content-Transfer-Encoding: base64

JVBERi0xLjMKMyAwIG9iago8PC9UeXBlIC9QYWdlCi9QYXJlbnQgMSAwIFIKL1Jlc291cmNlcyAy
[Knip]

--==Multipart_Boundary_x205e2b3f8f78f942a76db0a9ca4b8d3ex--
Het probleem ligt dus bij qmail, ik kan de mailmethode niet vervangen aangezien het een gecodeerd script is. Oplossing moet dus bij qmail liggen :)

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Probeer eens om de class PHPmailer te gebruiken. Hier heb ik op zowel Windows als Linux veel goede ervaring mee.

Acties:
  • 0 Henk 'm!

  • DutchTSE
  • Registratie: Februari 2003
  • Niet online
Ik kan verder helemaal niks aan de code doen....
Ik ben de end user ervan, en kan niks in de code wijzigen :)

Acties:
  • 0 Henk 'm!

Verwijderd

DutchTSE schreef op maandag 14 november 2005 @ 19:35:
Ik kan verder helemaal niks aan de code doen....
Ik ben de end user ervan, en kan niks in de code wijzigen :)
Je zult zelf de base64 gecodeerde string moeten decoderen, ff zoeken had wel geholpen: Hoe base64 codering opslaan als normaal bestand.
http://en.wikipedia.org/wiki/Base_64
http://makcoder.sourceforge.net/demo/base64.php
http://www.opinionatedgeek.com/dotnet/tools/Base64Decode/
http://www.google.nl/sear...&meta=&btnG=Google+zoeken

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

DutchTSE schreef op maandag 14 november 2005 @ 19:35:
Ik kan verder helemaal niks aan de code doen....
Ik ben de end user ervan, en kan niks in de code wijzigen :)
Wat doe je dan in een programmeerforum? :?

Als je problemen hebt met qmail, stel je vraag dan liever in Non-Windows Operating Systems. Hier in Programming & Webscripting kunnen we je toch niet helpen als je je code niet aan kan passen.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 05-10-2024
Zelf gebruik ik deze: htmlMimeMail

Werkt super met attachments, embedded images, etc, etc

Acties:
  • 0 Henk 'm!

  • DutchTSE
  • Registratie: Februari 2003
  • Niet online
-NMe- schreef op dinsdag 15 november 2005 @ 01:42:
[...]

Wat doe je dan in een programmeerforum? :?

Als je problemen hebt met qmail, stel je vraag dan liever in Non-Windows Operating Systems. Hier in Programming & Webscripting kunnen we je toch niet helpen als je je code niet aan kan passen.
Had ik een nieuw topic gemaakt dan was ik verwezen naar dit topic (exact zelfde probleem namelijk)
Kick ik dit topic wordt ik verwezen naar NWO....

mijn excuses :/

Zal de links ff doornemen, bedankt

edit update: probleem ligt niet aan qmail te liggen, ook niet aan het panel zelf. Als ik naar hccnet emailadres stuur krijg ik netjes bijlage erin. Via me eigen mailserver (argosoft) krijg ik wel probleem, dan krijg ik base64 code te zien ipv bijlage zelf.

[ Voor 19% gewijzigd door DutchTSE op 15-11-2005 16:08 ]

Pagina: 1