PDF als bijlage versturen in email
Martijn1989 - 11/08/2008 01:10 (laatste wijziging 15/09/2008 02:34)
PHP ver gevorderde
Beste,
Ik ben al een tijdje bezig met het versturen van een email met daarin een dynamische pdf die eerst word opgeslagen op de server. (Dit alles voor een facturatie systeem waarbij facturen naar de klant worden gestuurd.)
De code die ik gebruik om de email te versturen ziet er zo uit :
<?php
//Mailen
$Settings[ 'email' ][ 'to' ] = $object_klant['emailadres'];
$Settings[ 'email' ][ 'from' ] = $gebruikersinfo['factuur-email-naam'] ."<". $gebruikersinfo['factuur-email-email'] .">";
$Settings[ 'email' ][ 'subject' ] = factuur_email($gebruikersinfo['factuur-email-onderwerp'], in($_GET['klant']));
$Settings[ 'email' ][ 'message' ] = factuur_email(nl2br($gebruikersinfo['factuur-email-bericht']), in($_GET['klant']));
$Rand = md5( time( ) );
$Headers = "From: " . $Settings[ 'email' ][ 'from' ];
$Mime = "==Multipart_Boundary_x{$Rand}x";
$Headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$Mime}\"";
$Message = "This is a multi-part message in MIME format.\n\n--{$Mime}\nContent-Type:text/html; charset=\"iso-8859-1\"\nContent-Transfer-Encoding: 7bit\n\n" . $Settings[ 'email' ][ 'message' ] . "\n\n";
/********************************************** Attachments ********************************************/
//Attachment toevoegen
$bestandsnaam = "facturen/bestanden/". _id ."/". factuur_email("{factuurnummer}", in($_GET['klant'])) .".pdf";
$Handle = fopen($bestandsnaam, 'rb');
$Data = fread( $Handle, filesize($bestandsnaam) );
fclose( $Handle );
$Attachment = chunk_split( base64_encode( $Data ) );
$Message .= "--{$Mime}\n" . "Content-Type: {application/pdf};\n" . " name=\"". factuur_email("{factuurnummer}", in($_GET['klant'])) .".pdf\"\n" . "Content-Transfer-Encoding: base64\n\n" . $Attachment . "\n\n" . "--{$Mime}\n";
/********************************************** End of File Config ********************************************/
if( mail( $Settings[ 'email' ][ 'to' ], $Settings[ 'email' ][ 'subject' ], $Message, $Headers ) )
{
//etc
}
?>
<?php
//Mailen
$Settings [ 'email' ] [ 'to' ] = $object_klant [ 'emailadres' ] ;
$Settings [ 'email' ] [ 'from' ] = $gebruikersinfo [ 'factuur-email-naam' ] . "<" . $gebruikersinfo [ 'factuur-email-email' ] . ">" ;
$Settings [ 'email' ] [ 'subject' ] = factuur_email( $gebruikersinfo [ 'factuur-email-onderwerp' ] , in( $_GET [ 'klant' ] ) ) ;
$Settings [ 'email' ] [ 'message' ] = factuur_email
( nl2br ( $gebruikersinfo [ 'factuur-email-bericht' ] ) , in
( $_GET [ 'klant' ] ) ) ;
$Headers = "From: " . $Settings [ 'email' ] [ 'from' ] ;
$Mime = "==Multipart_Boundary_x{$Rand} x" ;
$Headers .= "\n MIME-Version: 1.0\n " . "Content-Type: multipart/mixed;\n " . " boundary=\" {$Mime} \" " ;
$Message = "This is a multi-part message in MIME format.\n \n --{$Mime} \n Content-Type:text/html; charset=\" iso-8859-1\" \n Content-Transfer-Encoding: 7bit\n \n " . $Settings [ 'email' ] [ 'message' ] . "\n \n " ;
/********************************************** Attachments ********************************************/
//Attachment toevoegen
$bestandsnaam = "facturen/bestanden/" . _id . "/" . factuur_email( "{factuurnummer}" , in( $_GET [ 'klant' ] ) ) . ".pdf" ;
$Handle = fopen ( $bestandsnaam , 'rb' ) ;
$Message .= "--{$Mime} \n " . "Content-Type: {application/pdf};\n " . " name=\" " . factuur_email( "{factuurnummer}" , in( $_GET [ 'klant' ] ) ) . ".pdf\" \n " . "Content-Transfer-Encoding: base64\n \n " . $Attachment . "\n \n " . "--{$Mime} \n " ;
/********************************************** End of File Config ********************************************/
if ( mail ( $Settings [ 'email' ] [ 'to' ] , $Settings [ 'email' ] [ 'subject' ] , $Message , $Headers ) ) {
//etc
}
?>
Het punt is alleen dat hij de attachment niet altijd goed toevoegt en soms een corrupt file van maar een paar kleine kbtjes meestuurt terwijl het 500kb ongeveer moet zijn. Iemand een idee waar het mis gaat of mis kan gaan?
Alvast bedankt, Martijn
14 antwoorden
Gesponsorde links
vinTage - 11/08/2008 01:25 (laatste wijziging 11/08/2008 01:27)
Nieuw lid
Ik heb ooit eens iets gemaakt voor iemand anders, mischien dat je een stukkie eruit kan slopen wat het verschil maakt ?
$eol="\r\n";
$headers = 'From: '.$_POST['naam'].'<'.$_POST['email'].'>'.$eol;
$headers .= 'Reply-To: '.$_POST['naam'].'<'.$_POST['email'].'>'.$eol;
$headers .= 'Return-Path: '.$_POST['naam'].'<'.$_POST['email'].'>'.$eol;
$headers .= 'Message-ID: <'.time().'-'.$_POST['email'].'>'.$eol;
$headers .= 'X-Mailer: PHP v'.phpversion().$eol;
$headers .= "X-Sender-IP: ".$_SERVER['REMOTE_ADDR'].$eol;
$headers .= 'MIME-Version: 1.0'.$eol;
$boundary = md5(time());
$fp = fopen($_FILES['file']['tmp_name'],'r');
$bestand = fread($fp,$_FILES['file']['size']);
fclose($fp);
$headers .= 'Content-Type: multipart/mixed; boundary="'.$boundary.'"'.$eol;
$headers .= 'This is a multi-part message in MIME format.'.$eol;
$headers .= '--'.$boundary.$eol;
//dit gaat in de body van de mail
$headers .= 'Content-type: text/html; charset=iso-8859-1'.$eol;
$headers .= '--'.$boundary.$eol;
$headers .= $bericht;
$headers .= '--'.$boundary.$eol;
//de attachment
$headers .= 'Content-Transfer-Encoding: 7bit'.$eol;
$headers .= 'Content-type: application/octet-stream name="'.$_FILES['file']['name'].'"'.$eol;
$headers .= 'Content-transfer-encoding: base64'.$eol;
$headers .= 'Content-Disposition: attachment; filename="'.$_FILES['file']['name'].'"'.$eol;
$headers .= chunk_split(base64_encode($bestand ));
$headers .= '--'.$boundary.$eol;
//de body param is leeg, omdat we meerdere boundarys hebben gaat het bericht nu in de header
mail($naar, $_POST['onderwerp'], '', $headers);
$eol = "\r \n " ;
$headers = 'From: ' . $_POST [ 'naam' ] . '<' . $_POST [ 'email' ] . '>' . $eol ;
$headers .= 'Reply-To: ' . $_POST [ 'naam' ] . '<' . $_POST [ 'email' ] . '>' . $eol ;
$headers .= 'Return-Path: ' . $_POST [ 'naam' ] . '<' . $_POST [ 'email' ] . '>' . $eol ;
$headers .= 'Message-ID: <' . time ( ) . '-' . $_POST [ 'email' ] . '>' . $eol ; $headers .= "X-Sender-IP: " . $_SERVER [ 'REMOTE_ADDR' ] . $eol ;
$headers .= 'MIME-Version: 1.0' . $eol ;
$fp = fopen ( $_FILES [ 'file' ] [ 'tmp_name' ] , 'r' ) ; $bestand = fread ( $fp , $_FILES [ 'file' ] [ 'size' ] ) ;
$headers .= 'Content-Type: multipart/mixed; boundary="' . $boundary . '"' . $eol ;
$headers .= 'This is a multi-part message in MIME format.' . $eol ;
$headers .= '--' . $boundary . $eol ;
//dit gaat in de body van de mail
$headers .= 'Content-type: text/html; charset=iso-8859-1' . $eol ;
$headers .= '--' . $boundary . $eol ;
$headers .= $bericht ;
$headers .= '--' . $boundary . $eol ;
//de attachment
$headers .= 'Content-Transfer-Encoding: 7bit' . $eol ;
$headers .= 'Content-type: application/octet-stream name="' . $_FILES [ 'file' ] [ 'name' ] . '"' . $eol ;
$headers .= 'Content-transfer-encoding: base64' . $eol ;
$headers .= 'Content-Disposition: attachment; filename="' . $_FILES [ 'file' ] [ 'name' ] . '"' . $eol ;
$headers .= '--' . $boundary . $eol ;
//de body param is leeg, omdat we meerdere boundarys hebben gaat het bericht nu in de header
mail ( $naar , $_POST [ 'onderwerp' ] , '' , $headers ) ;
edit: never mind, dit ging over een mail met bijlage....
ThAlmighty - 11/08/2008 10:31
HTML beginner
Volgens mij kan je geen pure PDF naar iemand sturen, dus moet altijd via een attachment. If so, dan moet je Vintages oplossing hebben, of allicht overwegen een Mail classes te gebruiken
Martijn1989 - 11/08/2008 12:42
PHP ver gevorderde
Hey ..
Dat van vintage wil niet werken. Ik merk trouwens op dat de pdf wel goed word geopend in hotmail maar niet in mijn webmail. Komt dat omdat hij verkeerd verstuurd word in de richting van splitdata etc?
Guardian - 14/09/2008 19:32
Nieuw lid
@ vinTage:
Zou je mij even het volledige scriptje kunnen/willen sturen?
Dan kan ik dit eens bekijken, ik wil namelijk zelf een contact formuliertje verzenden met bijlage (.doc of .pdf)
Dank bij voorbaat
vinTage - 14/09/2008 19:39
Nieuw lid
Dat complete form is met capthca en heel de resum, maar aan bovenstaande code zou je toch voldoende moeten hebben, alleen nog een formuliertje eromheen kiepen.
Guardian - 14/09/2008 20:06 (laatste wijziging 14/09/2008 21:31)
Nieuw lid
VvinTage (en anderen)
Ik heb je code even trachten te implementen.
Jammer genoeg enkele problemen.
De content van mijn email wordt weergegeven maar met nog een hoop technische gegevens erbij.
De bijlage komt niet mee door jammer genoeg.
Hierbij mijn code:
Plaatscode: 26138
vinTage - 14/09/2008 21:58 (laatste wijziging 14/09/2008 21:59)
Nieuw lid
enctype meegeven aan je formulier, dat moet altijd als je attachments meestuurt.
edit:
<form action="<?php echo $_SERVER['REQUEST_URI']; ?>" enctype="multipart/form-data" method="post">
<form action = "<?php echo $_SERVER['REQUEST_URI']; ?> " enctype="multipart/form-data" method="post">
Guardian - 14/09/2008 22:45
Nieuw lid
jammer genoeg zelfde result...
Dit is de tekst die ik in mn mail krijg:
KOMT DIT AAN?--6f79968474d348b441dc155e9bf53f17 Content-Transfer-Encoding: 7bit Content-type: application/octet-stream name="" Content-transfer-encoding: base64 Content-Disposition: attachment; filename=""
de komt dit aan is wat ik als bericht meegaf.
Aar - 15/09/2008 09:32
PHP interesse
Waarom zelf znou lopen klooien met headers. Gebruik anders gewoon een mail-handler zoals phpmailer.
Guardian - 24/09/2008 23:14 (laatste wijziging 28/09/2008 19:13)
Nieuw lid
Ik ben aan de slag gegaan met phpmailer,
de mail is wederom goed verzonden maar de attachment komt niet door.
Graag een beetje hulp:
require("classes/class.phpmailer.php");
$mail = new PHPMailer(); // defaults to using php "mail()"
$body = "test";
$mail->From = "mijnserver@mijnserver.be";
$mail->FromName = "First Last";
$mail->Subject = "PHPMailer Test Subject via mail()";
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
$mail->MsgHTML($body);
$mail->AddAddress("mijnemail@hotmail.com", "John Doe");
$mail->AddAttachment($_FILES['file']['tmp_name']); // attachment
if(!$mail->Send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
} else {
echo "Message sent!";
}
require("classes/class.phpmailer.php");
$mail = new PHPMailer(); // defaults to using php "mail()"
$body = "test";
$mail->From = "mijnserver@mijnserver.be";
$mail->FromName = "First Last";
$mail->Subject = "PHPMailer Test Subject via mail()";
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
$mail->MsgHTML($body);
$mail->AddAddress("mijnemail@hotmail.com", "John Doe");
$mail->AddAttachment($_FILES['file']['tmp_name']); // attachment
if(!$mail->Send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
} else {
echo "Message sent!";
}
Alvast bedankt
[edit]
Kickje?
Gesponsorde links
Dit onderwerp is gesloten .