Skip to content

Commit

Permalink
Merge pull request #182 from Slamdunk/exception_details
Browse files Browse the repository at this point in the history
Exception: increase verbosity with imap_alerts() and imap_errors()
  • Loading branch information
Slamdunk authored Sep 26, 2017
2 parents c4e1b91 + 7afca72 commit 4763f3b
Show file tree
Hide file tree
Showing 11 changed files with 82 additions and 84 deletions.
5 changes: 4 additions & 1 deletion src/Connection.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,10 @@ public function hasMailbox($name)
public function getMailbox($name)
{
if (!$this->hasMailbox($name)) {
throw new MailboxDoesNotExistException($name);
throw new MailboxDoesNotExistException(sprintf(
'Mailbox "%s" does not exist',
$name
));
}

return new Mailbox($this->server . imap_utf7_encode($name), $this);
Expand Down
12 changes: 1 addition & 11 deletions src/Exception/AuthenticationFailedException.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,6 @@

namespace Ddeboer\Imap\Exception;

class AuthenticationFailedException extends Exception
final class AuthenticationFailedException extends Exception
{
public function __construct($user, $error = null)
{
parent::__construct(
sprintf(
'Authentication failed for user %s with error %s',
$user,
$error
)
);
}
}
49 changes: 36 additions & 13 deletions src/Exception/Exception.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,44 @@

class Exception extends \RuntimeException
{
protected $errors = [];
private static $errorLabels = [
E_ERROR => 'E_ERROR',
E_WARNING => 'E_WARNING',
E_PARSE => 'E_PARSE',
E_NOTICE => 'E_NOTICE',
E_CORE_ERROR => 'E_CORE_ERROR',
E_CORE_WARNING => 'E_CORE_WARNING',
E_COMPILE_ERROR => 'E_COMPILE_ERROR',
E_COMPILE_WARNING => 'E_COMPILE_WARNING',
E_USER_ERROR => 'E_USER_ERROR',
E_USER_WARNING => 'E_USER_WARNING',
E_USER_NOTICE => 'E_USER_NOTICE',
E_STRICT => 'E_STRICT',
E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR',
E_DEPRECATED => 'E_DEPRECATED',
E_USER_DEPRECATED => 'E_USER_DEPRECATED',
];

public function __construct($message, $code = 0, $previous = null)
final public function __construct($message, $code = 0, $previous = null)
{
parent::__construct($message, $code, $previous);
$this->errors = imap_errors();
}
$errorType = '';
if (is_int($code) && isset(self::$errorLabels[$code])) {
$errorType = sprintf('[%s] ', self::$errorLabels[$code]);
}

/**
* Get IMAP errors
*
* @return array
*/
public function getErrors()
{
return $this->errors;
$joinString = "\n- ";
$alerts = imap_alerts();
$errors = imap_errors();
$completeMessage = sprintf(
"%s%s\nimap_alerts (%s):%s\nimap_errors (%s):%s",
$errorType,
$message,
$alerts ? count($alerts) : 0,
$alerts ? $joinString . implode($joinString, $alerts) : '',
$errors ? count($errors) : 0,
$errors ? $joinString . implode($joinString, $errors) : ''
);

parent::__construct($completeMessage, $code, $previous);
}
}
6 changes: 1 addition & 5 deletions src/Exception/MailboxDoesNotExistException.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,6 @@

namespace Ddeboer\Imap\Exception;

class MailboxDoesNotExistException extends Exception
final class MailboxDoesNotExistException extends Exception
{
public function __construct($mailbox)
{
parent::__construct('Mailbox ' . $mailbox . ' does not exist');
}
}
6 changes: 1 addition & 5 deletions src/Exception/MessageDeleteException.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,6 @@

namespace Ddeboer\Imap\Exception;

class MessageDeleteException extends Exception
final class MessageDeleteException extends Exception
{
public function __construct($messageNumber)
{
parent::__construct(sprintf('Message %s cannot be deleted', $messageNumber));
}
}
12 changes: 1 addition & 11 deletions src/Exception/MessageDoesNotExistException.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,6 @@

namespace Ddeboer\Imap\Exception;

class MessageDoesNotExistException extends Exception
final class MessageDoesNotExistException extends Exception
{
public function __construct($number, $error)
{
parent::__construct(
sprintf(
'Message %s does not exist: %s',
$number,
$error
)
);
}
}
12 changes: 1 addition & 11 deletions src/Exception/MessageMoveException.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,6 @@

namespace Ddeboer\Imap\Exception;

class MessageMoveException extends Exception
final class MessageMoveException extends Exception
{
public function __construct($messageNumber, $mailbox)
{
parent::__construct(
sprintf(
'Message %s cannot be moved to %s',
$messageNumber,
$mailbox
)
);
}
}
26 changes: 16 additions & 10 deletions src/Message.php
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,10 @@ public function delete()
$this->headers = null;

if (!imap_delete($this->stream, $this->messageNumber, \FT_UID)) {
throw new MessageDeleteException($this->messageNumber);
throw new MessageDeleteException(sprintf(
'Message "%s" cannot be deleted',
$this->messageNumber
));
}
}

