欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用phpword实现php生成word文件同时以邮件的形式发送word附件

程序员文章站 2022-05-18 18:36:21
...

新版的phpword支持中文不用再修改插件代码

应客户需求需要在用户创建简历后把简历以附件的形式发送到其指定邮箱,所有想到 先把数据存储到数据库,然后把数据读取出来处理后保存为word文档,然后在以附件的形式发送

刚开始实现的方法是把内容写成html的形式然后保存为word文档,但是这种方式在Foxmail (邮件客户端)上无法预览而且还不能添加水印和页眉等,客户不太满意,就改为使用phpword插件来实现。

phpword英文版文档(我用的谷歌浏览器自带翻译,里面的介绍可以用翻译后的中文查看,复制代码时需先返回英文模式再进行复制):

http://phpword.readthedocs.io/en/latest

插件GitHub地址:

https://github.com/PHPOffice/PHPWord

thinkphp5版

1、将下载的phpoffice 文件放在vender下 

使用phpword实现php生成word文件同时以邮件的形式发送word附件

2、创建单独用于生成word的Makeword.php控制器和word方法

部分代码 (内部的自定义变量根据自己需求自行修改)

<?php
namespace app\index\controller;

use think\Db;
use think\Controller;

class Makeword extends Controller
{
	public function word($arr)
	{
	    Vendor('phpoffice.phpword.bootstrap.php');//导入phpoffice插件
            //创建新文档…
            $phpWord = new \PhpOffice\PhpWord\PhpWord();
            $phpWord->setDefaultFontSize(10.5);
            /* 注意:任何添加到文档的元素都必须位于一个区域内。 */
            // 在文档中添加空白部分…
            $section = $phpWord->addSection();
            //页眉
            $header = $section->addHeader();
        // 将文档保存为OOXML文件…
        $objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007');
        $objWriter->save('uploads/word/resume'.$arr['id'].'.docx');

3、调用生成方法生成word

$makeword =  new Makeword();
                $makeword->word($arr);
                //邮件正文
                $body_data = <<<hoa
                    <p>简历请查看附件</p>
                    <p>(这是一封自动发送的邮件,请不要直接回复)</p>
                    <p><br  />
                    </p>
hoa;
            
                if ($sub_type) {
                    //发送邮件
                    send_mail('****@****.com',$title_name,$body_data,$arr['id']);
                }   
                echo "<script language='javascript' type='text/javascript'> 
                    alert('提交成功');
                    window.location.href = '/index/index/usercenter';
                   </script>"; 

4、send_mail 配置发送邮件方法

在common.php中 配置发送邮件的公共函数(需要添加发送邮件插件),与普通发送邮件函数的区别在于需要开启附件方法

function send_mail($mail_to, $mailsubject, $mailbody,$id){
	Vendor('PHPMailer.PHPMailerAutoload');//邮件插件
    $email_config = db('system')->field('value')->where('name', 'email_config')->find();
	$email_config = unserialize($email_config['value']);
	$address = explode(',',$mail_to);
	
    $mail = new \PHPMailer; //https://github.com/PHPMailer/PHPMailer
    //$mail->SMTPDebug = 3;                         // 启用详细的调试输出
    $mail->isSMTP();                                // 设置邮件程序使用SMTP
    $mail->Host = $email_config['smtp'];                       // 指定主服务器和备份SMTP服务器
    $mail->SMTPAuth = true;                         // 启用SMTP验证
    $mail->CharSet = "UTF-8";                       // 设置邮件编码
    $mail->Username = $email_config['loginname'];               // SMTP username,发件箱
    $mail->Password = $email_config['password'];               // SMTP password,发件箱密码
	$mail->SMTPSecure = 'ssl';                            // Enable TLS encryption, `ssl` also accepted
    $mail->Port = 465;                                 // TCP port to connect to
    $mail->AddAttachment("uploads/word/resume".$id.".docx"); // 添加附件方法(附件所在地址)
    $mail->setFrom($email_config['loginname'],$email_config['sender']);                 //发件人
	foreach($address as $v){
		$mail->addAddress($v);                    // 添加收件人,名称是可选的
	}
    $mail->isHTML(true);                            // 将电子邮件格式设置为HTML
    $mail->Subject = $mailsubject;
    $mail->Body    = $mailbody;
    if(!$mail->send()) {
        // return false;		
        return 'Mailer Error: ' . $mail->ErrorInfo;
    } else {
        return true;
    }
}

注:虽然新版phpword插件支持中文但是对于一些特殊符号仍会无法识别

当有特殊符号时office无法打开word文件

使用phpword实现php生成word文件同时以邮件的形式发送word附件

但是wps可以打开(office和wps部分格式不兼容,一般以office为基准)

wps打开后错误位置显示为

使用phpword实现php生成word文件同时以邮件的形式发送word附件

此处应输入为2-5 但是用户输入成2–5 ,office 无法识别“–” 所以报错

所以对于输入的数据需要做过滤处理

我自己的处理方法是对于一些常见的特殊符号进行替换处理

使用phpword实现php生成word文件同时以邮件的形式发送word附件

其他可根据自己的方法自己做屏蔽处理

部分无法识别符号

使用phpword实现php生成word文件同时以邮件的形式发送word附件

http://www.w3school.com.cn/tags/html_ref_symbols.html