程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP 利用Mail_MimeDecode類提取郵件信息示例

PHP 利用Mail_MimeDecode類提取郵件信息示例

編輯:關於PHP編程

     重點為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);  }  }  ?> 
    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved