?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'; //incl
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 $t=0;
$users=array();
$mail=array();
$offset=($sum[0]-$n) //邮件循环
for ($i=$r;$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
$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)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
$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
}
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 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
}
}
$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
}
}
$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
$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 if($use_names[$k]==$use_names[$k-1]||$use_names[$k]==$use_names[$k+1]){ } if(isset($d_users)){ if(isset($s_users)){ for($s=0;$s } } 执行这个类的话: 这个主要是通过文件锁flock来处理它进行单进程运行程序。 同时在整个类中,我也对当前的邮件信息数据进行了日志记载,和错误信息记录。
$s_users[$s]=$use_names[$k];
$s=$s+1;
}else{
$d_users[$k]=$use_names[$k];
}
}
$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());
}
$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);
}
}
?>
这个类主要是为了读取邮件服务器中邮件的信息的,并对邮件信息进行处理,提取出邮件信息中的from,title ,content
并且提取出他们的编码格式,并对他们进行处理,同时from ,title 分别要和数据库中的信息去匹配,one_mail函数为只读取一封mail邮件的信息的,通过传参数i确定是读取第几封mail,并且返回mail 的 from ,title,content。在这个函数当中,主要是要判断当前的对象是否有parts属性,所以要进行判断,各个邮件发送邮件时候都有点差异的。编码的提取和解码
user_data函数主要是返回当前mail 参数中数据库中用户的信息,
insert_data函数,主要是把当前的当前的value 数据插入,value参数原为一个数组,后通过函数implode函数进行分解
,从而能对数据进行批插入。
reply_email函数为回复mai函数,这函数中主要的问题是要对发送过来的函数的编码进行提取,从而当回复时也用
它发送的编码方式,这样才不会出现编码的问题。
is_kid函数,为判断小孩是否是存在,和邮件信息时候相匹配
kid_message_count函数为孩子的大小排序的,如果当前孩子比较多的话,可以为它孩子进行大小排序。
$file=fopen("mail.pid","a+");
if(flock($file,LOCK_EX+LOCK_NB)){
fwrite($file,date("Y-m-d H:i:s")."/tfile had locking/r/n");
$mail=new mail_data();
flock($file,LOCK_UN);
}else{
echo "程序运行中……";
}
fclose($file);