if at all any of you run into the issue with the from and to fields
showing incorrectly, u can use the pop3.inc attached with this email.
in order to replicate the issue i'm talking abt, send an email to the
a/c that u access via ilohaMail and in the body paste the content
between the **** below.
say u're send an email from [EMAIL PROTECTED] to [EMAIL PROTECTED] (this is
the a/c u access via ilohaMail), the from field in the inbox will show
[EMAIL PROTECTED] and to field will show [EMAIL PROTECTED], this will
also repeat when this specific email is viewed separately.
regards,
--
amar
Founder
eBeku.com
****
sending reply in plain text format not html..check to see if from field
being displayed correctly
----- Original Message -----
From: "bleh From" <[EMAIL PROTECTED]>
To: "bleh To" <[EMAIL PROTECTED]>
Sent: Sunday, October 19, 2008 7:21 PM
Subject: Re: Check
reply check
On 19/10/2008, "Keser Ayub" <[EMAIL PROTECTED]> wrote:
Check
****
<?php
/////////////////////////////////////////////////////////
//
// POP3.inc
//
// (C)Copyright 2002 Ryo Chijiiwa <[EMAIL PROTECTED]>
//
// This file is part of IlohaMail. IlohaMail is free software released
// under the GPL license. See enclosed file COPYING for details, or
// see http://www.fsf.org/copyleft/gpl.html
//
/////////////////////////////////////////////////////////
/********************************************************
FILE: include/pop3.inc
PURPOSE:
POP3 equivalence of imap.inc
USEAGE:
Function containing "_C_" in name require connection handler to
be
passed as one of the parameters. To obtain connection handler,
use
iil_Connect()
********************************************************/
include_once('../include/fs_path.inc');
include_once('../include/icl_commons.inc');
$iil_error;
$iil_errornum;
$iil_selected;
class iilConnection{
var $fp;
var $login;
var $password;
var $host;
var $error;
var $errorNum;
var $selected;
var $cacheFP;
var $cacheMode;
var $uid_cache;
var $seen_list;
var $sl_fetched;
}
class iilBasicHeader{
var $id;
var $uid;
var $subject;
var $from;
var $to;
var $cc;
var $replyto;
var $date;
var $messageID;
var $size;
var $encoding;
var $ctype;
var $flags;
var $timestamp;
var $seen;
var $deleted;
var $recent;
var $answered;
}
function iil_xor($string, $string2){
$result = "";
$size = strlen($string);
for ($i=0; $i<$size; $i++) $result .= chr(ord($string[$i]) ^
ord($string2[$i]));
return $result;
}
function iil_ConnectionOpen($fp){
$status = socket_get_status($fp);
if (($status['timed_out']) || ($status['blocked']) || ($status['eof']))
return false;
else return true;
}
function iil_ReadLine($fp, $size){
$line="";
if (($fp)&&(!feof($fp))){
do{
$buffer = fgets($fp, 1024);
$endID = strlen($buffer) - 1;
$end = (($buffer[$endID] == "\n")||(feof($fp)));
$line.=$buffer;
}while(!$end);
}
//if (!empty($line)) $line.="\n";
return $line;
}
function iil_C_ReadLine(&$conn){
if ($conn->cacheMode == "x"){
socket_set_timeout($conn->fp, 10);
return iil_ReadLine($conn->fp, 300);
}else if ($conn->cacheMode == "r"){
$line = iil_ReadLine($conn->cacheFP, 300);
//echo $line."<br>\n"; flush();
return $line;
}else if ($conn->cacheMode == "w"){
socket_set_timeout($conn->fp, 10);
$line = iil_ReadLine($conn->fp, 300);
fputs($conn->cacheFP, $line);
return $line;
}
}
function iil_ReadReply($fp){
do{
$line = chop(trim(iil_ReadLine($fp, 1024)));
}while($line[0]=="*");
return $line;
}
function iil_ParseResult($string){
if ((($string[0]=="+") || ($string[0]=="-")) && ($string[1]!=" ")){
$string = $string[0]." ".substr($string, 1);
}
$a=explode(" ", $string);
if (count($a) > 2){
if (strcasecmp($a[1], "OK")==0) return 0;
else if (strcasecmp($a[1], "NO")) return -1;
else if (strcasecmp($a[1], "BAD")) return -2;
}else return -3;
}
// check if $string starts with $match
function iil_StartsWith($string, $match){
if ((empty($string)) || (empty($match))) return false;
if ($string[0]==$match[0]){
$pos=strpos($string, $match);
if ( $pos === false) return false;
else if ( $pos == 0) return true;
else return false;
}else{
return false;
}
}
function iil_Close(&$conn){
if (fputs($conn->fp, "QUIT\r\n")){
fgets($conn->fp, 1024);
fclose($conn->fp);
}
}
function iil_C_CramMD5(&$conn, $user, $pass){
$conn->message .= "Doing CRAM-MD5\n";
fputs($conn->fp, "AUTH CRAM-MD5\r\n");
$line = chop(iil_ReadLine($conn->fp, 1024));
//echo "<!-- got reply: $line //-->\n";
if ($line[0]=="+"){
$encChallenge = substr($line, 2);
//echo "<!-- challenge: \"$encChallenge\" //-->\n";
}else{
//didn't get valid challenge
$conn->message .= 'Didn\'t get challenge, got:
"'.htmlspecialchars($line)."\"\n";
return false;
}
// initialize ipad, opad
for ($i=0;$i<64;$i++){
$ipad.=chr(0x36);
$opad.=chr(0x5C);
}
// pad $pass so it's 64 bytes
$padLen = 64 - strlen($pass);
for ($i=0;$i<$padLen;$i++) $pass .= chr(0);
// generate hash
$hash = md5(iil_xor($pass,$opad).pack("H*",md5(iil_xor($pass,
$ipad).base64_decode($encChallenge))));
// generate reply
$reply = base64_encode($user." ".$hash);
// send result, get reply
fputs($conn->fp, $reply."\r\n");
$line = iil_ReadLine($conn->fp, 1024);
// process result
if (iil_ParseResult($line)==0){
$conn->error = "";
$conn->errorNum = 0;
$conn->message .= "CRAM-MD5 returning true\n";
return true;
}else{
$conn->error = 'Authentication failed (AUTH):
<br>"'.htmlspecialchars($line)."\"";
$conn->errorNum = -2;
$conn->message .= 'CRAM-MD5 failed:
'.htmlspecialchars($line)."\n";
//echo "<!-- ".$conn->error." //-->\n";
return false;
}
}
function iil_C_APOP($conn, $user, $password, $timestamp){
$digest = md5($timestamp.$password);
fputs($conn->fp, "APOP $user $digest\r\n");
$line = iil_ReadLine($conn->fp, 1024);
if ($line[0]=="+") return true;
else{
return false;
}
}
function iil_Connect($host, $user, $password){
global $iil_error, $iil_errornum;
global $ICL_PORT, $ICL_SSL;
//get port
if (!$ICL_PORT) $port = 110;
else $port = $ICL_PORT;
//check host for SSL
if ($ICL_SSL && !eregi('^ssl:\/\/',$host)){
$host = "ssl://".$host;
}
$result = false;
//strip slashes
$user = stripslashes($user);
$password = stripslashes($password);
//set auth method
$auth_method = "plain";
if (func_num_args() >= 4){
$auth_array = func_get_arg(3);
if (is_array($auth_array)) $auth_method = $auth_array["pop3"];
if (empty($auth_method)) $auth_method = "plain";
}
//initialize connection object
$conn = new iilConnection;
$conn->error="";
$conn->errorNum=0;
$conn->login = $user;
$conn->password = $password;
$conn->host = $host;
$conn->selected="";
$conn->uid_cache = false;
//initiate connection
$conn->[EMAIL PROTECTED]($host, $port);
if ($conn->fp){
$iil_error.="Socket connection established\r\n";
$line=iil_ReadLine($conn->fp, 300);
//check for time stamp
//it's the last "word" and has the form:
// <somestring>
$sig_a = explode(" ", chop($line));
$last = count($sig_a)-1;
$timestamp = $sig_a[$last];
//echo "<!-- last word: \"$timestamp\" //-->\n";
$last_letter = strlen($timestamp)-1;
if (($timestamp[0]=="<") && ($timestamp[$last_letter]==">")){
$try_apop = true;
}else{
$try_apop = false;
$timestamp = "";
}
if ($auth_method != "plain"){
fputs($conn->fp, "AUTH\r\n");
$line = iil_ReadLine($conn->fp, 300);
if ($line[0]=="+"){
//auth command succeeded
//get list of auth methods
do{
$line = iil_ReadLine($conn->fp, 300);
$new_auth = strtolower(chop($line));
$auth_methods[$new_auth] = 1;
}while($line[0]!=".");
//echo "<!-- got auth methods //-->\n";
if ($auth_method == "check") $auth_method =
"auth";
}else{
//auth command failed
//revert to plain text
$auth_method = "plain";
}
}
//try AUTH CRAM-MD5
if (($auth_method=="auth") && ($auth_methods["cram-md5"])){
//echo "<!-- doing CRAM-MD5 //-->\n";
$result = iil_C_CramMD5($conn, $user, $password);
$conn->message .= "CRAM_MD5: $result\n";
}
//try APOP?
if ((!$result) && ($try_apop) && ($timestamp) &&
$auth_method!="plain"){
$result = iil_C_APOP($conn, $user, $password,
$timestamp);
$conn->message .= "\nAPOP: $try_apop $result\n";
}
if (!$result){
//do plain auth
fputs($conn->fp, "USER $user\r\n");
$line = trim(chop(iil_ReadLine($conn->fp, 1024)));
if (iil_StartsWith($line, "+OK")){
fputs($conn->fp, "PASS $password\r\n");
$line = trim(chop(iil_ReadLine($conn->fp,
1024)));
if (iil_StartsWith($line, "+OK"))
$result = true;
else{
$iil_errornum = -11;
$iil_error = htmlspecialchars($line);
iil_Close($conn);
return false;
}
}else{
$iil_errornum = -2;
$iil_error = "Unknown user: $user
\"".htmlspecialchars($line)."\"<br>Messages:".$conn->message;
iil_Close($conn);
return false;
}
}
}else{
$iil_error = "Could not connect to $host at port ".$port;
$iil_errornum = -1;
return false;
}
if ($result) return $conn;
else return false;
}
function iil_ExplodeQuotedString($delimiter, $string){
$quotes=explode("\"", $string);
while ( list($key, $val) = each($quotes))
if (($key % 2) == 1)
$quotes[$key] = str_replace($delimiter, "[EMAIL
PROTECTED]", $quotes[$key]);
$string=implode("\"", $quotes);
$result=explode($delimiter, $string);
while ( list($key, $val) = each($result) )
$result[$key] = str_replace("[EMAIL PROTECTED]", $delimiter,
$result[$key]);
return $result;
}
function iil_CheckForRecent($host, $user, $password, $mailbox){
return 0;
}
function iil_C_EnableCache(&$conn){
//just here for compatibility with imap
}
function iil_C_DisableCache(&$conn){
//just here for compatibility
}
function iil_C_Select(&$conn, $mailbox){
return true;
}
function iil_C_CountMessages(&$conn, $mailbox){
$num=-1;
$fp = $conn->fp;
if (fputs($fp, "STAT\r\n")){
$line=chop(fgets($fp, 300));
$a=explode(" ", $line);
$num=(int)$a[1];
$size = (int)$a[2];
}
return $num;
}
function iil_C_CheckForRecent(&$conn, $mailbox){
return 0;
}
function iil_SplitHeaderLine($string){
$pos=strpos($string, ":");
if ($pos>0){
$res[0]=substr($string, 0, $pos);
$res[1]=substr($string, $pos+2);
return $res;
}else{
return $string;
}
}
function iil_StrToTime($str){
//replace double spaces with single space
$str = trim($str);
$str = str_replace(" ", " ", $str);
//strip off day of week
$pos=strpos($str, " ");
$word = substr($str, 0, $pos);
if (!is_numeric($word)) $str = substr($str, $pos+1);
//explode, take good parts
$a=explode(" ",$str);
$month_a=array("Jan"=>1,"Feb"=>2,"Mar"=>3,"Apr"=>4,"May"=>5,"Jun"=>6,"Jul"=>7,"Aug"=>8,"Sep"=>9,"Oct"=>10,"Nov"=>11,"Dec"=>12);
$month_str=$a[1];
$month=$month_a[$month_str];
$day=$a[0];
$year=$a[2];
$time=$a[3];
$tz_str = $a[4];
$tz = substr($tz_str, 0, 3);
$ta=explode(":",$time);
$hour=(int)$ta[0]-(int)$tz;
$minute=$ta[1];
$second=$ta[2];
//make UNIX timestamp
return mktime($hour, $minute, $second, $month, $day, $year);
}
function iil_F_List($fp){
fputs($fp, "LIST\r\n");
$line = fgets($fp, 128);
if ($line[0]=="+"){
do{
$line = fgets($fp, 128);
if ($line[0]!="."){
$a = explode(" ", $line);
$id = (int)$a[0];
$size = (int)$a[1];
$index[$id] = $size;
}
}while($line[0]!=".");
}
return $index;
}
function iil_F_GetMessageID($fp, $id){
$messageID = "";
fputs($fp, "TOP $id 0\r\n");
$line = fgets($fp, 128);
if ($line[0]=="+"){
do{
//go through headers...
$line = chop(iil_ReadLine($fp, 300));
$a = iil_SplitHeaderLine($line);
if (strcasecmp($a[0], "message-id")==0){
$messageID = trim(chop($a[1]));
$messageID = substr(substr($messageID, 1), 0,
strlen($messageID)-2);
}
}while($line[0]!=".");
}
return $messageID;
}
function iil_C_CleanupSeenList(&$conn){
//clean up seen_list
iil_C_FetchSeenList($conn);
if (!is_array($conn->seen_list)) return false;
if (!is_array($conn->uid_cache)) return false;
foreach($conn->seen_list as $k=>$uid){
//see if UID in seen_list is still in INBOX
if (in_array($uid, $conn->uid_cache)) continue;
//if not, remove from seen_list
$dirty = true;
unset($conn->seen_list[$k]);
}
if ($dirty)
cache_write($conn->login, $conn->host, "read_list",
implode(",",$conn->seen_list), false);
}
function iil_C_FetchUIDs(&$conn){
$fp = $conn->fp;
if (is_array($conn->uid_cache)) return $conn->uid_cache;
else $conn->uid_cache = array();
fputs($fp, "UIDL\r\n");
$line = chop(fgets($fp,128));
if ($line[0]!='+') return array();
//get UID list, map MID -> UID
do{
$line = chop(fgets($fp, 1024));
$words = explode(' ',$line);
if (count($words)!=2) continue;
$conn->uid_cache[$words[0]] = $words[1];
}while($line[0]!='.');
//cleanup seen_list
iil_C_CleanupSeenList($conn);
return $conn->uid_cache;
}
function iil_C_UID2ID(&$conn, $reply_folder, $reply_uid){
return iil_C_UIDTOMID($conn, $reply_folder, $reply_uid);
}
function iil_C_UIDTOMID(&$conn, $folder, $uid){
$uids = iil_C_FetchUIDs($conn);
return array_search($uid, $uids);
}
function iil_C_GetMessageUID(&$conn, $message_id){
$fp = $conn->fp;
fputs($fp, "UIDL $message_id\r\n");
$line = chop(fgets($fp, 128));
if ($line[0]=='+'){
$words = explode(" ", $line);
if (count($words)>=3) return $words[2];
else{
$conn->error = $line;
return "";
}
}else{
$conn->error = $line;
return "";
}
}
function iil_C_Sort(&$conn, $mailbox, $index_field){
return false;
}
function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field){
return false;
/*
NOTE:
Following code is a complete functional implementation of this
particular function,
compatible with it's IMAP equivalence. Only problem is, with
POP3, it's less efficient
because the entire header for all messages have to be read in.
*/
$fp = $conn->fp;
$result = array();
$index_field = strtoupper($index_field);
//get index list
$index = iil_F_List($fp);
if (strcmp($index_field, "SIZE")==0) return $index;
reset($index);
//loop through all items
while ( list($id, $val) = each($index) ){
//fetch header
fputs($fp, "TOP $id 0\r\n");
$line = fgets($fp, 128);
if ($line[0]!="+") continue;
do{
//go through headers...
$line = chop(iil_ReadLine($fp, 300));
$a = iil_SplitHeaderLine($line);
//look for line containg field we want
if (strcasecmp($index_field,"date")==0) $a[1] =
iil_StrToTime($a[1]);
if (strcasecmp($a[0], $index_field)==0) $result[$id] =
$a[1];
}while($line[0]!=".");
}
return $result;
}
function iil_C_FetchSeenList(&$conn){
global $ICL_CAPABILITY;
if (!$ICL_CAPABILITY["flags"]) return 0;
if (!$conn->sl_fetched){
$conn->seen_list = explode(",",cache_read($conn->login,
$conn->host, "read_list"));
//echo "<!-- fetched seen list:\n";
//print_r($conn->seen_list);
//echo "\n//-->\n";
$conn->sl_fetched = true;
}
}
function iil_C_FetchHeaders(&$conn, $mailbox, $message_set){
global $ICL_CAPABILITY;
$uids = iil_C_FetchUIDs($conn);
iil_C_FetchSeenList($conn);
if (strpos($message_set, ":")>0){
$a = explode(":", $message_set);
$from_i = (int)$a[0];
$to_i = (int)$a[1];
}else if (strpos($message_set, ",")>0){
$a = explode(",", $message_set);
$n = count($a);
$from_i = (int)$a[0];
$to_i = (int)$a[$n-1];
}else{
$from_i = $to_i = $message_set;
}
$fp = $conn->fp;
$index = iil_F_List($fp);
$result = array();
for ($id=$from_i;(($id<=$to_i)&&($fp));$id++){
//echo "[".microtime().":begin $id]"; flush();
fputs($fp, "TOP $id 0\r\n");
$line = fgets($fp, 128);
//echo "[".microtime().":requested]"; flush();
//echo "Requested $id : $line \n"; flush();
if ($line[0]=="+"){
//initialize new iilBasicHeader object
$result[$id] = new iilBasicHeader;
$result[$id]->size = $index[$id];
$result[$id]->id = $id;
$result[$id]->subject = "";
$result[$id]->seen = false;
$result[$id]->recent = false;
$result[$id]->deleted = false;
$result[$id]->answered = false;
$result[$id]->uid = $uids[$id];
//fetch header into array
$c = 0;
$lines = array();
do{
socket_set_timeout($fp, 10);
$line = chop(iil_ReadLine($fp, 300));
if (strlen($line)>2){
if (ord($line[0]) <= 32)
$lines[$c] .=
(empty($lines[$c])?"":"\n").trim($line);
else{
$c++;
$lines[$c]=$line;
}
}
}while(($line[0]!=".")&&($fp));
//}while(($line[0]!="\r\n")&&($fp));
//}while((strpos($line, 'X-RCPT-TO:') ===
false)&&($fp));
//echo "[".microtime().":fetched header]"; flush();
//process header, fill iilBasicHeader obj.
//initialize
if (is_array($header_fields)){
reset($header_fields);
while ( list($k, $bar) = each($header_fields) )
$header_fields[$k] = "";
}
//create array with header field:data
$numlines = count($lines);
while (list($k,$string) = each($lines)){
$pos=strpos($string, ":");
if ($pos>0){
$field = strtolower(substr($string, 0,
$pos));
$string = substr($string, $pos+2);
}else{
$field = "";
}
if(!$header_fields[$field])
$header_fields[$field] = $string;
}
//echo '<!--amar '.$id.":\n";
//print_r($lines);
//print_r($header_fields);
//echo 'amar//-->'."\n";
//fill in object
$result[$id]->date = $header_fields["date"];
$result[$id]->timestamp =
iil_StrToTime($result[$id]->date);
$result[$id]->from = $header_fields["from"];
$result[$id]->to = $header_fields["to"];
$result[$id]->subject = $header_fields["subject"];
$result[$id]->replyto = $header_fields["reply-to"];
$result[$id]->cc = $header_fields["cc"];
$result[$id]->messageID =
substr(substr($header_fields["message-id"], 1), 0,
strlen($header_fields["message-id"])-2);
$result[$id]->encoding =
$header_fields["content-transfer-encoding"];
$result[$id]->ctype = $header_fields["content-type"];
//echo "[".microtime().":filled]<br>\n"; flush();
}
if ($ICL_CAPABILITY["flags"]){
$uid = iil_C_GetMessageUID($conn, $id);
if (is_array($conn->seen_list) && in_array($uid,
$conn->seen_list)){
$result[$id]->seen = true;
}
}
}
//echo microtime().".....done"; flush();
//echo '<!-- all:'."\n";
//print_r($result);
//echo '//-->'."\n";
return $result;
}
function iil_C_FetchHeader(&$conn, $mailbox, $id){
$fp = $conn->fp;
$index = iil_F_List($fp);
fputs($fp, "TOP $id 0\r\n");
$line = fgets($fp, 128);
if ($line[0]=="+"){
//initialize new iilBasicHeader object
$result = new iilBasicHeader;
$result->size = $index[$id];
$result->id = $id;
//fetch header into array
do{
$line = chop(iil_ReadLine($fp, 300));
if (strlen($line)>2){
if (ord($line[0]) <= 32) $lines[$c] .=
(empty($lines[$c])?"":"\n").trim($line);
else{
$c++;
$lines[$c]=$line;
}
}
}while($line[0]!=".");
//}while(strpos($line, 'X-RCPT-TO:') === false);
//process header, fill iilBasicHeader obj.
$numlines = count($lines);
for ($i=0;$i<$numlines;$i++){
//echo $lines[$i]."<br>\n";
list($field, $string) = iil_SplitHeaderLine($lines[$i]);
if (strcasecmp($field, "date")==0){
$result->date = $string;
$result->timestamp = iil_StrToTime($string);
}
else if (strcasecmp($field, "from")==0){
if(!$result->from)
$result->from = str_replace("\n", " ",
$string);
}
else if (strcasecmp($field, "to")==0){
if(!$result->to)
$result->to = $string;
}
else if (strcasecmp($field, "subject")==0)
$result->subject = str_replace("\n", "", $string);
else if (strcasecmp($field, "reply-to")==0)
$result->replyto=$string;
else if (strcasecmp($field, "cc")==0) $result->cc =
str_replace("\n", " ", $string);
else if (strcasecmp($field,
"Content-Transfer-Encoding")==0) $result->encoding=$string;
else if (strcasecmp($field, "message-id")==0)
$result->messageID = substr(substr($string, 1), 0,
strlen($string)-2);
}
return $result;
}else{
return false;
}
/*
$a=iil_C_FetchHeaders($conn, $mailbox, $id);
if (is_array($a)) return $a[$id];
else return false;
*/
}
function iil_SortHeaders($a, $field, $flag){
if (empty($field)) $field="uid";
$field=strtolower($field);
if ($field=="date") $field="timestamp";
if (empty($flag)) $flag="ASC";
$flag=strtoupper($flag);
$c=count($a);
if ($c>0){
/*
Strategy:
First, we'll create an "index" array.
Then, we'll use sort() on that array,
and use that to sort the main array.
*/
// create "index" array
$index=array();
reset($a);
while (list($key, $val)=each($a)){
$data=$a[$key]->$field;
if (is_string($data))
$data=strtoupper(str_replace("\"", "", $data));
$index[$key]=$data;
}
// sort index
$i=0;
if ($flag=="ASC") asort($index);
else arsort($index);
// form new array based on index
$result=array();
reset($index);
while (list($key, $val)=each($index)){
$result[$i]=$a[$key];
$i++;
}
}
return $result;
}
function iil_C_Expunge(&$conn, $mailbox){
return 0;
}
function iil_C_Flag(&$conn, $mailbox, $messages, $flag){
global $ICL_CAPABILITY;
if (!$ICL_CAPABILITY["flags"]) return 0;
if ($flag!="SEEN") return 0;
$dirty = false;
iil_C_FetchSeenList($conn);
$message_list = explode(",", $messages);
if (!is_array($message_list)) return 0;
while(list($n, $id)=each($message_list)){
$uid = iil_C_GetMessageUID($conn, $id);
if ($uid && !in_array($uid, $conn->seen_list)){
$conn->seen_list[] = $uid;
$dirty = true;
}
}
if ($dirty)
cache_write($conn->login, $conn->host, "read_list",
implode(",",$conn->seen_list), false);
return 0;
}
function iil_C_Delete(&$conn, $mailbox, $messages){
$fp = $conn->fp;
//create list of messages
$c = 0;
if (strpos($messages, ":")!==false){
$a = explode(":", $messages);
$start = $a[0];
$end = $a[1];
for ($i=$start;$i<=$end;$i++) $messages .=
(empty($messages)?"":",").$i;
}
$message_list = explode(",", $messages);
//go through them and delete one by one
iil_C_FetchSeenList($conn);
$dirty = false;
while ( list($key, $val) = each($message_list) ){
//remove from seen_list
$uid = iil_C_GetMessageUID($conn, $val);
$slk = array_search($uid, $conn->seen_list);
if ($slk!==false && $slk!==NULL){
$dirty = true;
unset($conn->seen_list[$slk]);
}
//delete message
fputs($fp, "DELE $val\r\n");
$line = iil_ReadLine($fp, 300);
if ($line[0]=="+"){
$c++;
}
}
//flush updated seen_list
if ($dirty)
cache_write($conn->login, $conn->host, "read_list",
implode(",",$conn->seen_list), false);
//disconnect and reconnect to expunge
iil_Close($conn);
$conn = iil_Connect($conn->host, $conn->login, $conn->password);
return $c;
}
function iil_C_Undelete(&$conn, $mailbox, $messages){
return -1;
}
function iil_C_Unseen(&$conn, $mailbox, $messages){
global $ICL_CAPABILITY;
if (!$ICL_CAPABILITY["flags"]) return 0;
$c = 0;
$dirty = false;
iil_C_FetchSeenList($conn);
$message_list = explode(",", $messages);
if (is_array($message_list)){
while(list($n, $id)=each($message_list)){
$uid = iil_C_GetMessageUID($conn, $id);
if ($uid){
$key = array_search($uid, $conn->seen_list);
$conn->seen_list[$key] = "";
$dirty = true;
$c++;
}
}
}
if ($dirty)
cache_write($conn->login, $conn->host, "read_list",
implode(",",$conn->seen_list), false);
return $c;
}
function iil_C_Copy(&$conn, $messages, $from, $to){
return 0;
}
function iil_FormatSearchDate($month, $day, $year){
$months=array(
1=>"Jan", 2=>"Feb", 3=>"Mar", 4=>"Apr",
5=>"May", 6=>"Jun", 7=>"Jul", 8=>"Aug",
9=>"Sep", 10=>"Oct", 11=>"Nov", 12=>"Dec"
);
return $day."-".$months[$month]."-".$year;
}
function iil_C_Search(&$conn, $folder, $criteria){
return false;
}
function iil_C_Move(&$conn, $messages, $from, $to){
return 0;
}
function iil_C_GetHierarchyDelimiter(&$conn){
return "/";
}
function iil_C_ListMailboxes(&$conn, $ref, $mailbox){
return array("INBOX");
}
function iil_ActionPrintBody($line){
echo chop($line)."\n"; flush();
return "";
}
function iil_ActionFetchBody($line){
return chop($line)."\n";
}
function iil_ActionBase64Decode($line){
$line = trim(chop($line));
echo base64_decode($line); flush();
return "";
}
function iil_ActionFetchHeader($line){
return "";
}
function iil_ClearCache($login, $host){
$cacheDir = fs_get_path("cache", $login, $host);
if (file_exists(realpath($cacheDir))){
if ($handle = opendir($cacheDir)) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$file_path = $cacheDir."/".$file;
//echo $file_path."<br>\n";
unlink($file_path);
}
}
closedir($handle);
}
}
}
function iil_C_OpenMessage(&$conn, $id){
/*
POST-CONDITIONS:
TRUE: if cache file has been opened
FALSE: if cache file is not open
$conn->cacheMode:
x: failed
w: open cache for writing
r: cache opened for reading
*/
$conn->messageID = iil_F_GetMessageID($conn->fp, $id);
$messageID = $conn->messageID;
$conn->errorNum = 0;
$conn->cacheMode = "x";
if (!empty($messageID)){
$cacheDir = fs_get_path("cache", $conn->login, $conn->host);
if (file_exists(realpath($cacheDir))){
$cachePath = $cacheDir."/".urlencode($messageID);
if (file_exists(realpath($cachePath))) $mode = "r";
else $mode = "w";
$conn->cacheFP = fopen($cachePath, $mode);
if ($conn->cacheFP){
$conn->cacheMode = $mode;
return true;
}else{
$conn->errorNum = -3;
$conn->error = "Couldn't open cache for
reading";
}
}else{
$conn->errorNum = -2;
$conn->error = "Invalid cache directory";
}
}else{
$conn->errorNum = -1;
$conn->error = "Invalid messageID";
}
return false;
}
function iil_C_CloseMessage(&$conn){
if (($conn->cacheMode=="r") || ($conn->cacheMode=="w"))
fclose($conn->cacheFP);
$conn->cacheMode = "x";
$conn->messageID = "";
}
function iil_C_FetchBodyPart(&$conn, $boundary, &$last_line, $the_part, &$part,
$action, $bytes_total, &$bytes_read){
if ($the_part==0) $the_part="";
$original_boundary = $boundary;
$raw_header = "";
$raw_text = "";
if ($conn->cacheMode=="r") $fp = $conn->cacheFP;
else $fp = $conn->fp;
// read headers from file
$lines = array();
$count = 0;
do{
$line = iil_C_ReadLine($conn);
$bytes_read+=strlen($line);
$raw_header .= $line;
$line = chop($line);
if (!empty($line)){
//echo "Read: ".$line."<br>\n";
$c = 0;
if (ord($line[0]) <= 32) $lines[$count].="
".trim($line);
else{
$count++;
$lines[$count] = $line;
//echo "\t".$count.":".$line."\n";
}
}
}while(!empty($line));
if ((strcmp($part, $the_part)==0)&&(strcmp($action, "FetchHeader")==0))
$str=$raw_header;
//echo "Read header: ".count($lines)." lines\n"; flush();
// parse header into associative array
$header = iil_ContentHeaderArray($lines);
//echo "Parsed headers\n"; flush();
//echo implode("\n", $lines)."\n\n";
//echo $header["content-type"]["major"]." vs multipart";
// generate bodystructure string(s)
if (strcasecmp($header["content-type"]["major"], "multipart")==0){
//echo "Parsing multipart\n"; flush();
$params = $header["content-type"]["parameters"];
while ( list($k, $v) = each($params) ) if (strcasecmp($v,
"\"boundary\"")==0) $boundary = "--".str_replace("\"","",$params[$k+1]);
//echo "Boundary: ".$boundary."<br>\n";
do{
$line = iil_C_ReadLine($conn);
$bytes_read+=strlen($line);
}while(!iil_StartsWith($line, $boundary));
//parse body parts
$part_num = 0;
do{
$part_num++;
$next_part = $part.(!empty($part)?".":"").$part_num;
$str .= iil_C_FetchBodyPart($conn, $boundary,
$last_line, $the_part, $next_part, $action, $bytes_total, $bytes_read);
$end = (((strlen($last_line) - strlen($boundary)) > 0)
|| (chop($last_line)=="."));
}while((!$end) && (!feof($fp))&&(chop($last_line)!="."));
//read up to next message boundary
if (chop($last_line)!="."){
do{
$line = iil_C_ReadLine($conn);
$bytes_read += strlen($line);
$end = ((iil_StartsWith($line,
$original_boundary)) || (chop($last_line)=="."));
}while((!$end)&&(!feof($fp))&&(chop($line)!="."));
$last_line = chop($line);
}
}else if (strcasecmp($header["content-type"]["major"], "message")==0){
//read blank lines (up to and including first line, which
hopefully isn't important)
do{
$line = iil_C_ReadLine($conn);
}while(iil_StartsWith($line, "\n"));
$str .= iil_C_FetchBodyPart($conn, $boundary, $last_line,
$the_part, $part, $action, $bytes_total, $bytes_read);
}else{
// read actual data
//echo "Will do action: $action <br>\n"; flush();
if (strcmp($part, $the_part)==0){
$this_is_it=ture;
$handler = "iil_Action".$action;
}else $this_is_it = false;
do{
$line = iil_C_ReadLine($conn);
$bytes_read += strlen($line);
if (($this_is_it)&&(!iil_StartsWith($line,
$boundary))&&(chop($line)!=".")) $str.=$handler($line);
$line = chop($line);
//echo "Read $bytes_read of $bytes_total bytes<br>\n";
flush();
}while((!iil_StartsWith($line, $boundary)) &&
((!feof($fp))&&($line!=".")));
$last_line = $line;
}
//echo "Read $bytes_read out of $bytes_total <br>\n"; flush();
return $str;
}
function iil_C_HandlePartBody(&$conn, $id, $part, $action){
iil_C_OpenMessage($conn, $id);
//echo "Message opened\n"; flush();
if (($conn->cacheMode=="x") || ($conn->cacheMode=="w")){
$fp = $conn->fp;
fputs($fp, "RETR $id\r\n");
$line = fgets($fp, 100);
if ($line[0]!="+"){
$conn->errorNum = -10;
$conn->error = "POP3 error:".$line;
}
}
//echo "FP opened\n";
if ($conn->fp){
//echo "Going ingot iil_C_FetchBodyPart\n";
$result = iil_C_FetchBodyPart($conn, "", $line, $part,
$part_blah, $action, $total_size, $bytes);
}else{
$conn->error = "Bad fp";
}
iil_C_CloseMessage($conn);
return $result;
}
function iil_C_FetchPartBody(&$conn, $mailbox, $id, $part){
return iil_C_HandlePartBody($conn, $id, $part, "FetchBody");
}
function iil_C_PrintPartBody(&$conn, $mailbox, $id, $part){
return iil_C_HandlePartBody($conn, $id, $part, "PrintBody");
}
function iil_C_PrintBase64Body(&$conn, $mailbox, $id, $part){
return iil_C_HandlePartBody($conn, $id, $part, "Base64Decode");
}
function iil_C_FetchPartHeader(&$conn, $mailbox, $id, $part){
return iil_C_HandlePartBody($conn, $id, $part, "FetchHeader");
}
function iil_C_CreateFolder(&$conn, $folder){
return false;
}
function iil_C_RenameFolder(&$conn, $from, $to){
return false;
}
function iil_C_DeleteFolder(&$conn, $folder){
return false;
}
function iil_C_Append(&$conn, $folder, $message){
return false;
}
function iil_ReadHeader($fp){
$lines = array();
$c = 0;
//echo "++++<br>\n";
do{
$line = chop(iil_ReadLine($fp, 300));
if (!empty($line)){
//echo "Read: ".$line."<br>\n";
if (ord($line[0]) <= 32) $lines[$c].=" ".trim($line);
else{
$c++;
$lines[$c] = $line;
}
}
}while(!empty($line));
//echo "++++<br>\n";
return $lines;
}
function iil_ParseContentHeader($data){
$parameters = array();
$pos = strpos($data, ";");
if ($pos === false){
//no';'? then no parameters, all we have is main data
$major_data = $data;
}else{
//every thing before first ';' is main data
$major_data = substr($data, 0, $pos);
$data = substr($data, $pos+1);
//go through parameter list (delimited by ';')
$parameters_a = explode(";", $data);
while ( list($key, $val) = each($parameters_a) ){
// split param name from param data
$val = trim(chop($val));
$eqpos = strpos($val, "=");
$p_field = substr($val, 0, $eqpos);
$p_data = substr($val, $eqpos+1);
$field = trim(chop($p_field));
$p_data = trim(chop($p_data));
// add quotes
if ($p_data[0]!="\"") $p_data = "\"".$p_data."\"";
$p_field = "\"".$p_field."\"";
// add to array
array_push($parameters, $p_field);
array_push($parameters, $p_data);
}
}
$result["data"] = trim(chop($major_data));
if (count($parameters) > 0) $result["parameters"] = $parameters;
else $result["parameters"] = "NIL";
return $result;
}
function iil_ContentHeaderArray($lines){
//echo "---<br>\n";
$num_lines = count($lines);
//initialize header variables with default (fall back) values
$header["content-type"]["major"] = "text";
$header["content-type"]["minor"] = "plain";
$header["content-transfer-encoding"]["data"] = "8bit";
while ( list($key, $line) = each($lines) ){
//echo $line."<br>\n";
list($field, $data) = iil_SplitHeaderLine($line);
// is this a content header?
if (iil_StartsWith($field, "Content")){
$field = strtolower($field);
// parse line, add "data" and "parameters" to header[]
$header[$field] = iil_ParseContentHeader($data);
// need some special care for "content-type" header line
if (strcasecmp($field, "content-type")==0){
$typeStr = $header["content-type"]["data"];
//split major and minor content types
$slashPos = strpos($typeStr,"/");
$major_type = substr($typeStr, 0, $slashPos);
$minor_type = substr($typeStr, $slashPos+1);
$header["content-type"]["major"] =
strtolower($major_type);
$header["content-type"]["minor"] =
strtolower($minor_type);
}
}
}
return $header;
}
function iil_C_ReadNParse($conn, $boundary, &$last_line){
$original_boundary = $boundary;
if ($conn->cacheMode=="r") $fp = $conn->cacheFP;
else $fp = $conn->fp;
// read headers from file
$lines = iil_ReadHeader($fp);
if (count($lines) == 0) return "";
if ($conn->cacheMode=="w") fputs($conn->cacheFP, implode("\n",
$lines)."\n\n");
// parse header into associative array
$header = iil_ContentHeaderArray($lines);
// generate bodystructure string(s)
if (strcasecmp($header["content-type"]["major"], "multipart")==0){
$params = $header["content-type"]["parameters"];
while ( list($k, $v) = each($params) ) if (strcasecmp($v,
"\"boundary\"")==0) $boundary = "--".str_replace("\"","",$params[$k+1]);
do{
$line = iil_C_ReadLine($conn);
}while(!iil_StartsWith($line, $boundary));
$str = "(";
//parse body parts
do{
$str .= iil_C_ReadNParse($conn, $boundary, $last_line);
$end = (((strlen($last_line) - strlen($boundary)) > 0)
|| (chop($last_line)=="."));
}while((!$end) && (!feof($fp))&&($line!="."));
$str .=" \"".$header["content-type"]["minor"]."\" (".implode("
", $params).") NIL NIL)";
//if next boundary encountered
if ((chop($line)!=".") && (chop($last_line)!=".")){
//read up to next message boundary
do{
$line = iil_C_ReadLine($conn);
$end = ((iil_StartsWith($line,
$original_boundary)) || (chop($last_line)=="."));
}while((!$end)&&(!feof($fp))&&(chop($line)!=".")) ;
$last_line = chop($line);
}
}else if (strcasecmp($header["content-type"]["major"], "message")==0){
//read blank lines (up to and including first line, which
hopefully isn't important)
do{
$line = iil_C_ReadLine($conn);
}while(iil_StartsWith($line, "\n"));
//format structure string
$str = '("'.$header["content-type"]["major"].'"
"'.$header["content-type"]["minor"].'"';
$str.= ' NIL NIL NIL';
$str.= ' "'.$header["content-transfer-encoding"]["data"].'"';
$byte_count = 'NIL';
$str.= " $byte_count NIL ";
//recursively parse content
$str.= iil_C_ReadNParse($conn, $boundary, $last_line);
//more structure stuff
$line_count = 'NIL';
$str.= " $line_count NIL ";
if (!empty($header["content-disposition"]["data"])){
$param_a = $header["content-disposition"]["parameters"];
$str .=
"(\"".$header["content-disposition"]["data"]."\" ";
if ((is_array($param_a)) && (count($param_a) > 0))
$str .="(".implode(" ", $param_a).")";
else $str .="NIL";
$str .= ") ";
}else $str .= "NIL ";
$str.= ' NIL)';
}else{
// read actual data
$content_size = 0;
$num_lines = 0;
do{
$line = iil_C_ReadLine($conn);
$content_size += strlen($line);
$num_lines++;
$line = chop($line);
}while((!iil_StartsWith($line, $boundary)) &&
((!feof($fp))&&($line!=".")));
$last_line = $line;
// generate bodystructure string
$str = "(";
$str .= "\"".$header["content-type"]["major"]."\" ";
$str .= "\"".$header["content-type"]["minor"]."\" ";
if
((is_array($header["content-type"]["parameters"]))&&(count($header["content-type"]["parameters"])
> 0))
$str .="(".implode(" ",
$header["content-type"]["parameters"]).") ";
else
$str .= "NIL ";
if ($header["content-id"]["data"])
$str .= "\"".$header["content-id"]["data"]."\" ";
else
$str .= "NIL ";
$str .= "NIL ";
$str .= "\"".$header["content-transfer-encoding"]["data"]."\" ";
$str .= $content_size." ";
if (strcasecmp($header["content-type"]["major"], "text")==0)
$str .= $num_lines." ";
$str .= "NIL ";
if (!empty($header["content-disposition"]["data"])){
$param_a = $header["content-disposition"]["parameters"];
$str .=
"(\"".$header["content-disposition"]["data"]."\" ";
if ((is_array($param_a)) && (count($param_a) > 0))
$str .="(".implode(" ", $param_a).")";
else $str .="NIL";
$str .= ") ";
}else $str .= "NIL ";
$str .= "NIL ";
$str = substr($str, 0, strlen($str)-1);
$str .= ")";
}
return $str;
}
function iil_C_FetchStructureString(&$conn, $folder, $id){
$fp = $conn->fp;
iil_C_OpenMessage($conn,$id);
if (($conn->cacheMode=="x") || ($conn->cacheMode=="w")){
fputs($fp, "RETR $id\r\n");
$line = fgets($fp, 100);
if ($line[0]!="+"){
$conn->errorNum = -10;
$conn->error = "POP3 error:".$line;
}
}
if ($conn->fp){
$str = iil_C_ReadNParse($conn, "", $line);
}
iil_C_CloseMessage($conn);
return $str;
}
function iil_C_PrintSource(&$conn, $folder, $id, $part){
iil_C_OpenMessage($conn,$id);
if ($conn->cacheMode=="r") $fp = $conn->cacheFP;
else $fp = $conn->fp;
if (($conn->cacheMode=="x") || ($conn->cacheMode=="w")){
fputs($fp, "RETR $id\r\n");
$line = fgets($fp, 100);
if ($line[0]!="+"){
$conn->errorNum = -10;
$conn->error = "POP3 error:".$line;
}
}
if ($fp){
do{
$line = iil_ReadLine($fp, 300);
echo $line;
}while((chop($line)!=".")&&(!feof($fp)));
}
iil_C_CloseMessage($conn);
}
function iil_C_GetQuota($conn){
global $POP_QUOTA;
$index = iil_F_List($conn->fp);
$used = 0;
if (is_array($index)) while ( list($k,$size) = each($index) ) $used +=
$size;
else $used = 0;
$total = $POP_QUOTA[$conn->host];
$used = (int)($used/1024);
$result["used"] = $used;
$result["total"] = (empty($total)?"??":$total);
$result["percent"] = (empty($total)?"??":round(($used/$total)*100));
$result["free"] = 100 - $result["percent"];
return $result;
}
?>
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Ilohamail-devel mailing list
Ilohamail-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ilohamail-devel