PHP读取、解析eml文件及生成网页的方法示例


Posted in PHP onSeptember 04, 2017

本文实例讲述了PHP读取、解析eml文件及生成网页的方法。分享给大家供大家参考,具体如下:

php读取eml实例,本实例可以将导出eml文件解析成正文,并且可以将附件保存到服务器。不多说直接贴代码了。

<?php
// Author: richard e42083458@163.com
// gets parameters
error_reporting(E_ALL ^ (E_WARNING|E_NOTICE));
header("Content-type: text/html; charset=utf-8");
echo "<pre>";
define(EML_FILE_PATH,'./yjdata/');
//if ($filename == '') $filename = '21724696_niuyufu@qiaodazhao.com_ZC4422-r7GMz_R9QF3K6XUhmJOXd4c.eml';
//if ($filename == '') $filename = '21724696_niuyufu@qiaodazhao.com_ZC3218-dGquMgm7ytdF6HQgpSReC4c.eml';
//if ($filename == '') $filename = '163.eml';
//if ($filename == '') $filename = '166.eml';
//if ($filename == '') $filename = 'nyf.eml';
//if ($filename == '') $filename = 'email_header_icon.eml';
if ($filename == '') $filename = '20141230133705.eml';
$eml_file = EML_FILE_PATH.$filename;
if (!($content = fread(fopen(EML_FILE_PATH.$filename, 'rb'), filesize(EML_FILE_PATH.$filename))))
  die('File not found ('.EML_FILE_PATH.$filename.')');
