• 技术文章 >php教程 >php手册

    PHP邮件收发,和编码问题。数据匹配

    2016-06-06 20:00:15原创382

    ?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<$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 $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 //判断是否是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 $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 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 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 $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

    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 $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);
    }
    }


    ?>
    这个类主要是为了读取邮件服务器中邮件的信息的,并对邮件信息进行处理,提取出邮件信息中的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);

    这个主要是通过文件锁flock来处理它进行单进程运行程序。

    同时在整个类中,我也对当前的邮件信息数据进行了日志记载,和错误信息记录。

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:php持久登录、记住我功能实现 下一篇:PHP 编码注明
    千万级数据并发解决方案

    相关文章推荐

    • 第一节--面向对象编程--ClassesandObjectsinPHP51• ZendOptimizer配置指南• BluePage通用分页类助开发者提高开发效率• 基于DB2及PHP的应用系统跨平台迁移详细步骤(二)• 在PHP中利用XML技术构造远程服务(1)
    1/1

    PHP中文网