]> git.mxchange.org Git - friendica.git/blobdiff - include/email.php
fix typo
[friendica.git] / include / email.php
index 4d8c25edfa0e4e9af9ba343fd81f8150d7ee53e0..3e6a8186d8fb9eafdc541696220aa3d2d4e16935 100644 (file)
@@ -1,10 +1,10 @@
 <?php
 
 function email_connect($mailbox,$username,$password) {
-       if(! (local_user() && function_exists('imap_open')))
+       if(! function_exists('imap_open'))
                return false;
 
-       $mbox = imap_open($mailbox,$username,$password);
+       $mbox = @imap_open($mailbox,$username,$password);
 
        return $mbox;
 }
@@ -12,15 +12,32 @@ function email_connect($mailbox,$username,$password) {
 function email_poll($mbox,$email_addr) {
 
        if(! ($mbox && $email_addr))
-               return array();;
+               return array();
 
-       $search = imap_search($mbox,'FROM "' . $email_addr . '"', SE_UID);
-       return (($search) ? $search : array());
+       $search1 = @imap_search($mbox,'FROM "' . $email_addr . '"', SE_UID);
+       if(! $search1)
+               $search1 = array();
+
+       $search2 = @imap_search($mbox,'TO "' . $email_addr . '"', SE_UID);
+       if(! $search2)
+               $search2 = array();
+
+       $search3 = @imap_search($mbox,'CC "' . $email_addr . '"', SE_UID);
+       if(! $search3)
+               $search3 = array();
+
+       $search4 = @imap_search($mbox,'BCC "' . $email_addr . '"', SE_UID);
+       if(! $search4)
+               $search4 = array();
+
+       $res = array_unique(array_merge($search1,$search2,$search3,$search4));
+
+       return $res;
 }
 
 
 function construct_mailbox_name($mailacct) {
-       $ret = '{' . $mailacct['server'] . (($mailacct['port']) ? ':' . $mailacct['port'] : '');
+       $ret = '{' . $mailacct['server'] . ((intval($mailacct['port'])) ? ':' . $mailacct['port'] : '');
        $ret .= (($mailacct['ssltype']) ?  '/' . $mailacct['ssltype'] . '/novalidate-cert' : '');
        $ret .= '}' . $mailacct['mailbox'];
        return $ret;
@@ -28,41 +45,67 @@ function construct_mailbox_name($mailacct) {
 
 
 function email_msg_meta($mbox,$uid) {
-       $ret = (($mbox && $uid) ? imap_fetch_overview($mbox,$uid,FT_UID) : array(array()));
+       $ret = (($mbox && $uid) ? @imap_fetch_overview($mbox,$uid,FT_UID) : array(array()));
        return ((count($ret)) ? $ret[0] : array());
 }
 
+function email_msg_headers($mbox,$uid) {
+       $raw_header = (($mbox && $uid) ? @imap_fetchheader($mbox,$uid,FT_UID) : '');
+       $raw_header = str_replace("\r",'',$raw_header);
+       $ret = array();
+       $h = split("\n",$raw_header);
+       if(count($h))
+       foreach($h as $line ) {
+           if (preg_match("/^[a-zA-Z]/", $line)) {
+                       $key = substr($line,0,strpos($line,':'));
+                       $value = substr($line,strpos($line,':')+1);
+
+                       $last_entry = strtolower($key);
+                       $ret[$last_entry] = trim($value);
+               }
+               else {
+                       $ret[$last_entry] .= ' ' . trim($line);
+       }
+       }
+       return $ret;
+}
+
 
+function email_get_msg($mbox,$uid) {
+       $ret = array();
 
-function getmsg($mbox,$mid) {
-    // input $mbox = IMAP stream, $mid = message id
-    // output all the following:
-    global $charset,$htmlmsg,$plainmsg,$attachments;
-    $htmlmsg = $plainmsg = $charset = '';
-    $attachments = array();
+       $struc = (($mbox && $uid) ? @imap_fetchstructure($mbox,$uid,FT_UID) : null);
 
-    // HEADER
-    $h = imap_header($mbox,$mid);
-    // add code here to get date, from, to, cc, subject...
+       if(! $struc)
+               return $ret;
 
-    // BODY
-    $s = imap_fetchstructure($mbox,$mid);
-    if (!$s->parts)  // simple
-        getpart($mbox,$mid,$s,0);  // pass 0 as part-number
-    else {  // multipart: cycle through each part
-        foreach ($s->parts as $partno0=>$p)
-            getpart($mbox,$mid,$p,$partno0+1);
-    }
+       if(! $struc->parts) {
+               $ret['body'] = email_get_part($mbox,$uid,$struc,0);
+       }
+       else {
+               foreach($struc->parts as $ptop => $p) {
+                       $x = email_get_part($mbox,$uid,$p,$ptop + 1);
+                       if($x)
+                               $ret['body'] = $x;
+               }
+       }
+       return $ret;
 }
 
-function getpart($mbox,$mid,$p,$partno) {
+// At the moment - only return plain/text.
+// Later we'll repackage inline images as data url's and make the HTML safe
+
+function email_get_part($mbox,$uid,$p,$partno) {
     // $partno = '1', '2', '2.1', '2.1.3', etc for multipart, 0 if simple
     global $htmlmsg,$plainmsg,$charset,$attachments;
 
+       echo $partno;
+
     // DECODE DATA
-    $data = ($partno)?
-        imap_fetchbody($mbox,$mid,$partno):  // multipart
-        imap_body($mbox,$mid);  // simple
+    $data = ($partno)
+               ? @imap_fetchbody($mbox,$uid,$partno, FT_UID|FT_PEEK)
+        : @imap_body($mbox,$uid,FT_UID|FT_PEEK);
+
     // Any part may be encoded, even plain text messages, so check everything.
     if ($p->encoding==4)
         $data = quoted_printable_decode($data);
@@ -82,6 +125,7 @@ function getpart($mbox,$mid,$p,$partno) {
     // ATTACHMENT
     // Any part with a filename is an attachment,
     // so an attached text file (type 0) is not mistaken as the message.
+
     if ($params['filename'] || $params['name']) {
         // filename may be given as 'Filename' or 'Name' or both
         $filename = ($params['filename'])? $params['filename'] : $params['name'];
@@ -90,13 +134,15 @@ function getpart($mbox,$mid,$p,$partno) {
     }
 
     // TEXT
-    if ($p->type==0 && $data) {
+    if ($p->type == 0 && $data) {
         // Messages may be split in different parts because of inline attachments,
         // so append parts together with blank row.
         if (strtolower($p->subtype)=='plain')
-            $plainmsg .= trim($data) ."\n\n";
+            return (trim($data) ."\n\n");
         else
-            $htmlmsg .= $data ."<br><br>";
+                       $data = '';
+
+ //           $htmlmsg .= $data ."<br><br>";
         $charset = $params['charset'];  // assume all parts are same charset
     }
 
@@ -105,13 +151,71 @@ function getpart($mbox,$mid,$p,$partno) {
     // but AOL uses type 1 (multipart), which is not handled here.
     // There are no PHP functions to parse embedded messages,
     // so this just appends the raw source to the main message.
-    elseif ($p->type==2 && $data) {
-        $plainmsg .= $data."\n\n";
-    }
+//    elseif ($p->type==2 && $data) {
+//        $plainmsg .= $data."\n\n";
+//    }
 
     // SUBPART RECURSION
     if ($p->parts) {
-        foreach ($p->parts as $partno0=>$p2)
-            getpart($mbox,$mid,$p2,$partno.'.'.($partno0+1));  // 1.2, 1.2.1, etc.
+        foreach ($p->parts as $partno0=>$p2) {
+            $x =  email_get_part($mbox,$uid,$p2,$partno . '.' . ($partno0+1));  // 1.2, 1.2.1, etc.
+                       if($x)
+                               return $x;
+               }
     }
-}
\ No newline at end of file
+}
+
+
+
+function email_header_encode($in_str, $charset) {
+    $out_str = $in_str;
+       $need_to_convert = false;
+
+       for($x = 0; $x < strlen($in_str); $x ++) {
+               if((ord($in_str[$x]) == 0) || ((ord($in_str[$x]) > 128))) {
+                       $need_to_convert = true;
+               }
+       }
+
+       if(! $need_to_convert)
+               return $in_str;
+
+    if ($out_str && $charset) {
+
+        // define start delimimter, end delimiter and spacer
+        $end = "?=";
+        $start = "=?" . $charset . "?B?";
+        $spacer = $end . "\r\n " . $start;
+
+        // determine length of encoded text within chunks
+        // and ensure length is even
+        $length = 75 - strlen($start) - strlen($end);
+
+        /*
+            [EDIT BY danbrown AT php DOT net: The following
+            is a bugfix provided by (gardan AT gmx DOT de)
+            on 31-MAR-2005 with the following note:
+            "This means: $length should not be even,
+            but divisible by 4. The reason is that in
+            base64-encoding 3 8-bit-chars are represented
+            by 4 6-bit-chars. These 4 chars must not be
+            split between two encoded words, according
+            to RFC-2047.
+        */
+        $length = $length - ($length % 4);
+
+        // encode the string and split it into chunks
+        // with spacers after each chunk
+        $out_str = base64_encode($out_str);
+        $out_str = chunk_split($out_str, $length, $spacer);
+
+        // remove trailing spacer and
+        // add start and end delimiters
+        $spacer = preg_quote($spacer);
+        $out_str = preg_replace("/" . $spacer . "$/", "", $out_str);
+        $out_str = $start . $out_str . $end;
+    }
+    return $out_str;
+} 
+
+