//标题内容
$pattern="/Subject: (.*?)\n/ims";
preg_match($pattern,$content,$subject_results);
$subject = getdecodevalue($subject_results[1]);
echo "标题:".$subject;
//发件人:
$pattern="/From: .*?<(.*?)>/ims";
preg_match($pattern,$content,$from_results);
$from = $from_results[1];
echo "\n\r";
echo "发件人:".$from;
//收件人:
$pattern="/To:(.*?):/ims";
preg_match($pattern,$content,$to_results);
$pattern="/<(.*?)>/ims";
preg_match_all($pattern,$to_results[1],$to_results2);
if(count($to_results2[1])>0){
  $to = $to_results2[1];
}else{
  $pattern="/To:(.*?)\n/ims";
  preg_match($pattern,$content,$to_results);
  $to = $to_results[1];
}
echo "\n\r";
echo "收件人:";
print_r($to);
echo "\n\r";
//正文内容
$pattern = "/Content-Type: multipart\/alternative;.*?boundary=\"(.*?)\"/ims";
preg_match($pattern,$content,$results);
if($results[1]!=""){
  $seperator = "--".$results[1];
}else{
  die("boundary匹配失败");
}
$spcontent = explode($seperator, $content);
$items = array();
$keyid = 0;
$email_front_content_array = array();
foreach($spcontent as $spkey=>$item) {
  //匹配header编码等信息
  $pattern = "/Content-Type: ([^;]*?);.*?charset=(.*?)\nContent-Transfer-Encoding: (.*?)\n/ims";
  preg_match($pattern,$item,$item_results);
  if(count($item_results)==4){
    $Content_code = str_replace($item_results[0],"",$item);
    $item_results[4] = $Content_code;
    if(trim($item_results[3])=="base64"){
      $item_results[5] = base64_decode($item_results[4]);
    }
    if(trim($item_results[3])=="quoted-printable"){
      $item_results[5] = quoted_printable_decode($item_results[4]);
    }
    $item_results[5] = mb_convert_encoding($item_results[5], 'UTF-8', trim($item_results[2]));
    //echo $item_results[5];exit;
    $email_front_content_array[] = $item_results;
  }
}
foreach ($email_front_content_array as $email_front_content_each_key=>$email_front_content_each_value){
  if($email_front_content_each_value[1]=='text/html'){
    $content_html = $email_front_content_each_value[5];
    break;
  }else{
    $content_html = $email_front_content_each_value[5];
  }
}
echo "内容:";
echo "\n\r";
echo $content_html;
echo "\n\r";
//附件内容
$pattern = "/Content-Type: multipart\/mixed;.*?boundary=\"(.*?)\"/ims";
preg_match($pattern,$content,$results);
if($results[1]!=""){
  $seperator = "--".$results[1];
  $spcontent = explode($seperator, $content);
  $items = array();
  $keyid = 0;
  $email_attachment_content_array = array();
  foreach($spcontent as $spkey=>$item) {
    //匹配header编码等信息
    $pattern = "/Content-Type: ([^;]*?);.*?name=(.*?)\nContent-Transfer-Encoding: (.*?)\nContent-Disposition: attachment;.*?filename=(.*?)\n/ims";
    preg_match($pattern,$item,$item_results);
    //print_r($item_results);
    if(count($item_results)==5){
      $Content_code = str_replace($item_results[0],"",$item);
      $item_results[5] = trim($Content_code);
      if(trim($item_results[3])=="base64"){
        $item_results[6] = base64_decode($item_results[5]);
      }
      if(trim($item_results[3])=="quoted-printable"){
        $item_results[6] = quoted_printable_decode($item_results[5]);
      }
      $item_results[7] = str_replace("\"","",getdecodevalue($item_results[2]));
      $item_results[8] = str_replace("\"","",getdecodevalue($item_results[4]));
      //保存附件内容到服务器?
      //符合规范的文件名时:有后缀名时。
      if(strrpos($item_results[8], '.')!==false){
        $ext = substr($item_results[8], strrpos($item_results[8], '.') + 1);
        //$filename = "./yjdata/attachment/".date("YmdHis").mt_rand(10000,99999).".".trim($ext);
        $attachment_filename = "./yjdata/attachment/".trim(str_replace("\"","",getbase64code($item_results[4]))).".".trim($ext);
        mkdirs(dirname($attachment_filename));
        $fp = fopen($attachment_filename, "w+");
        if (flock($fp, LOCK_EX)) { // 进行排它型锁定
          fwrite($fp, $item_results[6]);
          flock($fp, LOCK_UN); // 释放锁定
        } else {
          //echo "Couldn't lock the file !";
        }
        fclose($fp);
        $item_results[9] = $attachment_filename;
        $email_attachment_content_array[] = $item_results;
      }
    }
  }
  //print_r($email_attachment_content_array);
}
if(count($email_attachment_content_array)>0){
  echo "附件:";
  echo "\n\r";
  //附件读取
  foreach($email_attachment_content_array as $email_attachment_content_each_key=>$email_attachment_content_each_value){
    unset($email_attachment_content_each_value[5]);
    unset($email_attachment_content_each_value[6]);
    print_r($email_attachment_content_each_value[8]);
    print_r($email_attachment_content_each_value[9]);
  }
}
function getbase64code($content){
  $pattern="/=\?GB2312\?B\?(.*?)\?=|=\?GBK\?B\?(.*?)\?=|=\?UTF-8\?B\?(.*?)\?=/ims";
  preg_match($pattern,$content,$subject_results);
  if($subject_results[1]!=""){
    $subject = $subject_results[1];
    $charset = "GB2312";
  }
  elseif($subject_results[2]!=""){
    $subject = $subject_results[2];
    $charset = "GBK";
  }
  elseif($subject_results[3]!=""){
    $subject = $subject_results[3];
    $charset = "UTF-8";
  }else{
    $subject = $content;
    $charset = "";
  }
  return $subject;
}
function getdecodevalue($content){
  $pattern="/=\?GB2312\?B\?(.*?)\?=|=\?GBK\?B\?(.*?)\?=|=\?UTF-8\?B\?(.*?)\?=/ims";
  preg_match($pattern,$content,$subject_results);
  if($subject_results[1]!=""){
    $subject = base64_decode($subject_results[1]);
    $charset = "GB2312";
  }
  elseif($subject_results[2]!=""){
    $subject = base64_decode($subject_results[2]);
    $charset = "GBK";
  }
  elseif($subject_results[3]!=""){
    $subject = base64_decode($subject_results[3]);
    $charset = "UTF-8";
  }else{
    $subject = $content;
    $charset = "";
  }
  if($charset!=""){
    $subject = mb_convert_encoding($subject, 'UTF-8', $charset);
  }
  return $subject;
}
function mkdirs($dir)
{
  if(!is_dir($dir))
  {
    if(!mkdirs(dirname($dir))){
      return false;
    }
    if(!mkdir($dir,0777)){
      return false;
    }
  }
  chmod($dir, 777);  //给目录操作权限
  return true;
}
?>

