PHP 发送带有 PDF 附件的电子邮件而不创建文件?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2146591/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
PHP Send email with PDF attachment without creating the file?
提问by Samuurai
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. Do I need to create a temporary file, then delete it every time or is there another way to do it?
我希望能够发送附有 PDF 的电子邮件。我是否需要创建一个临时文件,然后每次都删除它,还是有其他方法可以做到?
采纳答案by Pentium10
<?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.
你会注意到这一行
$attachment = chunk_split(base64_encode(file_get_contents('attachment.zip')));,你会改变以适应你的内存文件。
回答by Pekka
It's definitely possible. You could take any PHP mailer class that can handle attachments, and rewrite the addAttachmentfunction where it reads data from file to accept your variable instead.
绝对有可能。您可以采用任何可以处理附件的 PHP 邮件程序类,并重写addAttachment从文件中读取数据的函数以接受您的变量。
Zend_Mailseems to be able to digest strings as attachments directly, without any rewriting.
Zend_Mail似乎能够直接将字符串消化为附件,无需任何重写。

