php发送邮件加附件及pdf生成

这篇博客介绍了如何在PHP中使用Composer安装mpdf和PHPMailer库来发送带有附件的邮件,并生成PDF文件。文章详细讲解了配置SMTP服务器、添加附件、处理邮件样式与PDF样式差异、处理图片路径等问题,还提供了代码示例,包括发送邮件和生成PDF的函数。同时,提到了在使用Gmail发送邮件时可能遇到的问题及解决办法。
摘要由CSDN通过智能技术生成

材料

  1. 下载mpdf
    命令:composer require mpdf/mpdf
    如不能下载,在这个地址下载
    链接:https://pan.baidu.com/s/1sjX0iDY7wabf0x8iUdYS6w
    提取码:m915
    在composer.json文件中添加内容,然后执命令:composer dump-autoload
    在这里插入图片描述

  2. PHPMailer 自行下载

注意

  1. 邮件附件的路径为本地文件路径(其他路径可以使用AddStringAttachment方法,本人使用的是本地路径,外部路径未亲测)
  2. 邮件发送的样式和生成pdf文件的样式需要分开写,因为邮件对html的样式支持比pdf 样式支持好,邮件内容写的样式,pdf文件中有些不支持,本人在使用中就遇到块级元素嵌套后只有一级块元素的left,top属性生效,嵌套的样式并未生效(mpdf手册:官网地址,可查看支持的样式)
  3. 使用gmail 邮箱发送邮件在国内服务器会出现无法完成鉴权或请求超时,更换成大陆以外服务器就可以了
  4. 发送附件中的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’]);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值