有图有真相:

PHP读取、解析eml文件及生成网页的方法示例

附:完整实例代码点击此处本站下载

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
如何在PHP中进行身份认证
Oct 09 PHP
PHP 基于文件头的文件类型验证类函数
May 01 PHP
探讨各种PHP字符串函数的总结分析
Jun 05 PHP
php中最简单的字符串匹配算法
Dec 16 PHP
PHP获取文件相对路径的方法
Feb 26 PHP
php实现的农历算法实例
Aug 11 PHP
四个PHP非常实用的功能
Sep 29 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
Oct 20 PHP
php实现遍历多维数组的方法
Nov 25 PHP
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
Jan 15 PHP
PHP基于mcript扩展实现对称加密功能示例
Feb 21 PHP
tp5.1 框架查询表达式用法详解
May 25 PHP
PHP钩子与简单分发方式实例分析
Sep 04 #PHP
PHP实现登录注册之BootStrap表单功能
Sep 03 #PHP
[原创]PHP实现生成vcf vcard文件功能类定义与使用方法详解【附demo源码下载】
Sep 02 #PHP
php简单读取.vcf格式文件的方法示例
Sep 02 #PHP
PHP实现简单的模板引擎功能示例
Sep 02 #PHP
PHP实现类似于C语言的文件读取及解析功能
Sep 01 #PHP
PHP设计模式之工厂模式实例总结
Sep 01 #PHP
You might like
php查询相似度最高的字符串的方法
2015/03/12 PHP
微信 getAccessToken方法详解及实例
2016/11/23 PHP
PHP+MariaDB数据库操作基本技巧备忘总结
2018/05/21 PHP
laravel 验证错误信息到 blade模板的方法
2019/09/29 PHP
laravel withCount 统计关联数量的方法
2019/10/10 PHP
列表内容的选择
2006/06/30 Javascript
关于js注册事件的常用方法
2013/04/03 Javascript
JavaScript中split() 使用方法汇总
2015/04/17 Javascript
谈谈JSON对象和字符串之间的相互转换JSON.stringify(obj)和JSON.parse(string)
2015/10/01 Javascript
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
使用nodeJs来安装less及编译less文件为css文件的方法
2017/11/20 NodeJs
vue+axios+element ui 实现全局loading加载示例
2018/09/11 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
2019/05/10 Javascript
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
在Django中创建动态视图的教程
2015/07/15 Python
python中文件变化监控示例(watchdog)
2017/10/16 Python
手写一个python迭代器过程详解
2019/08/27 Python
Python实现快速排序的方法详解
2019/10/25 Python
解决Python import docx出错DLL load failed的问题
2020/02/13 Python
python 对象真假值的实例(哪些视为False)
2020/12/11 Python
python中的unittest框架实例详解
2021/02/05 Python
秘鲁购物网站:Linio秘鲁
2017/04/07 全球购物
介绍一下Transact-SQL中SPACE函数的用法
2015/09/01 面试题
如果重写了对象的equals()方法,需要考虑什么
2014/11/02 面试题
酒后驾驶检讨书
2014/01/27 职场文书
军训感想500字
2014/02/20 职场文书
中国梦主题教育活动总结
2014/05/05 职场文书
最美孝心少年事迹材料
2014/08/15 职场文书
2014大学校园光棍节活动策划书
2014/09/29 职场文书
2015年教研组工作总结
2015/05/04 职场文书
2015年乡镇妇联工作总结
2015/05/19 职场文书
基石观后感
2015/06/12 职场文书
在 Golang 中实现 Cache::remember 方法详解
2021/03/30 Python
Python基础之hashlib模块详解
2021/05/06 Python
浅谈python中的多态
2021/06/15 Python