Expand All @@ -291,7 +294,11 @@ public function delete()
public function move(Mailbox $mailbox)
{
if (!imap_mail_move($this->stream, $this->messageNumber, $mailbox->getName(), \CP_UID)) {
throw new MessageMoveException($this->messageNumber, $mailbox->getName());
throw new MessageMoveException(sprintf(
'Message "%s" cannot be moved to "%s"',
$this->messageNumber,
$mailbox->getName()
));
}

return $this;
Expand All @@ -318,14 +325,13 @@ public function keepUnseen($bool = true)
*/
private function loadStructure()
{
set_error_handler(
function ($nr, $error) {
throw new MessageDoesNotExistException(
$this->messageNumber,
$error
);
}
);
set_error_handler(function ($nr, $error) {
throw new MessageDoesNotExistException(sprintf(
'Message %s does not exist: %s',
$this->messageNumber,
$error
), $nr);
});

$structure = imap_fetchstructure(
$this->stream,
Expand Down
16 changes: 9 additions & 7 deletions src/Server.php
Original file line number Diff line number Diff line change
Expand Up @@ -74,11 +74,13 @@ public function __construct(
public function authenticate($username, $password)
{
// Wrap imap_open, which gives notices instead of exceptions
set_error_handler(
function ($nr, $message) use ($username) {
throw new AuthenticationFailedException($username, $message);
}
);
set_error_handler(function ($nr, $message) use ($username) {
throw new AuthenticationFailedException(sprintf(
'Authentication failed for user "%s": %s',
$username,
$message
), $nr);
});

$resource = imap_open(
$this->getServerString(),
Expand All @@ -89,12 +91,12 @@ function ($nr, $message) use ($username) {
$this->parameters
);

restore_error_handler();

if (false === $resource) {
throw new AuthenticationFailedException($username);
}

restore_error_handler();

$check = imap_check($resource);
$mailbox = $check->Mailbox;
$this->connection = substr($mailbox, 0, strpos($mailbox, '}') + 1);
Expand Down
10 changes: 5 additions & 5 deletions tests/MailboxTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

namespace Ddeboer\Imap\Tests;

use Ddeboer\Imap\Exception;
use Ddeboer\Imap\Mailbox;
use Ddeboer\Imap\Search\Email\To;
use Ddeboer\Imap\Search\Text\Body;
Expand Down Expand Up @@ -40,13 +41,12 @@ public function testGetMessages()
$this->assertEquals(3, $i);
}

/**
* @expectedException \Ddeboer\Imap\Exception\MessageDoesNotExistException
* @expectedExceptionMessageRegExp /Message 666 does not exist.*Bad message number/
*/
public function testGetMessageThrowsException()
{
$this->mailbox->getMessage(666);
$this->expectException(Exception\MessageDoesNotExistException::class);
$this->expectExceptionMessageRegExp('/E_WARNING.+Message 999 does not exist.+Bad message number/s');

$this->mailbox->getMessage(999);
}

public function testCount()
Expand Down
12 changes: 7 additions & 5 deletions tests/ServerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,18 @@

namespace Ddeboer\Imap\Tests;

use Ddeboer\Imap\Exception;
use Ddeboer\Imap\Server;

class ServerTest extends \PHPUnit_Framework_TestCase
{
/**
* @expectedException \Ddeboer\Imap\Exception\AuthenticationFailedException
*/
public function testFailedAuthenticate()
{
$server = new Server('imap.gmail.com');
$server->authenticate('fake_username', 'fake_password');
$server = new Server(\getenv('IMAP_SERVER_NAME'), \getenv('IMAP_SERVER_PORT'), '/imap/ssl/novalidate-cert');

$this->expectException(Exception\AuthenticationFailedException::class);
$this->expectExceptionMessageRegExp('/E_WARNING.+AUTHENTICATIONFAILED/s');

$server->authenticate(uniqid('fake_username_'), uniqid('fake_password_'));
}
}

0 comments on commit 4763f3b

Please sign in to comment.