<?php

# pop3-2-b2 mail to blog
# v0.3 20020716

require_once('wp-config.php');
require_once(
$abspath.$b2inc."/b2template.functions.php");
require_once(
$abspath.$b2inc.'/b2vars.php');
require_once(
$abspath.$b2inc.'/class.POP3.php');
require_once(
$abspath.$b2inc.'/b2functions.php');
require_once(
$abspath.$b2inc."/xmlrpc.inc");
require_once(
$abspath.$b2inc."/xmlrpcs.inc");

timer_start();

$use_cache 1;
$output_debugging_info 0;    # =1 if you want to output debugging info
$time_difference get_settings('time_difference');

if (
$use_phoneemail) {
    
// if you're using phone email, the email will already be in your timezone
    
$time_difference 0;
}

error_reporting(2037);
$mailserver "{".$mailserver_url.":".$mailserver_port."/pop3/notls}";

#Open POP3 Mailbox for checking mail
if (!($mbox imap_open ("$mailserver""$mailserver_login""$mailserver_pass"))) die ("error opening mailbox");

#Check to see if there is any mail in there
if (imap_num_msg($mbox) < 1) die(); //no mail found, no need for error log

/*$pop3 = new POP3();

if(!$pop3->connect($mailserver_url, $mailserver_port)) {
    echo "Ooops $pop3->ERROR <br />\n";
    exit;
}

$Count = $pop3->login($mailserver_login, $mailserver_pass);
if((!$Count) || ($Count == -1)) {
    echo "<h1>Login Failed: $pop3->ERROR</h1>\n";
    $pop3->quit();
    exit;
}
*/

// ONLY USE THIS IF YOUR PHP VERSION SUPPORTS IT!
//register_shutdown_function($pop3->quit());

#Count number of messages to pass to the post functions
$Count imap_num_msg($mbox);
$overview=imap_fetch_overview($mbox,"1:$Count",0);

