PHP 利用Mail_MimeDecode类提取邮件信息示例


Posted in PHP onJanuary 26, 2014

重点为one_mail函数。利用Mail_mimeDecode类从邮件中提取邮件头和邮件正文。

<?php 
header("content-type:text/html; charset=UTF-8"); 
/* 
* record kid words and insert into database 
* user by sending email to publication kid words 
* 
*/ 
include 'POP3.php'; 
include 'email_class.php'; 
include 'Mail_mimeDecode.php'; 
//include 'include/compatible.php'; 
include 'include/extend_common.php'; 
//include '../../htdocs/include/extend_common.php'; 
define('POST_FROM_EMAIL', 1); 
define('DATABASE_CONNECTION_ERROR', 2); //数据库连接失败错误 
define('EMAIL_CONNECTION_ERROR', 3); //邮箱连接失败错误 
define('ACCOUNT_ERROR', 4); //邮箱的账号错误 
define('SIGN_EMAIL_ERROR', 5); //邮件标记删除错误 
define('DELELET_ERROR', 6); //删除邮件错误 
define('INSERT_ERROR', 7); //插入数据失败错误 class mail_data { 
function mail_data() { 
include 'config.php'; 
$mail_log = fopen("mail_log.txt", "a+"); 
$conn = @ mysql_connect($db_host, $db_user, $db_password); 
if ($conn) { 
mysql_select_db('t', $conn); 
mysql_query("set names utf8"); 
$pop3 = new Net_POP3(); 
//判断连接是否成功 
if ($pop3->connect($host, 110)) { 
//判断登入是否成功 
if ($pop3->login($user, $password) === true) { 
$list = $pop3->_cmdList(); 
$sum = $pop3->_cmdStat(); 
//每次取多少邮件 
$step = 2; 
$r = 0; 
//先对邮箱取$step邮件 
for ($n = 0; $n < $sum[0]; $n += $step) { 
$t = 0; 
$users = array (); 
$mail = array (); 
$offset = ($sum[0] - $n) < $step ? $sum[0] - $n : $step; 
//邮件循环 
for ($i = $r; $i < $n + $offset; $i++) { 
//取得邮件信息 
$user = $this->one_mail($i, $pop3, $list, $mail_log); 
array_push($mail, $user['from_mail']); 
array_push($users, $user); 
$r = $i +1; 
} 
//取得mail用户数据 
$str = $this->uesr_data($mail); 
$value = array (); 
//当前邮件数组循环,当前邮件用户的email,小孩名,童言 
for ($m = 0; $m < count($users); $m++) { 
$num = 0; 
$mn = $m + $n; 
//数据处理 
$post_text = $users[$m]['conntent']; 
if (!empty ($post_text)) { 
$post_text = do_submit_text($post_text); 
$post_text = mysql_real_escape_string($post_text); 
$post_link_num = parsed_text_include_links($post_text); 
$text = do_submit_text($post_text); 
$post_text_undo = mysql_real_escape_string($text); 
$post_text = mysql_real_escape_string($post_text); 
$val = array (); 
$kid_num = $users[$m]['kid_nickname']; 
if (is_numeric($kid_num) && intval($kid_num) <= 3 && intval($kid_num) > 0) { 
$kid_num = intval($kid_num); 
$val = $this->kid_data($users, $m, $kid_num, $post_text, $post_link_num, $post_text_undo); 
if (isset ($val)) { 
$value["$t"] = $val; 
$num = 1; 
$t = $t +1; 
} 
} else { 
//数据库中的数据 
for ($x = 0; $x < count($str); $x++) { 
//判断是否是from_mail的小孩 
$val["$x"] = $this->is_kid($users, $str, $m, $x, $post_text, $post_link_num, $post_text_undo); 
if (isset ($val["$x"])) { 
$value["$t"] = $val["$x"]; 
$num = 1; 
$t = $t +1; 
} 
} 
} 
//判断是否成功与数据库中数据匹配到 
if ($num == 0) { 
$val = $this->kid_data($users, $m, 1, $post_text, $post_link_num, $post_text_undo); 
if (isset ($val)) { 
$value["$t"] = $val; 
$num = 1; 
$t = $t +1; 
} 
} 
} 
} 
//对一段数据操作 
$valu = implode("),(", $value); 
if ($valu != "") { 
$err_time = $this->insert_date($valu); 
$this->kid_message_count($value); 
} 
} 
fclose($mail_log); 
/* 
if($pop3->disconnect()==false){ 
$this->_error(DELELET_ERROR); 
} 
*/ 
} else { 
echo "帐号或密码错误!"; 
$this->_error(ACCOUNT_ERROR); 
} 
} else { 
echo "连接失败..."; 
$this->_error(EMAIL_CONNECTION_ERROR); 
} 
} else { 
echo "数据库连接失败..."; 
$this->_error(DATABASE_CONNECTION_ERROR); 
} 
} 
/* 
*read the $i email message 
*@access public 
*@param int $i mail id 
*@param object $pop3 pop3 protocol object 
*@return array mail from ,header,content 
*/ 
function one_mail($i, $pop3, $list, $mail_log) { 
$stg = $pop3->getParsedHeaders($list[$i]['msg_id']); 
$from = imap_mime_header_decode($stg['From']); //邮件的发送者 
$string_from = ''; 
for ($j = 0; $j < count($from); $j++) { 
$string_from = "$string_from" . $from[$j]->text; 
} 
preg_match("/([a-z0-9A-Z_]+)@([a-z0-9A-Z/.]+).([a-z0-9A-Z]+)/", $string_from, $from_mail); 
$string = $pop3->getMsg($list[$i]['msg_id']); 
$body = new Mail_mimeDecode($string); 
$sr = $body->decode(array ( 
'include_bodies' => true, 
'decode_bodies' => false, 
'decode_headers' => true 
)); 
if (property_exists($sr, 'parts')) { 
$mail_part = $sr->parts; 
$mail_part = $mail_part[0]; 
} else { 
$mail_part = $sr; 
} 
$mail_code = $mail_part->headers; 
$mail_code = $mail_code['content-transfer-encoding']; //编码格式 
$mail_type = $mail_part->ctype_parameters; 
$mail_type = $mail_type['charset']; 
$mail_body = $mail_part->body; //正文内容 
if ($mail_code == "base64") { //判断编码格式 
$text = base64_decode("$mail_body"); 
$text = iconv("$mail_type", "UTF-8", $text); 
} else { 
$text = quoted_printable_decode("$mail_body"); 
$text = iconv("$mail_type", "UTF-8", $text); 
} 
$mail_title = $sr->headers; 
$mail_title = $mail_title['subject']; 
$mail_title = imap_mime_header_decode($mail_title); 
if (count($mail_title) != 0) { 
$title = $mail_title[0]->text; 
$t = $mail_title[0]->charset; 
if ($t != "default") { 
$title = iconv($t, "UTF-8", $title); 
} else { 
$title = iconv("gb2312", "UTF-8", $title); 
} 
} else { 
$title = 1; 
} 
//$pop3->_cmdDele($list[$i]['msg_id']); 
$pop3->deleteMsg($list[$i]['msg_id']); 
if ($pop3->deleteMsg($list[$i]['msg_id']) == false) { 
$this->_error(SIGN_EMAIL_ERROR); 
} 
//取得需要插入的用户email,小孩名,童言 
$users["$i"] = array ( 
"from_mail" => "$from_mail[0]", 
"kid_nickname" => "$title", 
"conntent" => "$text", 
"body_type" => "$mail_type" 
); 
$log = $users["$i"]; 
array_unshift($log, date("Y-m-d H:i;s")); 
$log = serialize($log); 
fwrite($mail_log, $log . "/r/n"); 
return $users["$i"]; 
} 
/** 
*at database search $mail user's information 
*@access public 
*@param string $mail all email 
*@return array mail user's information 
*/ 
function uesr_data($mail) { 
$mails = implode("','", $mail); 
$sql = "SELECT a.mail,a.user_name,a.user_nickname,b.kid_id, b.kid_name,b.kid_avatar ,b.kid_birthday 
FROM `t_users` a, `t_users_kid` b 
WHERE a.mail in ('$mails') AND a.user_id=b.user_id"; 
$query = mysql_query($sql) or die(mysql_error()); 
$str1 = array (); 
while ($arr = mysql_fetch_array($query)) { 
array_push($str1, $arr); 
} 
return $str1; 
} 
/* 
*insert $value into database 
*@access public 
*@param string $value kid information 
*@return void 
*/ 
function insert_date($value) { 
$sql_insert = "INSERT INTO `t_posts`(kid_id,user_name,user_nickname,post_time,post_text,user_avatar,post_link_num,post_text_undo,post_from,add_time) 
VALUES ($value)"; 
$num = mysql_query($sql_insert) or die(mysql_error()); 
if ($num != 1) { 
$this->_error(INSERT_ERROR); 
} 
} 
/* 
*send email to $smtpemailto 
*@access public 
*@param string $mailtype mail_from type 
*@param string $smtpemailto mail_from 
*@param string $user_kid_name mail title 
*@return void 
*/ 
function reply_email($mailtype, $smtpemailto, $user_kid_nickname) { 
require "config.php"; 
$mailsubject = "您暂时还没有" . $user_kid_nickname . "宝宝"; 
$mailsubject = "=?UTF-8?B?" . base64_encode($mailsubject) . "?="; 
$mailbody = "请先添加宝宝"; 
if ($mailtype != "ISO-8859-1") { 
$mailbody = iconv("utf-8", "$mailtype//ignore", $mailbody); 
} 
$mail_type = "HTML"; 
$smtp = new smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass); 
$smtp->debug = FALSE; 
$send_mail = $smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $mailbody, $mail_type, "", ""); 
if ($send_mail == false) { 
return "send faile"; 
$send_mail = $smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $mailbody, $mail_type, "", ""); 
} 
} 
/* 
*the kid's age then publication kid words 
*@access public 
*@param int $kid_birthday kid birthday 
*@return array kid year month day 
*/ 
function get_kid_age_info($kid_birthday) { 
$cur_date = date("Ymd"); 
$age = $cur_date - $kid_birthday; 
if ($age < 0) { 
return false; 
} 
$years = 0; 
$months = 0; 
$days = 0; 
if ($age > 10000) { 
$years = floor($age / 10000); 
} 
$age = $age % 10000; 
$months = floor($age / 100); 
if ($months > 12) 
$months -= 88; 
$days = $age % 100; 
if ($days > $cur_date % 100) { 
$days = $days - (100 - date("d", strtotime(date("Ym") . "01") - 24 * 3600)); 
} 
return array ( 
$years, 
$months, 
$days 
); 
} 
/** 
*judge the $m message and the $x data 
*@access public 
*@param array $users mail information 
*@param array $str user information 
*@param int $m $users grade 
*@param int $x $str grade 
*@param string $post_text the mail text 
*@return string information 
*/ 
function is_kid($users, $str, $m, $x, $post_text, $post_link_num, $post_text_undo) { 
if ($users[$m]['from_mail'] == $str[$x]['mail']) { //判断是否是from_mail的小孩 
$kid_id = $str[$x]['kid_id']; 
$user_name = $str[$x]['user_name']; 
$user_nickname = $str[$x]['user_nickname']; 
$kid_diff = $str[$x]['kid_birthday']; 
$kid_name = $str[$x]['kid_name']; 
$kid_diff = date("Ymd", $kid_diff); 
$kid_birthdy = $this->get_kid_age_info($kid_diff); 
//格式转换 
for ($j = 0; $j < count($kid_birthdy); $j++) { 
if ($kid_birthdy[$j] >= 0 && $kid_birthdy[$j] < 10) { 
$kid_birthdy[$j] = "0" . "$kid_birthdy[$j]"; 
} 
} 
$post_time = $kid_birthdy[0] . $kid_birthdy[1] . $kid_birthdy[2]; 
$user_avatar = get_kid_avatar($user_name, $kid_id); 
$kid_avatar = $user_avatar; 
if ($users[$m]['kid_nickname'] == $kid_name) { 
$kid_id = mysql_real_escape_string("$kid_id"); 
$user_name = mysql_real_escape_string("$user_name"); 
$post_time = mysql_real_escape_string("$post_time"); 
$kid_avatar = mysql_real_escape_string("$kid_avatar"); 
$from = POST_FROM_EMAIL; 
$add_time = time(); 
$values = "'$kid_id','$user_name','$user_nickname','$post_time','$post_text','$kid_avatar','$post_link_num','$post_text_undo','$from','$add_time'"; 
return $values; 
} 
} 
} 
/** 
*have the kid_num kid of users information 
*@access public 
*@param array $users the array() of users 
*@param int $m the m items of array 
*@param int $kid_num the kid_num kid 
*@return array kid information 
*/ 
function user_kid($users, $m, $kid_num) { 
$m_mail = $users["$m"]['from_mail']; 
$sql = "SELECT a.user_name,a.user_nickname,b.kid_id, b.kid_name,b.kid_avatar ,b.kid_birthday 
FROM `t_users` a, `t_users_kid` b 
WHERE a.mail='$m_mail' AND a.user_id=b.user_id ORDER BY b.kid_birthday ASC "; 
$query = mysql_query($sql) or die(mysql_error()); 
$str1 = array (); 
$kids = array (); 
$i = 0; 
while ($arr = mysql_fetch_array($query)) { 
$str1[$i] = $arr; 
$i = $i +1; 
} 
$kid_num = $kid_num -1; 
if ($kid_num > (count($str1) - 1)) { 
return $num = 0; 
} else { 
return $str1["$kid_num"]; 
} 
} 
/** 
*get the kid_num kid information 
*@access public 
*@param array $users the array() of users 
*@param int $m the m items of array 
*@param int $kid_num the kid_num kid 
*@param string $post_text the message of mail 
*@param int $post_link_num count(link) of message body 
*@return array $values the kid information 
*/ 
function kid_data($users, $m, $kid_num, $post_text, $post_link_num, $post_text_undo) { 
$use_kid = $this->user_kid($users, $m, $kid_num); 
if ($use_kid != 0) { 
$kid_id = $use_kid['kid_id']; 
$user_name = $use_kid['user_name']; 
$user_nickname = $use_kid['user_nickname']; 
$kid_diff = $use_kid['kid_birthday']; 
$kid_diff = date("Ymd", $kid_diff); 
$kid_birthdy = $this->get_kid_age_info($kid_diff); 
//格式转换 
for ($j = 0; $j < count($kid_birthdy); $j++) { 
if ($kid_birthdy[$j] >= 0 && $kid_birthdy[$j] < 10) { 
$kid_birthdy[$j] = "0" . "$kid_birthdy[$j]"; 
} 
} 
$post_time = $kid_birthdy[0] . $kid_birthdy[1] . $kid_birthdy[2]; 
$user_avatar = get_kid_avatar($user_name, $kid_id); 
$kid_avatar = $user_avatar; 
$add_time = time(); 
$from = POST_FROM_EMAIL; 
$values = "'$kid_id','$user_name','$user_nickname','$post_time','$post_text','$kid_avatar','$post_link_num','$post_text_undo','$from','$add_time'"; 
return $values; 
} 
} 
/** 
*update data when have kid words 
*@access public 
*@param array $value the array() of users 
*@return void 
*/ 
function kid_message_count($value) { 
$use_names = array (); 
for ($k = 0; $k < count($value); $k++) { 
$k_name = explode(",", $value[$k]); 
$use_names[$k] = $k_name[1]; 
} 
asort($use_names); 
$sum_kid = count($use_names); 
$s = 0; 
if (count($use_names) == 1) { 
$d_users[0] = $use_names[0]; 
} else { 
//第一个 
if ($use_names[0] != $use_names[1]) { 
$d_users[0] = $use_names[0]; 
} else { 
$s_users[$s] = $use_names[0]; 
$s = $s +1; 
} 
//最后一个 
if ($use_names[$sum_kid -1] != $use_names[$sum_kid -2]) { 
$d_users[$sum_kid -1] = $use_names[$sum_kid -1]; 
} else { 
$s_users[$s] = $use_names[$sum_kid -1]; 
$s = $s +1; 
} 
for ($k = 1; $k < count($use_names) - 1; $k++) { 
if ($use_names[$k] == $use_names[$k -1] || $use_names[$k] == $use_names[$k +1]) { 
$s_users[$s] = $use_names[$k]; 
$s = $s +1; 
} else { 
$d_users[$k] = $use_names[$k]; 
} 
} 
} 
if (isset ($d_users)) { 
$names = implode(",", $d_users); 
$sql = "UPDATE `t_users` set post_num = post_num+1 WHERE `t_users`.user_name in ($names)"; 
$query = mysql_query($sql) or die(mysql_error()); 
} 
if (isset ($s_users)) { 
for ($s = 0; $s < count($s_users); $s++) { 
$name = $s_users[$s]; 
$sql = "UPDATE `t_users` set post_num = post_num+1 WHERE `t_users`.user_name = $name"; 
$query = mysql_query($sql) or die(mysql_error()); 
} 
} 
} 
/** 
* point error 
*@access private 
*@param int error_num the error code 
*@return void 
* 
*/ 
private function _error($error_num) { 
$error_log = fopen("error_log.txt", "a+"); 
switch ($error_num) { 
case 2 : 
fwrite($error_log, date("Y-m-d H:i:s") . "/t" . $error_num . "/tCould not connect database!/r/n"); 
break; 
case 3 : 
fwrite($error_log, date("Y-m-d H:i:s") . "/t" . $error_num . "/tConnection Failure!/r/n"); 
break; 
case 4 : 
fwrite($error_log, date("Y-m-d H:i:s") . "/t" . $error_num . "/tAccount number or password error!!/r/n"); 
break; 
case 5 : 
fwrite($error_log, date("Y-m-d H:i:s") . "/t" . $error_num . "/tsign email failed!/r/n"); 
break; 
case 6 : 
fwrite($error_log, date("Y-m-d H:i:s") . "/t" . $error_num . "/tdelete emails failed!/r/n"); 
break; 
case 7 : 
fwrite($error_log, date("Y-m-d H:i:s") . "/t" . $error_num . "/tinsert data failed!/r/n"); 
break; 
} 
fclose($error_log); 
} 
} 
?>
PHP 相关文章推荐
PHP个人网站架设连环讲(一)
Oct 09 PHP
PHP 读取和修改大文件的某行内容的代码
Oct 30 PHP
smarty中先strip_tags过滤html标签后truncate截取文章运用
Oct 25 PHP
php中inlcude()性能对比详解
Sep 16 PHP
PHP中exec函数和shell_exec函数的区别
Aug 20 PHP
php+ajax制作无刷新留言板
Oct 27 PHP
CI框架常用函数封装实例
Nov 21 PHP
Yii框架弹出框功能示例
Jan 07 PHP
PDO操作MySQL的基础教程(推荐)
Aug 18 PHP
PHP简单实现二维数组赋值与遍历功能示例
Oct 19 PHP
PHP+mysql实现的三级联动菜单功能示例
Feb 15 PHP
一次项目中Thinkphp绕过禁用函数的实战记录
Nov 17 PHP
php读取纯真ip数据库使用示例
Jan 26 #PHP
curl不使用文件存取cookie php使用curl获取cookie示例
Jan 26 #PHP
php版小黄鸡simsimi聊天机器人接口分享
Jan 26 #PHP
百度ping方法使用示例 自动ping百度
Jan 26 #PHP
PHP弹出提示框并跳转到新页面即重定向到新页面
Jan 24 #PHP
header导出Excel应用示例
Jan 24 #PHP
使用openssl实现rsa非对称加密算法示例
Jan 24 #PHP
You might like
Windows下的PHP5.0安装配制详解
2006/09/05 PHP
页面利用渐进式JPEG来提升用户体验度
2014/12/01 PHP
laravel 自定义常量的两种方案
2019/10/14 PHP
jQuery 如何先创建、再修改、后添加DOM元素
2014/05/20 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
2015/08/11 Javascript
移动手机APP手指滑动切换图片特效附源码下载
2015/11/30 Javascript
初步使用bootstrap快速创建页面
2016/03/03 Javascript
AngularJS基础 ng-options 指令详解
2016/08/02 Javascript
使用jquery如何获取时间
2016/10/13 Javascript
JS作用域深度解析
2016/12/29 Javascript
基于jQuery实现数字滚动效果
2017/01/16 Javascript
jQuery监听浏览器窗口大小的变化实例
2017/02/07 Javascript
Linux系统中利用node.js提取Word(doc/docx)及PDF文本的内容
2017/06/17 Javascript
简单了解node npm cnpm的具体使用方法
2019/02/27 Javascript
vue模块拖拽实现示例代码
2019/03/09 Javascript
jQuery控制input只能输入数字和两位小数的方法
2019/05/16 jQuery
微信浏览器下拉黑边解决方案 wScroollFix
2020/01/21 Javascript
Js图片点击切换轮播实现代码
2020/07/27 Javascript
解决vue字符串换行问题(绝对管用)
2020/08/06 Javascript
javascript实现电商放大镜效果
2020/11/23 Javascript
[37:45]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS Orenda
2014/05/22 DOTA
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
pycharm激活码有效到2020年11月底
2020/09/18 Python
英国著名书店:Foyles
2018/12/01 全球购物
Java程序开发中如何应用线程
2016/03/03 面试题
大学生活学习的自我评价
2013/12/03 职场文书
护理学专业推荐信
2013/12/03 职场文书
旅游管理毕业生自荐书
2014/02/02 职场文书
绿色学校实施方案
2014/03/31 职场文书
检讨书范文1000字
2015/01/28 职场文书
营业员岗位职责
2015/02/11 职场文书
2019幼儿园感恩节活动策划书
2019/11/28 职场文书
js之ajax文件上传
2021/05/13 Javascript
MySQL 使用自定义变量进行查询优化
2021/05/14 MySQL
Vue2.0搭建脚手架
2022/03/13 Vue.js
win10壁纸在哪个文件夹 win10桌面背景图片文件位置分享
2022/08/05 数码科技