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自动更新新闻DIY
Oct 09 PHP
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
Jun 08 PHP
PHP中的函数嵌套层数限制分析
Jun 13 PHP
PHP常用的文件操作函数经典收藏
Apr 02 PHP
php中读写文件与读写数据库的效率比较分享
Oct 19 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
Jan 26 PHP
php最简单的删除目录与文件实现方法
Nov 28 PHP
php基于PDO连接MSSQL示例DEMO
Jul 13 PHP
php遍历替换目录下文件指定内容的方法
Nov 10 PHP
PHP实现的同步推荐操作API接口案例分析
Nov 30 PHP
Laravel 集成 Geetest验证码的方法
May 14 PHP
PHP实现简易计算器功能
Aug 28 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
Yii中实现处理前后台登录的新方法
2015/12/28 PHP
Laravel程序架构设计思路之使用动作类
2018/06/07 PHP
Javascript操作select方法大全[新增、修改、删除、选中、清空、判断存在等]
2008/09/26 Javascript
js null,undefined,字符串小结
2010/08/21 Javascript
javascript复制对象使用说明
2011/06/28 Javascript
js获取字符串最后一位方法汇总
2014/11/13 Javascript
jQuery实现按钮的点击 全选/反选 单选框/复选框 文本框 表单验证
2015/06/25 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
2016/11/02 Javascript
使用JavaScript解决网页图片拉伸问题(推荐)
2016/11/25 Javascript
浅析BootStrap中Modal(模态框)使用心得
2016/12/24 Javascript
谈谈Vue.js——vue-resource全攻略
2017/01/16 Javascript
利用node.js如何搭建一个简易的即时响应服务器
2017/05/28 Javascript
node.js中grunt和gulp的区别详解
2017/07/17 Javascript
vue计算属性及使用详解
2018/04/02 Javascript
微信小程序使用wxParse解析html的方法示例
2019/01/17 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
vue data引入本地图片的两种方式小结
2019/11/13 Javascript
微信小程序图片自适应实现解析
2020/01/21 Javascript
JavaScript实现网页跨年倒计时
2020/12/02 Javascript
[01:37]DOTA2超级联赛专访ChuaN 传奇般的电竞之路
2013/06/19 DOTA
bat和python批量重命名文件的实现代码
2016/05/19 Python
Python + selenium自动化环境搭建的完整步骤
2018/05/19 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
2019/09/26 Python
将python安装信息加入注册表的示例
2019/11/20 Python
Python Dict找出value大于某值或key大于某值的所有项方式
2020/06/05 Python
Python中Selenium库使用教程详解
2020/07/23 Python
Swisse官方海外旗舰店:澳大利亚销量领先,自然健康品牌
2017/12/15 全球购物
财务会计专业个人求职信范本
2014/01/08 职场文书
什么样的创业计划书可行性高?
2014/02/01 职场文书
个人学习群众路线心得体会
2014/11/05 职场文书
行政前台岗位职责
2015/04/16 职场文书
2015年公司中秋节致辞
2015/07/31 职场文书
Python requests库参数提交的注意事项总结
2021/03/29 Python
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
2022/04/24 Python
Win11 Build 22000.829更新补丁KB5015882发布(附更新修复内容汇总)
2022/07/15 数码科技
TS 类型兼容教程示例详解
2022/09/23 Javascript