structure() public méthode

Return MIME structure information.
public structure ( )
Exemple #1
0
 /**
  */
 public function searchCallback(IMP_Mailbox $mbox, array $ids)
 {
     $fetch_query = new Horde_Imap_Client_Fetch_Query();
     $fetch_query->structure();
     $fetch_res = $mbox->imp_imap->fetch($mbox, $fetch_query, array('ids' => $mbox->imp_imap->getIdsOb($ids)));
     $out = array();
     foreach ($ids as $v) {
         if (isset($fetch_res[$v])) {
             $atc = false;
             foreach ($fetch_res[$v]->getStructure()->partIterator() as $val) {
                 if ($val->isAttachment()) {
                     $atc = true;
                     break;
                 }
             }
             if ($this->_data && $atc || !$this->_data && !$atc) {
                 continue;
             }
         }
         $out[] = $v;
     }
     return $out;
 }
Exemple #2
0
 /**
  *
  * @param Horde_Imap_Client_Mailbox $mbox   The mailbox
  * @param array $uids                       An array of message uids
  * @param array $options                    An options array
  *   - headers: (boolean)  Fetch header text if true.
  *              DEFAULT: false (Do not fetch header text).
  *   - structure: (boolean) Fetch message structure.
  *            DEFAULT: true (Fetch message structure).
  *   - flags: (boolean) Fetch messagge flags.
  *            DEFAULT: true (Fetch message flags).
  *   - envelope: (boolen) Fetch the envelope data.
  *               DEFAULT: false (Do not fetch envelope). @since 2.4.0
  *
  * @return Horde_Imap_Fetch_Results  The results.
  * @throws Horde_ActiveSync_Exception
  */
 protected function _getMailMessages(Horde_Imap_Client_Mailbox $mbox, array $uids, array $options = array())
 {
     $options = array_merge(array('headers' => false, 'structure' => true, 'flags' => true, 'envelope' => false), $options);
     $query = new Horde_Imap_Client_Fetch_Query();
     if ($options['structure']) {
         $query->structure();
     }
     if ($options['flags']) {
         $query->flags();
     }
     if ($options['envelope']) {
         $query->envelope();
     }
     if (!empty($options['headers'])) {
         $query->headerText(array('peek' => true));
     }
     try {
         return $this->_getImapOb()->fetch($mbox, $query, array('ids' => new Horde_Imap_Client_Ids($uids), 'exists' => true));
     } catch (Horde_Imap_Client_Exception $e) {
         $this->_logger->err(sprintf('[%s] Unable to fetch message: %s', $this->_procid, $e->getMessage()));
         throw new Horde_ActiveSync_Exception($e);
     }
 }
Exemple #3
0
 /**
  * Constructor.
  *
  * @param mixed $in  An IMP_Indices_Mailbox or Horde_Mime_Part object.
  *
  * @throws IMP_Exception
  */
 public function __construct($in)
 {
     if ($in instanceof Horde_Mime_Part) {
         $this->_message = $in;
     } else {
         $this->_indices = $in;
         /* Get the Horde_Mime_Part object for the given UID. */
         $query = new Horde_Imap_Client_Fetch_Query();
         $query->structure();
         if (!($ret = $this->_fetchData($query))) {
             $e = new IMP_Exception(_("Error displaying message: message does not exist on server."));
             $e->setLogLevel('NOTICE');
             throw $e;
         }
         $this->_message = $ret->getStructure();
     }
 }
Exemple #4
0
 /**
  * Retrieves a bodypart for the given message ID and mime part ID.
  *
  * @param string $folder The folder to fetch the messages from.
  * @param array  $uid                 The message UID.
  * @param array  $id                  The mime part ID.
  *
  * @return resource  The body part, as a stream resource.
  */
 public function fetchBodypart($folder, $uid, $id)
 {
     $query = new Horde_Imap_Client_Fetch_Query();
     $query->structure();
     $query->bodyPart($id, array('decode' => true));
     try {
         $ret = $this->getBackend()->fetch($folder, $query, array('ids' => new Horde_Imap_Client_Ids($uid)));
         $part = $ret[$uid]->getStructure()->getPart($id);
         $part->setContents($ret[$uid]->getBodyPart($id, true), array('encoding' => $ret[$uid]->getBodyPartDecode($id), 'usestream' => true));
         return $part->getContents(array('stream' => true));
     } catch (Horde_Imap_Client_Exception_ServerResponse $e) {
         throw new Horde_Kolab_Storage_Exception($e->details);
     } catch (Horde_Imap_Client_Exception $e) {
         throw new Horde_Kolab_Storage_Exception($e);
     }
 }
 /**
  * Check whether the message has the specified flag
  *
  * @param mixed $messageid
  * @param string $flag The flag to check
  * @return bool
  */
 private function message_has_flag($messageid, $flag)
 {
     // Get the current mailbox.
     $mailbox = $this->get_mailbox();
     // Grab messagedata including flags.
     $query = new \Horde_Imap_Client_Fetch_Query();
     $query->flags();
     $query->structure();
     $messagedata = $this->client->fetch($mailbox, $query, array('ids' => $messageid))->first();
     $flags = $messagedata->getFlags();
     return in_array($flag, $flags);
 }
