材料
-
下载mpdf
命令:composer require mpdf/mpdf
如不能下载,在这个地址下载
链接:https://pan.baidu.com/s/1sjX0iDY7wabf0x8iUdYS6w
提取码:m915
在composer.json文件中添加内容,然后执命令:composer dump-autoload
-
PHPMailer 自行下载
注意
- 邮件附件的路径为本地文件路径(其他路径可以使用AddStringAttachment方法,本人使用的是本地路径,外部路径未亲测)
- 邮件发送的样式和生成pdf文件的样式需要分开写,因为邮件对html的样式支持比pdf 样式支持好,邮件内容写的样式,pdf文件中有些不支持,本人在使用中就遇到块级元素嵌套后只有一级块元素的left,top属性生效,嵌套的样式并未生效(mpdf手册:官网地址,可查看支持的样式)
- 使用gmail 邮箱发送邮件在国内服务器会出现无法完成鉴权或请求超时,更换成大陆以外服务器就可以了
- 发送附件中的pdf文件中如果有图片,需要添加服务器上的图片路径,服务器上下载生成的pdf文件需要转成服务器绝对路径 (我这里出现了邮件内容中图片能显示,附件中pdf文件中图片无法显示,在服务器上点击下载pdf文件按钮,出现无法下载情况,就是没有转绝对路径的原因)
代码
/**
* 发送邮件
* @param $user_email 接受者邮箱
* @param $title 邮件标题
* @param $content 邮件内容
* @param $path pdf路径(本地文件路径)
* @return string 返回生成的PDF文件内容
*/
public static function sendEmail($user_email,$title,$content,$path)
{
require "../extend/PHPMailer/class.phpmailer.php";
$mail = new \PHPMailer(); //实例化
$mail->IsSMTP(); // 启用SMTP
$mail->SMTPDebug = 0;
$mail->Host = "smtp.163.com"; //SMTP服务器 以163邮箱为例子
$mail->SMTPSecure = 'ssl';
$mail->Port = 465; //邮件发送端口
$mail->SMTPAuth = true; //启用SMTP认证
$mail->CharSet = "UTF-8"; //字符集
$mail->Encoding = "base64"; //编码方式
$mail->Username = config('email.web_email'); //你的邮箱
$mail->Password = config('email.web_email_pass'); //你的密码
$mail->Subject = $title; //邮件标题
$mail->From = config('email.web_email'); //发件人地址(也就是你的邮箱)
$mail->FromName = ""; //发件人姓名
$mail->AddAddress($user_email, "");//添加收件人(地址,昵称)
$res = $mail->AddAttachment($path,'PROOF OF DELIVERY.pdf'); // 添加附件,并指定名称
// $res = $mail->AddStringAttachment($path, '23c3db08b40878e3d523672820c46fa41.pdf');
$mail->IsHTML(true); //支持html格式内容
//$mail->AddEmbeddedImage("logo.jpg", "my-attach", "logo.jpg"); //设置邮件中的图片
$text = $content;
$mail->Body = $text;
//发送
if(!$mail->Send()) {
//echo "Mailer Error: " . $mail->ErrorInfo;
return array('error' => $mail->ErrorInfo);
}else{
return true;
}
}
/**
* 生成pdf文件
* @param $html html文件内容
* @param $path pdf存放位置
* @param $w 宽度
* @param $h 高度
* @return string 返回生成的PDF文件内容
*/
function gen_bill_pdf_content($html,$PATH='pdf',$w=414,$h=736) {
$mpdf = new Mpdf();
$mpdf->SetDisplayMode('fullpage');
$mpdf->autoScriptToLang = true;
$mpdf->autoLangToFont = true;
$mpdf->WriteHTML($html);
$path = 'pdf/'.md5(time()).'.pdf';
$res = $mpdf->Output($path, \Mpdf\Output\Destination::FILE);
return $path;
}
调用
$pdf = gen_bill_pdf_content($content);
// 记录附件地址共管理员下载
$pdf_path = $host . '/' . $pdf;
Db::name('item_order')
->where('id', $orderInfo['id'])
->update(['pdf_path' => $pdf_path])
$pdf = '/www/wwwroot/tianyikuaiyun/public/' . $pdf;
$res = EmailSend::sendEmail($orderInfo['email'], '订单信息', $email_content, $pdf);
管理后台进行pdf下载
/**
* 下载
* @param int id 订单id 1
* @auth xuefeiniao
* @date 2021/9/5 22:04
*/
public function download($id)
{
$filename = Db::name('item_order')
->where('id', $id)
->value('pdf_path');
// 转换服务器绝对路径
$replacePath = '/www/wwwroot/tianyikuaiyun/public';
$urlInfo = parse_url($filename);
$replaceUrl = $urlInfo['scheme'].'://'.$urlInfo['host'];
$filename = str_replace($replaceUrl,$replacePath,$filename);
// http headers
header('Content-Type: application-x/force-download');
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
header('Content-length: ' . filesize($filename));
// for IE6
if (false === strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6')) {
header('Cache-Control: no-cache, must-revalidate');
}
header('Pragma: no-cache');
// read file content and output
return readfile($filename);;
}
补充设置pdf字体
$mpdf = new Mpdf([‘default_font’ => ‘arial’]);