专栏首页Web技术布道师使用php-mime-mail-parser解析邮件扩展格式的doc文件

使用php-mime-mail-parser解析邮件扩展格式的doc文件

有一种 doc 文件, office word 可以正常打开,但当你想像其他 doc 文件一样使用 libreoffice 去操作它的时候会发现里面全是字符串,使用一个编辑器(比如 Sublime Text )打开后发现,里面的内容是这样的:

From:<由XXX 生成>
Subject: Resume
MIME-Version:1.0
X-51JOB-FLAG:EhireExport_20190527_15590388
Content-Type:multipart/related;boundary="--boundary_0_9ed30801b0c180c69b3c5d74fede848e"

----boundary_0_9ed30801b0c180c69b3c5d74fede848e
Content-Type:text/html;charset="gb2312"
Content-Transfer-Encoding:base64


PGh0bWw+PGJvZHk+PHRhYmxlIHdpZHRoPSc3MDInIGhlaWdodD0nNjInIGJvcmRlcj0nMCcgYWxp
Z249J2NlbnRlcicgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz48dHI+PHRkIHdpZHRo
PSc2MiUnIGhlaWdodD0nNTAnIGFsaWduPSdsZWZ0JyB2YWxpZ249J2JvdHRvbScgY2xhc3M9J3Rv
cCc+PGJyIC8+uPzQwsqxvOSjujxzcGFuIHN0eWxlPSJjb2xvcjojMjU2ZmI4OyI+MjAxOS0wNS0y
Mzwvc3Bhbj48L3RkPjx0ZCB3aWR0aD0nMzclJyBhbGlnbj0ncmlnaHQnIHZhbGlnbj0nYm90dG9t
Jz48aW1nIHdpZHRoPScxMjAnIGhlaWdodD0nNTAnIHNyYz0iY2lkOjZjM2U4MmRjLTNhZGEtNDNj
MS05NDdjLTc3OWY2YzI5MWRjZiIgLz48L3RkPjwvdHI+PC90YWJsZT48dGFibGUgd2lkdGg9Ijcw
MyIgYm9yZGVyPSIwIiBhbGlnbj0iY2VudGVyIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9
IjAiID48dHI+PHRkPjxodG1sIHhtbG5zOmNvZGU9InVybjplaGlyZS54c2x0LmV4dGVuc2lvbiI+
PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7
IGNoYXJzZXQ9Z2IyMzEyIj48c3R5bGU+DQogICAgICAgICAgI3RvcENoYXJ0eyBiYWNrZ3JvdW5k
...

经过一番探究,这是一份被编码的邮件格式文件,既然邮件格式,当然是有东西可以把它解码的,又经过一番探究,我找到了这个包 php-mime-mail-parser/php-mime-mail-parser ,于是就有了办法。

注意,在使用 php-mime-mail-parser 之前,需要安装 phpmailparse 扩展,请参考项目 GitHub ,上代码:

public function actionMht()
{
    $file = Yii::getAlias('@runtime') . '/20190527.doc';
    if($this->isMht($file)) {
        $parser = new PhpMimeMailParser\Parser();
        $parser->setText(file_get_contents($file));
        $body = $parser->getMessageBody('html');
        $body = str_replace(['charset=gb2312','charset=gbk'], 'charset=utf-8', $body);
        $htmlFile = Yii::getAlias('@runtime') . '/20190527,刘艳,前程.html';
        file_put_contents($htmlFile, $body);
    }
}


public function isMht($file)
{
    $fileData = fopen($file, "r");
    $header = '';
    while(!feof($fileData))
    {
        $data = str_replace(["\n", "\s", "\r\n"], '', fgets($fileData));
        $header .= $data;
        if($data == '') {
            break;
        }
    }
    fclose($fileData);
    return strpos($header, 'MIME-Version') !== false;
}

先通过 MIME-Version 特征去判断是不是这种格式,然后使用 php-mime-mail-parser 解析,然后将其存储为 html 文件并将编码 html 转换成 utf-8 完成转换,这些特征提取和编码转换只是根据项目中的文件来判断,如果你也是这种文件,可以针对自己待处理的文件做出相应的调整以达到更好的效果。

这个解析器还有很多其他内容提取的方法,非常方便,更多用法参考 GitHub

php-mime-mail-parser 项目 GitHub 地址: php-mime-mail-parser/php-mime-mail-parser

本文分享自微信公众号 - PHP技术大全(phpgod)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • php 解压缩 zip 和 rar 压缩包文件

    项目涉及文档处理,用户上传的包括 zip 和 rar 压缩包,需要先将压缩包解压后再作处理。对于 zip 压缩包,由于 php 自带 zip 扩展,可以直接解压...

    猿哥
  • Redis在项目中合理使用经验总结

    key: active:spring2019:title value:"2019春节活动" 操作:set

    猿哥
  • 使用VS Code进行远程开发

    今天,我们很高兴地宣布Visual Studio Code的三个新扩展的预览版发布,它们支持在容器中、远程物理或虚拟机上以及在Windows中的Linux子系统...

    猿哥
  • 将map按照值排序

    崔笑颜
  • Shiro源码分析之获取SecurityManager工厂获取

      最近在介绍Shiro所以打算将shiro中的相关源代码给分析下。因为内容比较多,所以会分几篇来介绍,希望对大家有所帮助。

    用户4919348
  • AngularJS例子 ng-repeat遍历输出 通过js的splice方法删除当前行

    <!doctype html> <html> <head> <meta charset="utf-8"> <title>ng-repeat di...

    庞小明
  • .net mvc前台如何接收和解析后台的字典类型的数据

      很久没有写博客了,最近做了一个公司门户网站的小项目,其中接触到了一些我不会的知识点,今日事情少,便记录一下,当时想在网上搜索相关的内容,但是没有找到。

    CherishTheYouth
  • Orleans 知多少 | 4. 有状态的Grain

    Orleans 的优势之一就是:支持有状态服务的水平扩展。那这一节我们就来看看如何来了解下有状态的Grain。

    圣杰
  • 美团无人配送斩获 CVPR 2019 轨迹预测挑战赛冠军

    人工智能领域国际顶级会议CVPR(计算机视觉与模式识别)于2019年6月17日在美国加利福尼亚州长滩市召开,美团无人配送与视觉团队喜获 CVPR 2019 障碍...

    美团无人配送
  • 爱他,就给他做一个表情包吧(内有福利)

    在用社交软件聊天的过程中,难免会遇到很尴尬或者冷场的时候,要是再用文字来表达,就显得太不机智了。如果这时候用一个恰到好处的动图,可以让对话达到死灰复燃的效果。

    知晓君

扫码关注云+社区

领取腾讯云代金券