简体   繁体   English

PHP发送包含PDF附件的电子邮件而不创建文件?

[英]PHP Send email with PDF attachment without creating the file?

I generate PDF's using FPDF and I need to email it to a customer. 我使用FPDF生成PDF,我需要通过电子邮件发送给客户。

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. 由于我可以从数据库生成PDF,因此我不想在本地保存所有PDF,因为它会使我的服务器变得杂乱无章。

I want to be able to send an email with a PDF attached. 我希望能够发送附有PDF的电子邮件。 Do I need to create a temporary file, then delete it every time or is there another way to do it? 我是否需要创建一个临时文件,然后每次都删除它还是有另一种方法吗?

    <?php 
//define the receiver of the email 
$to = 'youraddress@example.com'; 
//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: webmaster@example.com\r\nReply-To: webmaster@example.com"; 
//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'))); 你会注意到这行$attachment = chunk_split(base64_encode(file_get_contents('attachment.zip'))); and you change to suit your in memory file. 并更改以适合您的内存文件。

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. 您可以使用任何可以处理附件的PHP邮件程序类,并重写addAttachment函数,它从文件中读取数据以接受您的变量。

Zend_Mail seems to be able to digest strings as attachments directly, without any rewriting. Zend_Mail似乎能够直接将字符串作为附件进行消化,而无需任何重写。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM