php - 通过 PHP 通过电子邮件发送动态创建的 PDF

标签 php email pdf pdf-generation tcpdf

我最近创建了一个在线模板,用于为我们的网站创建招聘信息。一切都已完成,它在浏览器中正确格式化,自动发布到我们的网站,bla bla bla。

我正在创建的最后一 block 是为管理员提供一些选项,以便以一致、方便的方式将帖子分发到不同的地方(通过电子邮件)。我创建了一个 PHP 页面,它使用 TCPDF 库动态创建 PDF 文档。加载 pdf.php?id=X 时,页面会显示一个包含职位发布 X 内容的 PDF。这意味着我永远不会将 PDF 文件保存到服务器,只是在每次调用时即时创建它。

但是我想把这个PDF附在邮件里,发给各个学院,内部邮件列表等。如果我把pdf.php?id=x附在邮件里,它不会附上PDF , 它附加了一个看似空白的文件,名称如上。

是否可以将其附加到电子邮件而不将其保存到服务器?


下面根据 JM4 的响应添加以进一步排除故障。我已经将创建 PDF 文件放入一个函数中,并将其放入一个包含文件中,只是为了让事情更容易管理。

// random hash necessary to send mixed content
$separator = md5(time());

$eol = PHP_EOL;

// attachment name
$filename = "_Desiredfilename.pdf";

include_once('pdf.php');
// encode data (puts attachment in proper format)
$pdfdoc = job_posting_to_pdf($posting_id);
$attachment = chunk_split(base64_encode($pdfdoc));

///////////HEADERS INFORMATION////////////
// main header (multipart mandatory) message
$headers  = "From: Sender_Name<valid_email@mydomain.com>".$eol;
//$headers .= "Bcc: email@domain.com".$eol;
$headers .= "MIME-Version: 1.0".$eol; 
$headers .= "Content-Type: multipart/mixed; boundary=\"".$separator."\"".$eol.$eol; 
$headers .= "Content-Transfer-Encoding: 7bit".$eol;
$headers .= "This is a MIME encoded message.".$eol.$eol;

// message
$headers .= "--".$separator.$eol;
$headers .= "Content-Type: text/html; charset=\"iso-8859-1\"".$eol;
$headers .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$headers .= $message.$eol.$eol;

// attachment
$headers .= "--".$separator.$eol;
$headers .= "Content-Type: application/octet-stream; name=\"".$filename."\"".$eol; 
$headers .= "Content-Transfer-Encoding: base64".$eol;
$headers .= "Content-Disposition: attachment".$eol.$eol;
$headers .= $attachment.$eol.$eol;
$headers .= "--".$separator."--";

//Email message
if(mail('valid_email@mydomain.com', 'test job posting', 'message body goes here', $headers)) {
    echo 'mail sent';
} else {
    echo 'error in email';
}

这是 pdf.php 的精简版:

function job_posting_to_pdf($job_id) {
    require_once(ROOT . 'assets/libs/tcpdf/config/lang/eng.php');
    require_once(ROOT . 'assets/libs/tcpdf/tcpdf.php');
    // create new PDF document
    $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); 

    // set document information
    $pdf->SetCreator(PDF_CREATOR);
    $pdf->SetAuthor('');
    $pdf->SetTitle('OPL Job Posting');
    $pdf->SetSubject('Job Posting');
    $pdf->SetKeywords('TCPDF, PDF, example, test, guide');

    // remove default header/footer
    $pdf->setPrintHeader(false);
    $pdf->setPrintFooter(false);

    // set default monospaced font
    $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

    //set margins
    $pdf->SetMargins(11, PDF_MARGIN_TOP, 11);

    //set auto page breaks
    $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

    //set image scale factor
    $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); 

    //set some language-dependent strings
    $pdf->setLanguageArray($l); 

    // ---------------------------------------------------------

    $pdf->SetFont('times', 'I', 9);
    $pdf->AddPage();

    $left_cell_width = 60;
    $row_height = 6;

    $pdf->Image(ROOT . 'assets/gfx/logos/OPL-Logo.jpg', 0, 5, null, 16, null, null, 'N', false, null,'R');
    $pdf->Ln('3');

    if(!$row['internal']) {
        $pdf->Cell(0,0,'This position will be posted internally and externally, concurrently.',0,2,'C');
    } else {
        $pdf->Cell(0,0,'Internal posting only.',0,2,'C');
    }

    //Remainder of actual PDF creation removed to keep things simple


    return $pdf->Output("", "S");
}

最佳答案

如果我完全明白你在问什么,这就很简单了。我假设您已经使用 fdpf 或 tcpdf 之类的工具生成了 PDF。在这种情况下 - 只需使用以下代码:

<?php
    // random hash necessary to send mixed content
    $separator = md5(time());

    $eol = PHP_EOL;

    // attachment name
    $filename = "_Desiredfilename.pdf";

    // encode data (puts attachment in proper format)
    $pdfdoc = $pdf->Output("", "S");
    $attachment = chunk_split(base64_encode($pdfdoc));

    ///////////HEADERS INFORMATION////////////
    // main header (multipart mandatory) message
    $headers  = "From: Sender_Name<sender@domain.com>".$eol;
    $headers .= "Bcc: email@domain.com".$eol;
    $headers .= "MIME-Version: 1.0".$eol; 
    $headers .= "Content-Type: multipart/mixed; boundary=\"".$separator."\"".$eol.$eol; 
    $headers .= "Content-Transfer-Encoding: 7bit".$eol;
    $headers .= "This is a MIME encoded message.".$eol.$eol;

    // message
    $headers .= "--".$separator.$eol;
    $headers .= "Content-Type: text/html; charset=\"iso-8859-1\"".$eol;
    $headers .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
    $headers .= $message.$eol.$eol;

    // attachment
    $headers .= "--".$separator.$eol;
    $headers .= "Content-Type: application/octet-stream; name=\"".$filename."\"".$eol; 
    $headers .= "Content-Transfer-Encoding: base64".$eol;
    $headers .= "Content-Disposition: attachment".$eol.$eol;
    $headers .= $attachment.$eol.$eol;
    $headers .= "--".$separator."--";


    //Email message
    mail($emailto, $emailsubject, $emailbody, $headers);

    ?>

关于php - 通过 PHP 通过电子邮件发送动态创建的 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3525236/

相关文章:

php - 在同一环境中运行的 2 个版本的 PHP 之间丢失

java - 在 Java 中创建 pdf、svg 和高分辨率 img - 开罗?其他解决方案?

pdf - 如何使用非 ASCII 编码从 PDF 中剪切粘贴?

php - Wordpress 通过电子邮件获取用户 ID

php - 从 https 站点发送和接收数据

ruby-gmail : Uncaught exception: 534-5. 7.14 <https ://accounts. google.com/ContinueSignIn?sarp=1&scc=1&plt=AKgnsbtMk

java - 如何通过 JAVA 发送包含动态链接的 HTML 电子邮件

javascript - Intel XDK 将 pdf 保存到 SD 卡 filetransfer.download - android

php - 链接到静态页面

email - spamassassin 停止转发垃圾邮件