Exemple #6
0
 public function getMessages($from = 0, $count = 2, $filter = '')
 {
     if ($filter instanceof Horde_Imap_Client_Search_Query) {
         $query = $filter;
     } else {
         $query = new Horde_Imap_Client_Search_Query();
         if ($filter) {
             $query->text($filter, false);
         }
     }
     if ($this->getSpecialRole() !== 'trash') {
         $query->flag(Horde_Imap_Client::FLAG_DELETED, false);
     }
     $result = $this->conn->search($this->mailBox, $query, ['sort' => [Horde_Imap_Client::SORT_DATE]]);
     $ids = array_reverse($result['match']->ids);
     if ($from >= 0 && $count >= 0) {
         $ids = array_slice($ids, $from, $count);
     }
     $ids = new \Horde_Imap_Client_Ids($ids, false);
     $headers = [];
     $fetch_query = new \Horde_Imap_Client_Fetch_Query();
     $fetch_query->envelope();
     $fetch_query->flags();
     $fetch_query->size();
     $fetch_query->uid();
     $fetch_query->imapDate();
     $fetch_query->structure();
     $headers = array_merge($headers, ['importance', 'list-post', 'x-priority']);
     $headers[] = 'content-type';
     $fetch_query->headers('imp', $headers, ['cache' => true, 'peek' => true]);
     $options = ['ids' => $ids];
     // $list is an array of Horde_Imap_Client_Data_Fetch objects.
     $headers = $this->conn->fetch($this->mailBox, $fetch_query, $options);
     ob_start();
     // fix for Horde warnings
     $messages = [];
     foreach ($headers->ids() as $message_id) {
         $header = $headers[$message_id];
         $message = new Message($this->conn, $this->mailBox, $message_id, $header);
         $messages[] = $message->getListArray();
     }
     ob_get_clean();
     // sort by time
     usort($messages, function ($a, $b) {
         return $a['dateInt'] < $b['dateInt'];
     });
     return $messages;
 }
Exemple #7
0
 public function fetchbody($message_no, $partno)
 {
     $file = $this->getCacheFileName(__FUNCTION__, $message_no, $partno);
     if ($this->cacheEnabled && file_exists($file)) {
         return json_decode(file_get_contents($file));
     } else {
         $oQuery = new Horde_Imap_Client_Fetch_Query();
         $oQuery->structure();
         $oQuery->bodyPart($partno, array('decode' => true, 'peek' => true));
         $oQuery->fullText(array('peek' => true));
         $message = $this->imap_imp->fetch($this->currentFolder, $oQuery, array('ids' => new Horde_Imap_Client_Ids($message_no)));
         $message = $message[$message_no];
         $part = $message->getStructure();
         $body = $part->getPart($partno);
         $tmp = $message->getBodyPart($partno);
         if (!$message->getBodyPartDecode($partno)) {
             $body->setContents($tmp);
             $tmp = $body->getContents();
         }
         if ($tmp) {
             file_put_contents($file, json_encode($tmp));
         }
         return $tmp;
     }
 }
Exemple #8
0
 private function loadMessageBodies()
 {
     $headers = array();
     $fetch_query = new \Horde_Imap_Client_Fetch_Query();
     $fetch_query->envelope();
     $fetch_query->structure();
     $fetch_query->flags();
     $fetch_query->seq();
     $fetch_query->size();
     $fetch_query->uid();
     $fetch_query->imapDate();
     $headers = array_merge($headers, array('importance', 'list-post', 'x-priority'));
     $headers[] = 'content-type';
     $fetch_query->headers('imp', $headers, array('cache' => true, 'peek' => true));
     // $list is an array of Horde_Imap_Client_Data_Fetch objects.
     $ids = new \Horde_Imap_Client_Ids($this->message_id);
     $headers = $this->conn->fetch($this->folder_id, $fetch_query, array('ids' => $ids));
     $fetch = $headers[$this->message_id];
     // set $this->fetch to get to, from ...
     $this->fetch = $fetch;
     // analyse the body part
     $structure = $fetch->getStructure();
     // debugging below
     $structure_type = $structure->getPrimaryType();
     if ($structure_type == 'multipart') {
         $i = 1;
         foreach ($structure->getParts() as $p) {
             $this->getpart($p, $i++);
         }
     } else {
         if ($structure->findBody() != null) {
             // get the body from the server
             $partId = $structure->findBody();
             $this->queryBodyPart($partId);
         }
     }
 }
Exemple #9
0
 /**
  * @depends testOptimizedSearches
  */
 public function testComplexFetch()
 {
     // Fetching message information from complex MIME message.
     $complex_fetch = new Horde_Imap_Client_Fetch_Query();
     $complex_fetch->fullText(array('length' => 100, 'peek' => true));
     // Header of entire message
     $complex_fetch->headerText(array('length' => 100, 'peek' => true));
     // Header of message/rfc822 part
     $complex_fetch->headerText(array('id' => 2, 'length' => 100, 'peek' => true));
     // Body text of entire message
     $complex_fetch->bodyText(array('length' => 100, 'peek' => true));
     // Body text of message/rfc822 part
     $complex_fetch->bodyText(array('id' => 2, 'length' => 100, 'peek' => true));
     // MIME Header of multipart/alternative part
     $complex_fetch->mimeHeader('1', array('length' => 100, 'peek' => true));
     // MIME Header of text/plain part embedded in message/rfc822 part
     $complex_fetch->mimeHeader('2.1', array('length' => 100, 'peek' => true));
     // Body text of multipart/alternative part
     $complex_fetch->bodyPart('1', array('length' => 100, 'peek' => true));
     // Body text of image/png part embedded in message/rfc822 part
     // Try to do server-side decoding, if available
     $complex_fetch->mimeHeader('2.2', array('decode' => true, 'length' => 100, 'peek' => true));
     // If supported, return decoded body part size
     $complex_fetch->bodyPartSize('2.2');
     // Select message-id header from base message header
     $complex_fetch->headers('headersearch1', array('message-id'), array('length' => 100, 'peek' => true));
     // Select everything but message-id header from message/rfc822 header
     $complex_fetch->headers('headersearch2', array('message-id'), array('id' => '2', 'length' => 100, 'notsearch' => true, 'peek' => true));
     $complex_fetch->structure();
     $complex_fetch->flags();
     $complex_fetch->imapDate();
     $complex_fetch->size();
     $complex_fetch->uid();
     if (self::$live->capability->query('CONDSTORE')) {
         $complex_fetch->modseq();
     }
     try {
         $res = self::$live->fetch(self::$test_mbox, $complex_fetch, array('ids' => new Horde_Imap_Client_Ids(3, true)));
     } catch (Horde_Imap_Client_Exception $e) {
         if ($e->getCode() === $e::MBOXNOMODSEQ) {
             $this->markTestSkipped('Mailbox does not support MODSEQ.');
         }
         throw $e;
     }
     $this->assertInstanceOf('Horde_Imap_Client_Fetch_Results', $res);
     $this->assertEquals(1, count($res));
     $this->assertEquals('Message-ID: <*****@*****.**>', trim($res[3]->getHeaders('headersearch1')));
     /* Return stream instead. */
     $this->assertInternalType('resource', $res[3]->getHeaders('headersearch1', Horde_Imap_Client_Data_Fetch::HEADER_STREAM));
     /* Parse headers instead. */
     $this->assertInstanceOf('Horde_Mime_Headers', $res[3]->getHeaders('headersearch1', Horde_Imap_Client_Data_Fetch::HEADER_PARSE));
 }
