为循环中的每个用户生成具有唯一内容的 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);
我希望这对以后的人有所帮助!
我运行正在使用 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);
我希望这对以后的人有所帮助!