使用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

发表评论

电子邮件地址不会被公开。 必填项已用*标注