为循环中的每个用户生成具有唯一内容的 PDF,并将每个 pdf 发送到其相应用户的电子邮件 - php

generate PDFs with unique content for each user in loop and send each pdf to its corresponding user's email - php

我运行正在使用 Wordpress 并且有多个用户。每个用户都应该收到每周报告,其中包含一些仅与该用户相关的独特信息。信息应以 PDF 格式收集(使用 mpdf 生成 pdf)并相应地发送到每个用户的电子邮件。

我有 report.php 文件(我将 运行 这个文件的 cron 作业每周发送报告)这是我的代码:

include('mpdf/mpdf.php');
$mpdf = new mPDF();

$args = array(
    'post_type' => 'users', 
    'post_status' => array( 'publish' ), 
    'order' => 'DESC',
    'posts_per_page'=> -1
);
$list = get_posts($args);
if($list){
    foreach($list as $suppItem){
        $userID = $suppItem->ID;
        ob_start();
        getUserReport($userID); /* this is the function which genarates html content
        for each user because the content of course for each user is unique */

        $x = ob_get_contents();
        ob_end_clean();
        $mpdf->WriteHTML($x);
        $today = date('Y-m-d');
        $pdfName = 'weekly-report-'.$userID.'-'.$today.'.pdf';
        $content = $mpdf->Output($pdfName, 'S');
        $content = chunk_split(base64_encode($content));
        $email = get_field('user_e_mail_address', $userID);
        if($email) {
            $mailto = $email;
        }
        $from_name = 'Website';
        $from_mail = 'info@example.com';
        $replyto = 'info@example.com';
        $uid = md5(uniqid(time())); 
        $subject = 'Weekly report of '.get_the_title($userID);
        $message = 'Attached find this week report.';
        $filename = $pdfName;

        $header = "From: ".$from_name." <".$from_mail.">\r\n";
        $header .= "Reply-To: ".$replyto."\r\n";
        $header .= "MIME-Version: 1.0"."\r\n";
        $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\""."\r\n";
        $finalmessage .= "--".$uid."\r\n";
        $finalmessage .= "Content-type:text/plain; charset=iso-8859-1"."\r\n";
        $finalmessage .= "Content-Transfer-Encoding: 7bit"."\r\n";  
        $finalmessage .= $message."\r\n";
        $finalmessage .= "--".$uid."\r\n";
        $finalmessage .= "Content-Type: application/pdf; name=\"".$filename."\"\r\n";
        $finalmessage .= "Content-Transfer-Encoding: base64\r\n";
        $finalmessage .= "Content-Disposition: attachment; filename=\"".$filename."\""."\r\n";
        $finalmessage .= $content."\r\n";
        $finalmessage .= "--".$uid."--";

        if (mail($mailto, $subject, $finalmessage, $header)) {
            echo 'Sent!';
        } else {
            echo 'error';
        }
    }
}

当我在上面的代码中 运行 时,它会向每个用户发送附有 PDF 的电子邮件,但所有内容都是相同的。 PDF 文件名是预期的,但内容是错误的(循环中的第一项除外)。实际上,第一个用户的电子邮件正文和 PDF 是正确的,但其余用户的 PDF 与第一个用户的内容相同,但有一些空白页。

我尝试将 $content = $mpdf->Output($pdfName, 'S'); 移到 foreach 循环之外,但在这种情况下,它会将所有用户的内容收集在一起并以相同的 PDF 格式发送。但每个用户都应该收到其相应的 PDF。

我想知道我缺少什么 inside/outside 循环,以便它将相应的 PDF 发送到相应的用户电子邮件。

在我看来 ob_get_contents() 每次只检索第一个条目。你能清除 ob_get_contents() 吗?或者您可以尝试 return html 代码作为来自 getUserReport(...)-Method.

的字符串

编辑

...
$html = getUserReport(...);  // get the report
$mpdf->WriteHTML($html);     // write the report to pdf
$html = "";                  // clear the local variable
...

更新:

终于可以用了。我试图将这一行 ($mpdf = new mPDF()) 移动到 foreach 循环中,它起作用了!您可以在下面看到我的代码在循环内的样子:

$mpdf = new mPDF();
ob_start();
getUserReport($userID);
$html = ob_get_contents();
ob_end_clean();
$mpdf->WriteHTML($html);

我希望这对以后的人有所帮助!