PHP 利用Mail_MimeDecode类提取邮件信息示例
前端之家收集整理的这篇文章主要介绍了
PHP 利用Mail_MimeDecode类提取邮件信息示例,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
重点为one_mail函数。利用Mail_mimeDecode类从邮件中提取邮件头和邮件正文。
<div class="codetitle">@L_404_0@ 代码如下:
<div class="codebody" id="code57253">
<?
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,$x,$post_text_undo);
if (isset ($val["$x"])) {
$value["$t"] = $val["$x"];
$num = 1;
$t = $t +1;
}
}
} //判断是否成功与数据库中数据匹配到
if ($num == 0) {
$val = $this->kid_data($users,1,$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,$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",$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,$title);
} else {
$title = iconv("gb2312",$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,"");
}
}
/
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,$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,$kid_num) {
$m_mail = $users["$m"]['from_mail'];
$sql = "SELECT a.user_name,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,$post_text_undo) {
$use_kid = $this->user_kid($users,$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','$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);
}
}
?>