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

时间:2017-01-24 09:26:42

标签: php wordpress email pdf mpdf

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

我有report.php文件(我将在此文件上运行cron job以每周发送报告),这是我的代码:

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。

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

2 个答案:

答案 0 :(得分:1)

<强>更新

最后它正在运作。我试图将这一行($mpdf = new mPDF())移动到foreach循环中,它可以工作!下面你可以看到我的代码在内部循环中的样子:

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

我希望这将有助于将来的某个人!

答案 1 :(得分:0)

在我看来,ob_get_contents()每次只检索第一个条目。你能清楚ob_get_contents()吗?或者您可以尝试将html代码作为字符串从getUserReport(...) - Method。

返回

修改

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