为循环中的每个用户生成具有唯一内容的pdf,并将每个pdf发送给相应的用户';s电子邮件-php
我正在运行Wordpress,有多个用户。每个用户都应该收到每周报告,其中包含一些仅与该用户相关的唯一信息。应以PDF格式收集信息(使用mpdf生成PDF),并相应地发送给每个用户的电子邮件 我有report.php文件(我将在此文件上运行cron作业以每周发送报告),下面是我的代码:为循环中的每个用户生成具有唯一内容的pdf,并将每个pdf发送给相应的用户';s电子邮件-php,php,wordpress,email,pdf,mpdf,Php,Wordpress,Email,Pdf,Mpdf,我正在运行Wordpress,有多个用户。每个用户都应该收到每周报告,其中包含一些仅与该用户相关的唯一信息。应以PDF格式收集信息(使用mpdf生成PDF),并相应地发送给每个用户的电子邮件 我有report.php文件(我将在此文件上运行cron作业以每周发送报告),下面是我的代码: include('mpdf/mpdf.php'); $mpdf = new mPDF(); $args = array( 'post_type' => 'users', 'post_st
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';
}
}
}
include('mpdf/mpdf.php');
$mpdf=新的mpdf();
$args=数组(
“post_类型”=>“用户”,
“发布状态”=>数组(“发布”),
“订单”=>“描述”,
“每页帖子”=>-1
);
$list=get_posts($args);
如果($列表){
foreach($supplitem列为$supplitem){
$userID=$suppItem->ID;
ob_start();
getUserReport($userID);/*这是生成html内容的函数
因为每个用户的课程内容都是唯一的*/
$x=ob_get_contents();
ob_end_clean();
$mpdf->WriteHTML($x);
$today=日期('Y-m-d');
$pdfName='weekly report-'.$userID.-'.$today..pdf';
$content=$mpdf->Output($pdfName,'S');
$content=chunk_split(base64_encode($content));
$email=get_字段('user_e_mail_address',$userID);
如果($电子邮件){
$mailto=$email;
}
$from_name='网站';
$from_mail='10〕info@example.com';
$replyto='1〕info@example.com';
$uid=md5(uniqid(time());
$subject='Weekly report of'。获取标题($userID);
$message='附加的查找本周报告';
$filename=$pdfName;
$header=“From:”.$From\u name.\r\n”;
$header.=“回复:”.$replyto.\r\n”;
$header.=“MIME版本:1.0”“\r\n”;
$header.=“内容类型:多部分/混合;边界=\”“。$uid.\”“。\r\n”;
$finalmessage.=“-”$uid.\r\n”;
$finalmessage.=“内容类型:text/plain;charset=iso-8859-1”“\r\n”;
$finalmessage.=“内容传输编码:7bit”“\r\n”;
$finalmessage.=$message.“\r\n”;
$finalmessage.=“-”$uid.\r\n”;
$finalmessage.=“内容类型:应用程序/pdf;名称=\”.$filename.\”\r\n”;
$finalmessage.=“内容传输编码:base64\r\n”;
$finalmessage.=“内容处置:附件;文件名=\”“.$filename.\”“.\r\n”;
$finalmessage.=$content.\r\n;
$finalmessage.=“--”“$uid.”--”;
if(邮件($mailto,$subject,$finalmessage,$header)){
回音‘已发送!’;
}否则{
回声“错误”;
}
}
}
当我运行上述代码时,它会向每个用户发送电子邮件,并附上PDF,但所有用户的内容都是相同的。PDF文件名是预期的,但内容错误(循环中的第一项除外)。实际上,第一个用户的电子邮件正文和PDF是正确的,但rest用户的PDF和第一个用户的内容相同,有一些空白页
我试图移动$content=$mpdf->Output($pdfName,'S')代码>在foreach循环之外,但在这种情况下,它会将所有用户的内容收集在一起,并以相同的PDF格式发送。但每个用户都应该收到相应的PDF
我想知道我在循环内部/外部遗漏了什么,以便它将相应的PDF发送到相应的用户电子邮件。在我看来ob\u get\u contents()
每次只检索第一个条目。你能清除ob\u get\u contents()
吗?或者您可以尝试从getUserReport(…)
-方法以字符串形式返回html代码
编辑
...
$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);
我希望这将有助于未来的人 我尝试从
getUserReport()
函数返回html,它正确返回每个用户的信息@Patrick vogtt这太棒了。如果你把html放在WriteHTML(html)
函数中,它就不工作了?它工作了。问题是在发送电子邮件时,我在mu问题中描述了如何发送电子邮件到每个用户的电子邮件,但PDF内容是相同的@Patrick Vogtc你能在我的回复帖子编辑中尝试吗?可能您必须在WriteHTML(…)
函数之后清除局部变量。我尝试过,但结果相同。ob_start()$html=getSupplierReport($supplId)$html=ob_get_contents();ob_end_clean()$mpdf->WriteHTML($html)$html=“”代码>。如果没有ob\u get\u contents()
它根本不起作用@Patrick Vogtwritevar\u dump($x)代码>在ob_end_clean()之后代码>结果会是什么?它返回每个用户的内容@EniGmaeverything我echo
或var\u dump
在这个页面中工作得非常好。但当分别向每个用户发送pdf时,它无法正常工作@谜你必须添加$mpdf->Output();退出
在if(mail($mailto,$subject,$finalmessage,$header)){}else{}
之后,我的意思是在循环的末尾!我添加了,但现在它根本不能正常工作:pdf是空的,只有第一个用户收到带有空pdf的电子邮件@谜