for (
$iCount=1$iCount<=$Count$iCount++) {

    
$content '';
    
$content_type '';
    
$content_disposition '';
    
$boundary '';
    
$bodysignal 0;
    
$dmonths = array('Jan''Feb''Mar''Apr''May''Jun',
                     
'Jul''Aug''Sep''Oct''Nov''Dec');

    
#Check subject line for phone-email and subject prefix, if not present, simply die
    
$subject $overview[$iCount-1]->subject;
    if (
$use_phoneemail) {
        
$subject explode($phoneemail_separator$subject);
        
$subject trim($subject[0]);
    }
    global 
$subjectprefix;
    if (!
ereg($subjectprefix$subject)) {
        continue;
    }
    
#Get the date from the email
    
$ddate $overview[$iCount-1]->date;
    if (
strpos($ddate',')) {
        
$ddate trim(substr($ddatestrpos($ddate',')+1strlen($ddate)));
    }
    
$date_arr explode(' '$ddate);
    
$date_time explode(':'$date_arr[3]);

    
$ddate_H $date_time[0];
    
$ddate_i $date_time[1];
    
$ddate_s $date_time[2];

    
$ddate_m $date_arr[1];
    
$ddate_d $date_arr[0];
    
$ddate_Y $date_arr[2];
    for (
$i=0$i<12$i++) {
        if (
$ddate_m == $dmonths[$i]) {
            
$ddate_m $i+1;
        }
    }
    
$ddate_U mktime($ddate_H$ddate_i$ddate_s$ddate_m$ddate_d$ddate_Y);
    
$ddate_U $ddate_U + ($time_difference 3600);
    
$post_date date('Y-m-d H:i:s'$ddate_U);


    
$ddate_today time() + ($time_difference 3600);
    
$ddate_difference_days = ($ddate_today $ddate_U) / 86400;


    
# starts buffering the output
    
ob_start();

    if (
$ddate_difference_days 14) {
        echo 
'Too old<br />';
        continue;
    }
    if (
preg_match('/'.$subjectprefix.'/'$subject)) {
        
$userpassstring '';

        echo 
'<div style="border: 1px dashed #999; padding: 10px; margin: 10px;">';
        echo 
"<p><b>$iCount</b></p><p><b>Subject: </b>$subject</p>\n";

        
$subject trim(str_replace($subjectprefix''$subject));

        
#Get the content of the post
        
$content imap_fetchbody($mbox$iCount1);
        
$struct imap_fetchstructure($mbox$iCount);
        
$content trim($content);
        echo 
"<p><b>Raw content:</b><br /><pre>".$content.'</pre></p>';

        
$btpos strpos($content$bodyterminator);
        if (
$btpos) {
            
$content substr($content0$btpos);
        }
        
$content trim($content);
        
$blah explode("\n"$content);
        
$firstline $blah[0];
        
$secondline $blah[1];

        if (
$use_phoneemail) {
            
$btpos strpos($firstline$phoneemail_separator);
            if (
$btpos) {
                
$userpassstring trim(substr($firstline0$btpos));
                
$content trim(substr($content$btpos+strlen($phoneemail_separator), strlen($content)));
                
$btpos strpos($content$phoneemail_separator);
                if (
$btpos) {
                    
$userpassstring trim(substr($content0$btpos));
                    
$content trim(substr($content$btpos+strlen($phoneemail_separator), strlen($content)));
                }
            }
            
$contentfirstline $blah[1];
        } else {
            
$userpassstring $firstline;
            
$contentfirstline '';
        }
        
$flat 999.0;
        
$flon 999.0;
        
$secondlineParts explode(':',$secondline);
        if(
strncmp($secondlineParts[0],"POS",3)==0) {
            echo 
"Found POS:<br>\n";
            
//echo "Second parts is:".$secondlineParts[1];
            // the second line is the postion listing line
            
$secLineParts explode(',',$secondlineParts[1]);
            
$flatStr $secLineParts[0];
            
$flonStr $secLineParts[1];
            
//echo "String are ".$flatStr.$flonStr;
            
$flat floatval($secLineParts[0]);
            
$flon floatval($secLineParts[1]);
            
//echo "values are ".$flat." and ".$flon;
            // ok remove that position... we should not have it in the final output
            
$content str_replace($secondline,'',$content);
        }

        
$blah explode(':'$userpassstring);
        
$user_login $blah[0];
        
$user_pass $blah[1];

        
$content $contentfirstline.str_replace($firstline''$content);
        
$content trim($content);

        echo 
"<p><b>Login:</b> $user_login, <b>Pass:</b> $user_pass</p>";

        
#Check to see if there is an attachment, if there is, save the filename in the temp directory
        #First define some constants and message types
        
$type = array("text""multipart""message""application""audio",
        
"image""video""other");
        
#message encodings
        
$encoding = array("7bit""8bit""binary""base64""quoted-printable",
        
"other");

        
#parse message body (not really used yet, will be used for multiple attachments)
        
$attach parse($struct);
        
$attach_parts get_attachments($attach);
        
        
#get the attachment
        
$attachment imap_fetchbody($mbox$iCount2);
        if (
$attachment != '') {
            
$attachment imap_base64($attachment);
            
$temp_file "tmp/" $struct->parts[1]->dparameters[0]->value;
            if (!(
$temp_fp fopen($temp_file"w"))) die("error");
            
fputs($temp_fp$attachment);
            
fclose($temp_fp);
            }
        else 
$attachment false;

        
$sql "SELECT ID, user_level FROM $tableusers WHERE user_login='$user_login' AND user_pass='$user_pass' ORDER BY ID DESC LIMIT 1";
        
$result $wpdb->get_row($sql);

        if (!
$result) {
            echo 
'<p><b>Wrong login or password.</b></p></div>';
            continue;
        }

        
$user_level $result->user_level;
        
$post_author $result->ID;
        if (
$user_level 0) {
            
$post_title xmlrpc_getposttitle($content);
            
$post_category xmlrpc_getpostcategory($content);

            if (
$post_title == '') {
                
$post_title $subject;
            }
            if (
$post_category == '') {
                
$post_category $default_category;
            }

            if (!
$thisisforfunonly) {
                
$post_title addslashes(trim($post_title));
                
$content addslashes(trim($content));
                
                
#If we find an attachment, add it to the post
                
if (($attachment))
                    
$content "<center><img src = \"".$siteurl."/tmp\/".$struct->parts[1]->dparameters[0]->value."\"  alt=\"moblog\" /></center>".$content;
                if(
$flat 500) {
                    
$sql "INSERT INTO $tableposts (post_author, post_date, post_content, post_title, post_category) VALUES ($post_author, '$post_date', '$content', '$post_title', $post_category)";
                } else {
                    
$sql "INSERT INTO $tableposts (post_author, post_date, post_content, post_title, post_category, post_lat, post_lon) VALUES ($post_author, '$post_date', '$content', '$post_title', $post_category, $flat, $flon)";
                }
                
$result $wpdb->query($sql);
                
$post_ID $wpdb->insert_id;
                echo 
"The result is: ".$result;
                if (isset(
$sleep_after_edit) && $sleep_after_edit 0) {
                    
sleep($sleep_after_edit);
                }

                
$blog_ID 1;
                if(
$flat 500) {
                    
pingGeoUrl($post_ID);
                }
                
// HACK HACK HACK this next line is commented out because I don't know what the word-press replacement
                // is.  right now it's undefined and does not work
                //rss_update($blog_ID);
                
pingWeblogs($blog_ID);
                
pingCafelog($cafelogID$post_title$post_ID);
                
pingBlogs($blog_ID);
                
pingback($content$post_ID);

                
#delete successful email, mark for deletion actually
                
if ($result >0) {imap_delete($mbox$iCount);echo "deleted successfully";}
                else die (
"error deleting message");
            }
            echo 
"\n<p><b>Posted title:</b> $post_title<br />";
            echo 
"\n<b>Posted content:</b><br /><pre>".$content.'</pre></p>';

        } else {
            echo 
'<p><strong>Level 0 users can\'t post.</strong></p>';
        }
        echo 
'</div>';
        if (
$output_debugging_info) {
            
ob_end_flush();
        } else {
            
ob_end_clean();
        }
    }
    
#Clean out the inbox by deleting emails marked for deletion
    
imap_expunge($mbox); 
}

#Global Function definitions (as from PHP.net), not used yet, will be used for multiple
#attachment parsing

    
function parse($structure)
    {
        global 
$type;
        global 
$encoding;

        
// create an array to hold message sections
        
$ret = array();

        
// split structure into parts
        
$parts $structure->parts;

        for(
$x=0$x<sizeof($parts); $x++)
        {
            
$ret[$x]["pid"] = ($x+1);

            
$this $parts[$x];

            
// default to text
            
if ($this->type == "") { $this->type 0; }
            
$ret[$x]["type"] = $type[$this->type] . "/" strtolower($this->subtype);

            
// default to 7bit
            
if ($this->encoding == "") { $this->encoding 0; }
            
$ret[$x]["encoding"] = $encoding[$this->encoding];

            
$ret[$x]["size"] = strtolower($this->bytes);

            
$ret[$x]["disposition"] = strtolower($this->disposition);

            if (
strtolower($this->disposition) == "attachment")
            {
                
$params $this->dparameters;
                foreach (
$params as $p)
                {
                    if(
$p->attribute == "FILENAME")
                    {
                    
$ret[$x]["name"] = $p->value;
                    break;
                    }
                }
            }
        }

    return 
$ret;
    }

    function 
get_attachments($arr)
    {
        for(
$x=0$x<sizeof($arr); $x++)
        {
            if(
$arr[$x]["disposition"] == "attachment")
            {
            
$ret[] = $arr[$x];
            }
        }
        return 
$ret;

    }

imap_close($mbox);

timer_stop($output_debugging_info);
exit;

?>