]> git.mxchange.org Git - friendica.git/blobdiff - include/poller.php
Merge pull request #64 from tomtom84/master
[friendica.git] / include / poller.php
index 7d42c63b5f8d1731ce57e6c280d9ab67cbd58376..cfbc46b87e9d08c5ee5728caa8099ee7a52763ee 100755 (executable)
@@ -1,6 +1,7 @@
 <?php
 
 require_once("boot.php");
+require_once("include/quoteconvert.php");
 
 
 function poller_run($argv, $argc){
@@ -349,7 +350,7 @@ function poller_run($argv, $argc){
                                || ($contact['network'] === NETWORK_DIASPORA)
                                || ($contact['network'] === NETWORK_FEED) ) {
 
-                               // Upgrading DB fields from an older Friendika version
+                               // Upgrading DB fields from an older Friendica version
                                // Will only do this once per notify-enabled OStatus contact
                                // or if relationship changes
 
@@ -371,10 +372,14 @@ function poller_run($argv, $argc){
                        }
                        elseif($contact['network'] === NETWORK_MAIL || $contact['network'] === NETWORK_MAIL2) {
 
+                               logger("Mail: Fetching");
+
                                $mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1);
                                if($mail_disabled)
                                        continue;
 
+                               logger("Mail: Enabled");
+
                                $mbox = null;
                                $x = q("SELECT `prvkey` FROM `user` WHERE `uid` = %d LIMIT 1",
                                        intval($importer_uid)
@@ -388,6 +393,7 @@ function poller_run($argv, $argc){
                                        openssl_private_decrypt(hex2bin($mailconf[0]['pass']),$password,$x[0]['prvkey']);
                                        $mbox = email_connect($mailbox,$mailconf[0]['user'],$password);
                                        unset($password);
+                                       logger("Mail: Connect");
                                        if($mbox) {
                                                q("UPDATE `mailacct` SET `last_check` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1",
                                                        dbesc(datetime_convert()),
@@ -397,11 +403,16 @@ function poller_run($argv, $argc){
                                        }
                                }
                                if($mbox) {
+                                       logger("Mail: mbox");
 
                                        $msgs = email_poll($mbox,$contact['addr']);
 
                                        if(count($msgs)) {
+                                               logger("Mail: Parsing ".count($msgs)." mails.");
+
                                                foreach($msgs as $msg_uid) {
+                                                       logger("Mail: Parsing mail ".$msg_uid);
+
                                                        $datarray = array();
                                                        $meta = email_msg_meta($mbox,$msg_uid);
                                                        $headers = email_msg_headers($mbox,$msg_uid);
@@ -409,13 +420,13 @@ function poller_run($argv, $argc){
                                                        // look for a 'references' header and try and match with a parent item we have locally.
 
                                                        $raw_refs = ((x($headers,'references')) ? str_replace("\t",'',$headers['references']) : '');
-                                                       $datarray['uri'] = trim($meta->message_id,'<>');
+                                                       $datarray['uri'] = msgid2iri(trim($meta->message_id,'<>'));
 
                                                        if($raw_refs) {
                                                                $refs_arr = explode(' ', $raw_refs);
                                                                if(count($refs_arr)) {
                                                                        for($x = 0; $x < count($refs_arr); $x ++)
-                                                                               $refs_arr[$x] = "'" . str_replace(array('<','>',' '),array('','',''),dbesc($refs_arr[$x])) . "'";
+                                                                               $refs_arr[$x] = "'" . msgid2iri(str_replace(array('<','>',' '),array('','',''),dbesc($refs_arr[$x]))) . "'";
                                                                }
                                                                $qstr = implode(',',$refs_arr);
                                                                $r = q("SELECT `uri` , `parent-uri` FROM `item` WHERE `uri` IN ( $qstr ) AND `uid` = %d LIMIT 1",
@@ -436,27 +447,71 @@ function poller_run($argv, $argc){
                                                        );
 
                                                        if(count($r)) {
+                                                               logger("Mail: Seen before ".$msg_uid);
                                                                if($meta->deleted && ! $r[0]['deleted']) {
                                                                        q("UPDATE `item` SET `deleted` = 1, `changed` = '%s' WHERE `id` = %d LIMIT 1",
                                                                                dbesc(datetime_convert()),
                                                                                intval($r[0]['id'])
                                                                        );
-                                                               }               
+                                                               }
+                                                               switch ($mailconf[0]['action']) {
+                                                                       case 0:
+                                                                               break;
+                                                                       case 1:
+                                                                               logger("Mail: Deleting ".$msg_uid);
+                                                                               imap_delete($mbox, $msg_uid, FT_UID);
+                                                                               break;
+                                                                       case 2:
+                                                                               logger("Mail: Mark as seen ".$msg_uid);
+                                                                               imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
+                                                                               break;
+                                                                       case 3:
+                                                                               logger("Mail: Moving ".$msg_uid." to ".$mailconf[0]['movetofolder']);
+                                                                               imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
+                                                                               if ($mailconf[0]['movetofolder'] != "")
+                                                                                       imap_mail_move($mbox, $msg_uid, $mailconf[0]['movetofolder'], FT_UID);
+                                                                               break;
+                                                               }
                                                                continue;
                                                        }
-                                                       $datarray['title'] = notags(trim($meta->subject));
+
+                                                       // Decoding the header
+                                                       $subject = imap_mime_header_decode($meta->subject);
+                                                       $datarray['title'] = "";
+                                                       foreach($subject as $subpart)
+                                                               if ($subpart->charset != "default")
+                                                                       $datarray['title'] .= iconv($subpart->charset, 'UTF-8//IGNORE', $subpart->text);
+                                                               else
+                                                                       $datarray['title'] .= $subpart->text;
+
+                                                       $datarray['title'] = notags(trim($datarray['title']));
+
+                                                       //$datarray['title'] = notags(trim($meta->subject));
                                                        $datarray['created'] = datetime_convert('UTC','UTC',$meta->date);
-       
+
                                                        $r = email_get_msg($mbox,$msg_uid);
-                                                       if(! $r)
+                                                       if(! $r) {
+                                                               logger("Mail: can't fetch msg ".$msg_uid);
                                                                continue;
-                                                       $datarray['body'] = escape_tags($r['body']);
+                                                       }
+                                                       $datarray['body'] = escape_tags(convertquote($r['body'], false));
+
+                                                       logger("Mail: Importing ".$msg_uid);
 
-                                                       // some mailing lists have the original author as 'from' - add this sender info to msg body. 
+                                                       // some mailing lists have the original author as 'from' - add this sender info to msg body.
                                                        // todo: adding a gravatar for the original author would be cool
 
-                                                       if(! stristr($meta->from,$contact['addr']))
-                                                               $datarray['body'] = t('From: ') . escape_tags($meta->from) . "\n\n" . $datarray['body'];
+                                                       if(! stristr($meta->from,$contact['addr'])) {
+                                                               $from = imap_mime_header_decode($meta->from);
+                                                               $fromdecoded = "";
+                                                               foreach($from as $frompart)
+                                                                       if ($frompart->charset != "default")
+                                                                               $fromdecoded .= iconv($frompart->charset, 'UTF-8//IGNORE', $frompart->text);
+                                                                       else
+                                                                               $fromdecoded .= $frompart->text;
+
+                                                               $datarray['body'] = "[b]".t('From: ') . escape_tags($fromdecoded) . "[/b]\n\n" . $datarray['body'];
+                                                       }
 
                                                        $datarray['uid'] = $importer_uid;
                                                        $datarray['contact-id'] = $contact['id'];
@@ -469,7 +524,7 @@ function poller_run($argv, $argc){
                                                        $datarray['author-name'] = $contact['name'];
                                                        $datarray['author-link'] = 'mailbox';
                                                        $datarray['author-avatar'] = $contact['photo'];
-                                               
+
                                                        $stored_item = item_store($datarray);
                                                        q("UPDATE `item` SET `last-child` = 0 WHERE `parent-uri` = '%s' AND `uid` = %d",
                                                                dbesc($datarray['parent-uri']),
@@ -478,6 +533,24 @@ function poller_run($argv, $argc){
                                                        q("UPDATE `item` SET `last-child` = 1 WHERE `id` = %d LIMIT 1",
                                                                intval($stored_item)
                                                        );
+                                                       switch ($mailconf[0]['action']) {
+                                                               case 0:
+                                                                       break;
+                                                               case 1:
+                                                                       logger("Mail: Deleting ".$msg_uid);
+                                                                       imap_delete($mbox, $msg_uid, FT_UID);
+                                                                       break;
+                                                               case 2:
+                                                                       logger("Mail: Mark as seen ".$msg_uid);
+                                                                       imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
+                                                                       break;
+                                                               case 3:
+                                                                       logger("Mail: Moving ".$msg_uid." to ".$mailconf[0]['movetofolder']);
+                                                                       imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
+                                                                       if ($mailconf[0]['movetofolder'] != "")
+                                                                               imap_mail_move($mbox, $msg_uid, $mailconf[0]['movetofolder'], FT_UID);
+                                                                       break;
+                                                       }
                                                }
                                        }
 
@@ -486,7 +559,7 @@ function poller_run($argv, $argc){
                        }
                        elseif($contact['network'] === NETWORK_FACEBOOK) {
                                // This is picked up by the Facebook plugin on a cron hook.
-                               // Ignored here.                        
+                               // Ignored here.
                        }
 
                        if($xml) {