Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP Send email with PDF attachment without creating the file?

Tags:

file

php

email

pdf

I generate PDF's using FPDF and I need to email it to a customer.

Since I can generate the PDF's from the DB, I don't want to save all the PDF's locally as it will clutter up my server.

I want to be able to send an email with a PDF attached. Do I need to create a temporary file, then delete it every time or is there another way to do it?

like image 793
Samuurai Avatar asked Jan 27 '10 11:01

Samuurai


2 Answers

    <?php 
//define the receiver of the email 
$to = '[email protected]'; 
//define the subject of the email 
$subject = 'Test email with attachment'; 
//create a boundary string. It must be unique 
//so we use the MD5 algorithm to generate a random hash 
$random_hash = md5(date('r', time())); 
//define the headers we want passed. Note that they are separated with \r\n 
$headers = "From: [email protected]\r\nReply-To: [email protected]"; 
//add boundary string and mime type specification 
$headers .= "\r\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\""; 
//read the atachment file contents into a string,
//encode it with MIME base64,
//and split it into smaller chunks
$attachment = chunk_split(base64_encode(file_get_contents('attachment.zip'))); 
//define the body of the message. 
ob_start(); //Turn on output buffering 
?> 
--PHP-mixed-<?php echo $random_hash; ?>  
Content-Type: multipart/alternative; boundary="PHP-alt-<?php echo $random_hash; ?>" 

--PHP-alt-<?php echo $random_hash; ?>  
Content-Type: text/plain; charset="iso-8859-1" 
Content-Transfer-Encoding: 7bit

Hello World!!! 
This is simple text email message. 

--PHP-alt-<?php echo $random_hash; ?>  
Content-Type: text/html; charset="iso-8859-1" 
Content-Transfer-Encoding: 7bit

<h2>Hello World!</h2> 
<p>This is something with <b>HTML</b> formatting.</p> 

--PHP-alt-<?php echo $random_hash; ?>-- 

--PHP-mixed-<?php echo $random_hash; ?>  
Content-Type: application/zip; name="attachment.zip"  
Content-Transfer-Encoding: base64  
Content-Disposition: attachment  

<?php echo $attachment; ?> 
--PHP-mixed-<?php echo $random_hash; ?>-- 

<?php 
//copy current buffer contents into $message variable and delete current output buffer 
$message = ob_get_clean(); 
//send the email 
$mail_sent = @mail( $to, $subject, $message, $headers ); 
//if the message is sent successfully print "Mail sent". Otherwise print "Mail failed" 
echo $mail_sent ? "Mail sent" : "Mail failed"; 
?>

you will notice this line $attachment = chunk_split(base64_encode(file_get_contents('attachment.zip'))); and you change to suit your in memory file.

like image 114
Pentium10 Avatar answered Nov 03 '22 10:11

Pentium10


It's definitely possible. You could take any PHP mailer class that can handle attachments, and rewrite the addAttachment function where it reads data from file to accept your variable instead.

Zend_Mail seems to be able to digest strings as attachments directly, without any rewriting.

like image 36
Pekka Avatar answered Nov 03 '22 10:11

Pekka