mailbox, messageiterator and message class connected

This commit is contained in:
Clivern 2017-08-11 22:56:23 +02:00
parent bf6fb8c3ed
commit f7faa6541d
10 changed files with 612 additions and 537 deletions

View file

@ -98,7 +98,7 @@ class Connection
return $this;
}
public function reconnect($folder)
public function reconnect($folder = "INBOX")
{
try {
imap_reopen($this->stream, "{" . $this->server . ":" . $this->port . $this->flag . "}" . $folder);
@ -107,6 +107,13 @@ class Connection
}
}
public function survive($folder = "INBOX")
{
if( !$this->ping() || ($this->folder != $folder) ) {
$this->reconnect($folder);
}
}
/**
* Set Timeout
*

View file

@ -1,16 +0,0 @@
<?php
/**
* @author clivern <hello@clivern.com>
*/
namespace Clivern\Imap\Core;
/**
* Folder Class
*
* @package Clivern\Imap\Core
*/
class Folder
{
#~
}

View file

@ -92,11 +92,11 @@ class Message
*/
public function config()
{
if( !this->msg_number && $this->uid ){
if( !$this->msg_number && $this->uid ){
$this->msg_number = imap_msgno($this->connection->getStream(), $this->uid);
}
if( !this->uid && $this->msg_number ){
if( !$this->uid && $this->msg_number ){
$this->uid = imap_uid($this->connection->getStream(), $this->msg_number);
}

View file

@ -6,61 +6,38 @@
namespace Clivern\Imap\Core;
use Clivern\Imap\Core\Message;
use Clivern\Imap\Core\Connection;
/**
* Message Iterator Class
*
* @package Clivern\Imap\Core
*/
class MessageIterator
class MessageIterator extends \ArrayIterator
{
/**
* @var array
*/
protected $messages = [];
protected $connection;
/**
* Add Message
* Constructor
*
* @param Message $message
* @return void
* @param Connection $connection
* @param array $message_numbers
*/
public function add(Message $message)
public function __construct(Connection $connection, array $message_numbers)
{
$this->messages[$message->getId()] = $message;
$this->connection = $connection;
parent::__construct($message_numbers);
}
/**
* Check if Message Exists
* Get current message
*
* @param integer $message_id
* @return boolean
*/
public function has($message_id)
{
return (boolean) isset($this->messages[$message_id]);
}
/**
* Get Message
*
* @param integer $message_id
* @return Message
*/
public function get($message_id)
public function current()
{
return $this->messages[$message_id];
}
/**
* Remove Message
*
* @param integer $message_id
* @return boolean
*/
public function remove($message_id)
{
return (boolean) unset($this->messages[$message_id]);
$message = new Message($this->connection);
return $message->setUid(parent::current())->config();
}
}

53
src/Core/Search.php Normal file
View file

@ -0,0 +1,53 @@
<?php
/**
* @author clivern <hello@clivern.com>
*/
namespace Clivern\Imap\Core;
/**
* Search Class
*
* @package Clivern\Imap\Core
*/
class Search
{
/**
* @var array
*/
protected $conditions = [];
/**
* Add Condition
*
* @param string $condition
* @return Search
*/
public function addCondition($condition)
{
$this->conditions[] = $condition;
return $this;
}
/**
* Get Conditions
*
* @return array
*/
public function getConditions()
{
return $this->conditions;
}
/**
* Get Conditions Query
*
* @return string
*/
public function __toString()
{
return (!empty($this->conditions)) ? implode(" ", $this->conditions) : "";
}
}

View file

@ -1,16 +0,0 @@
<?php
/**
* @author clivern <hello@clivern.com>
*/
namespace Clivern\Imap\Core;
/**
* Tools Class
*
* @package Clivern\Imap\Core
*/
class Tools
{
#~
}

View file

@ -6,9 +6,9 @@
namespace Clivern\Imap;
use Clivern\Imap\Core\Connection;
use Clivern\Imap\Core\Folder;
use Clivern\Imap\Core\MessageIterator;
use Clivern\Imap\Core\Tools;
use Clivern\Imap\Core\Message;
use Clivern\Imap\Core\Search;
/**
* MailBox Class
@ -18,56 +18,107 @@ use Clivern\Imap\Core\Tools;
class MailBox
{
/**
* @var string
*/
protected $folder;
/**
* @var Connection
*/
protected $connection;
/**
* @var Folder
*/
protected $folder;
/**
* @var MessageIterator
*/
protected $message_iterator;
/**
* @var Tools
*/
protected $tools;
/**
* MailBox Constructor
* Constructor
*
* @param Connection $connection
* @param Folder $folder
* @param MessageIterator $message_iterator
* @param Tools $tools
* @param Connection $connection IMAP connection
*/
public function __construct(Connection $connection, Folder $folder, MessageIterator $message_iterator, Tools $tools)
public function __construct(Connection $connection)
{
$this->connection = $connection;
$this->folder = $folder;
$this->message_iterator = $message_iterator;
$this->tools = $tools
}
/**
* Get Message Iterator
* Set Folder Name
*
* @return MessageIterator
* @param string $folder
* @return MailBox
*/
public function getMessageIterator()
public function setFolder($folder)
{
return $this->message_iterator;
$this->folder = $folder;
return $this;
}
public function get()
/**
* Get Folder name
*
* @return string
*/
public function getFolder()
{
return "test";
return $this->folder;
}
/**
* Get number of messages in this mailbox
*
* @return int
*/
public function count()
{
$this->connection->survive($this->folder);
return imap_num_msg($this->connection->getStream());
}
/**
* Get message ids
*
* @param Search $search
* @return MessageIterator|Message[]
*/
public function getMessages(Search $search = null)
{
$this->connection->survive($this->folder);
$query = ($search) ? (string) $search : 'ALL';
$message_numbers = imap_search($this->connection->getStream(), $query, \SE_UID);
if (false == $message_numbers) {
// imap_search can also return false
$message_numbers = [];
}
return new MessageIterator($this->connection, $message_numbers);
}
/**
* Get a message by message number or uid
*
* @param int|boolean $message_number
* @param int|boolean $message_uid
* @return Message
*/
public function getMessage($message_number = false, $message_uid = false)
{
$this->connection->survive($this->folder);
$message = new Message($this->connection);
if( $message_number == false ){
return $message->setUid($message_uid)->config();
}else{
return $message->setMsgNo($message_number)->config();
}
}
/**
* Delete all messages marked for deletion
*
* @return Mailbox
*/
public function expunge()
{
$this->connection->survive($this->folder);
imap_expunge($this->connection->getStream());
}
}

19
tests/Core/SearchTest.php Normal file
View file

@ -0,0 +1,19 @@
<?php
namespace Tests\Core;
use PHPUnit\Framework\TestCase;
class SearchTest extends TestCase
{
public function testConditionBuilder()
{
$search = new \Clivern\Imap\Core\Search();
$search->addCondition('RECENT')->addCondition('BCC "string"')->addCondition('NEW');
$this->assertEquals($search->getConditions(), [
'RECENT',
'BCC "string"',
'NEW'
]);
$this->assertEquals((string) $search, 'RECENT BCC "string" NEW');
}
}