Exemple #10
0
 private function loadMessageBodies()
 {
     $headers = [];
     $fetch_query = new \Horde_Imap_Client_Fetch_Query();
     $fetch_query->envelope();
     $fetch_query->structure();
     $fetch_query->flags();
     $fetch_query->size();
     $fetch_query->imapDate();
     $headers = array_merge($headers, ['importance', 'list-post', 'x-priority']);
     $headers[] = 'content-type';
     $fetch_query->headers('imp', $headers, ['cache' => true, 'peek' => true]);
     // $list is an array of Horde_Imap_Client_Data_Fetch objects.
     $ids = new \Horde_Imap_Client_Ids($this->messageId);
     $headers = $this->conn->fetch($this->mailBox, $fetch_query, ['ids' => $ids]);
     /** @var $fetch \Horde_Imap_Client_Data_Fetch */
     $fetch = $headers[$this->messageId];
     if (is_null($fetch)) {
         throw new DoesNotExistException("This email ({$this->messageId}) can't be found. Probably it was deleted from the server recently. Please reload.");
     }
     // set $this->fetch to get to, from ...
     $this->fetch = $fetch;
     // analyse the body part
     $structure = $fetch->getStructure();
     // debugging below
     $structure_type = $structure->getPrimaryType();
     if ($structure_type == 'multipart') {
         $i = 1;
         foreach ($structure->getParts() as $p) {
             $this->getPart($p, $i++);
         }
     } else {
         if ($structure->findBody() != null) {
             // get the body from the server
             $partId = $structure->findBody();
             $this->getPart($structure->getPart($partId), $partId);
         }
     }
 }
 function Execute($aparams)
 {
     require_once JPATH_SITE . DS . "Horde" . DS . "Autoloader.php";
     require_once JPATH_SITE . DS . "Horde" . DS . "Autoloader" . DS . "ClassPathMapper.php";
     require_once JPATH_SITE . DS . "Horde" . DS . "Autoloader" . DS . "ClassPathMapper" . DS . "Default.php";
     require_once JPATH_SITE . DS . "Horde" . DS . "Autoloader" . DS . "Default.php";
     $this->Log("Checking email account - {$aparams['name']}");
     /*if (JRequest::getVar('email') != 1)
     		return;*/
     if (!$aparams['server']) {
         return $this->Log("No server specified");
     }
     if (!$aparams['port']) {
         return $this->Log("No port specified");
     }
     if (!$aparams['username']) {
         return $this->Log("No username specified");
     }
     if (!$aparams['password']) {
         return $this->Log("No password specified");
     }
     $this->params = $aparams;
     $this->connect();
     if (!$this->conn) {
         return $this->Log("Unable to connect to server");
     }
     // check if we have any messages at all
     $messages = $this->conn->search("INBOX");
     $ids = $messages['match'];
     $ids->reverse();
     $msgcount = $ids->count();
     if ($msgcount == 0) {
         $this->Log("No messages");
         $this->disconnect();
         return;
     } else {
         $this->Log("{$msgcount} messaeges");
     }
     // only get the first 20 messages to make sure web page response is quicker
     $maxmsgcount = 50;
     if ($msgcount < $maxmsgcount) {
         $maxmsgcount = $msgcount;
     }
     $query = new Horde_Imap_Client_Fetch_Query();
     $query->flags();
     $query->structure();
     $query->headerText(array('peek' => 1));
     $uid = new Horde_Imap_Client_Ids();
     for ($i = 0; $i < $maxmsgcount; $i++) {
         $uid->add($ids->ids[$i]);
     }
     $messages = $this->conn->fetch('INBOX', $query, array('ids' => $uid));
     // for the most recent xx messages
     for ($i = 0; $i < $maxmsgcount; $i++) {
         $mapped = $ids->ids[$i];
         $message = $messages->get($mapped);
         $this->Log("---------------------");
         $this->Log("Processing message {$i} / {$mapped}");
         // get headres of message
         if (!$this->GetHeaders($message)) {
             $this->Log("Error getting headers");
             continue;
         }
         $subject = $this->headers->getValue("subject");
         $this->Log("Subject : " . $subject);
         $this->from = $this->parse_addys($this->headers->getValue("from"));
         $this->to = $this->parse_addys($this->headers->getValue("to"));
         $this->Log("From : {$this->from[0]->mailbox}@{$this->from[0]->host} ({$this->from[0]->personal})");
         if ($this->from[0]->mailbox == "no-reply") {
             // no-reply from form builder, attempt to find address in name
             $text = $this->from[0]->personal;
             //$text = str_replace("\"","",$text);
             $matches = array();
             $pattern = "/(?:[a-z0-9!#\$%&'*+=?^_`{|}~-]+(?:\\.[a-z0-9!#\$%&'*+=?^_`{|}~-]+)*|\"(?:[-\v\f-!#-[]-]|\\[-\t\v\f-])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[-\v\f-!-ZS-]|\\[-\t\v\f-])+)\\])/";
             preg_match_all($pattern, $text, $matches);
             //print_p($matches);
             if (count($matches[0]) > 0) {
                 // new email found
                 $newemail = $matches[0][0];
                 list($name, $host) = explode("@", $newemail);
                 $this->Log("No Reply message, New From address : {$name}@{$host}");
                 $this->from[0]->mailbox = $name;
                 $this->from[0]->host = $host;
                 $this->from[0]->personal = trim(str_replace("{$name}@{$host}", "", $this->from[0]->personal));
             }
         }
         // skip if already read
         if ($aparams['type'] == "imap" && $this->IsMessageRead($message)) {
             $this->Log("Skipping read message");
             continue;
         }
         // validate to address is required
         if (!$this->ValidateToAddress()) {
             $this->Log("Skipping invalid to address");
             continue;
         }
         if (!$this->ValidateFromAddress()) {
             $this->Log("Skipping due to from address");
             continue;
         }
         //check subject and to email to see if we have found a user and or ticket
         $subject = $this->headers->getValue("subject");
         list($ticketid, $userid, $subject) = $this->ParseSubject($subject, $this->from[0]->mailbox . '@' . $this->from[0]->host);
         $this->subject = $subject;
         //echo "Ticket : $ticketid, $userid, $subject<br>";
         // ok, need to get the message as we have decided its ok to use this ticket
         if ($ticketid < 1 && $userid < 1 && $this->params['newticketsfrom'] == "registered") {
             $this->Log("Skipping as registered only and not a registered email");
             continue;
         }
         if ($this->params['allowrepliesonly'] && $ticketid < 1) {
             $this->Log("Skipping as not a reply");
             continue;
         }
         // validate that the ticket is being replied to by user or handler
         if ($ticketid > 0) {
             $ticket = $this->getTicket($ticketid);
             if ($this->params['allowunknown'] < 1) {
                 if ($ticket['user_id'] == 0 && $ticket['email'] != "{$this->from[0]->mailbox}@{$this->from[0]->host}") {
                     $this->Log("Unknown email replying to the message, ignore the email ({$this->from[0]->mailbox}@{$this->from[0]->host})");
                     continue;
                 }
                 if ($userid != $ticket['handler_id'] && $userid != $ticket['user_id']) {
                     $this->Log("Unknown user replying to the message, ignore the email ({$this->from[0]->mailbox}@{$this->from[0]->host})");
                     continue;
                 }
             }
         }
         $this->GetMessage($message);
         $this->TrimMessage();
         $messageid = 0;
         $filesok = true;
         // add to existing ticket
         if ($ticketid > 0) {
             // unreg ticket, just check email
             if ($ticket['user_id'] == 0) {
                 //echo "Adding message to ticket - {$ticket['email']}<br>";
                 $this->DoTicketReply($ticketid, $userid, 0, $messageid);
             } else {
                 if ($userid == $ticket['handler_id']) {
                     //echo "Adding admin message to ticket - {$ticket['user_id']} -> {$userid}<br>";
                     $this->DoTicketReply($ticketid, $userid, 1, $messageid);
                 } else {
                     if ($userid == $ticket['user_id']) {
                         //echo "Adding message to ticket - {$ticket['user_id']} -> {$userid}<br>";
                         $this->DoTicketReply($ticketid, $userid, 0, $messageid);
                         if (!FSS_Settings::get('support_user_attach')) {
                             $filesok = false;
                         }
                     } else {
                         if ($this->params['allowunknown']) {
                             // unreg ticket, add users reply
                             $this->DoTicketReply($ticketid, 0, 0, $messageid);
                         }
                     }
                 }
             }
         } else {
             if ($userid > 0) {
                 //echo "Opening new ticket<br>";
                 $ticketid = $this->OpenNewTicket($userid, $messageid);
             } else {
                 // open ticket for unregistered user
                 //echo "Opening new ticket for unreg user<br>";
                 $ticketid = $this->OpenNewTicketUnreg($messageid);
             }
         }
         $ticket = $this->getTicket($ticketid);
         if ($userid > 0) {
             $user = JFactory::getUser($userid);
             $this->Log("Ticket ID : {$ticketid} - {$ticket['reference']}, UserID : {$userid} - {$user->name} ({$user->username})");
         } else {
             $this->Log("Ticket ID : {$ticketid} - {$ticket['reference']}, Unregistered User");
         }
         /* if ($filesok)
         			$this->AttachFiles($ticketid, $userid, $messageid);*/
     }
     //imap_expunge($this->conn);
     $this->disconnect();
     //echo "</div>";
 }