Skip to content

Commit

Permalink
#102 - added an abstract email provider API, and updated some classes…
Browse files Browse the repository at this point in the history
… to use it
  • Loading branch information
alphadevx committed Sep 20, 2015
1 parent 67f6abc commit 7610b09
Show file tree
Hide file tree
Showing 6 changed files with 268 additions and 24 deletions.
16 changes: 3 additions & 13 deletions Alpha/Model/Person.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Alpha\Util\Helper\Validator;
use Alpha\Util\Logging\Logger;
use Alpha\Util\Config\ConfigProvider;
use Alpha\Util\Email\EmailProviderFactory;
use Alpha\Exception\MailNotSentException;
use Alpha\Exception\PHPException;
use Alpha\Exception\RecordNotFoundException;
Expand Down Expand Up @@ -409,19 +410,8 @@ public function sendMail($message, $subject)

$body .= '</body></html>';

$headers = 'MIME-Version: 1.0'."\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1'."\n";
$headers .= 'From: '.$config->get('email.reply.to')."\n";

if ($config->getEnvironment() != 'dev') {
try {
mb_send_mail($this->get('email'), $subject, $body, $headers);
} catch (PHPException $e) {
throw new MailNotSentException('Error sending a mail to ['.$this->get('email').']');
}
} else {
self::$logger->info("Sending email:\n".$headers."\n".$body);
}
$mailer = EmailProviderFactory::getInstance('Alpha\Util\Email\EmailProviderPHP');
$mailer->send($this->get('email'), $config->get('email.reply.to'), $subject, $body, true);
}

/**
Expand Down
98 changes: 98 additions & 0 deletions Alpha/Util/Email/EmailProviderFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
<?php

namespace Alpha\Util\Email;

use Alpha\Exception\IllegalArguementException;
use Alpha\Util\Logging\Logger;

/**
* A factory for creating session provider implementations that implement the
* EmailProviderInterface interface.
*
* @since 2.0
*
* @author John Collins <dev@alphaframework.org>
* @license http://www.opensource.org/licenses/bsd-license.php The BSD License
* @copyright Copyright (c) 2015, John Collins (founder of Alpha Framework).
* All rights reserved.
*
* <pre>
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the
* following conditions are met:
*
* * Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
* * Neither the name of the Alpha Framework nor the names
* of its contributors may be used to endorse or promote
* products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* </pre>
*/
class EmailProviderFactory
{
/**
* Trace logger.
*
* @var Alpha\Util\Logging\Logger
*
* @since 2.0
*/
private static $logger = null;

/**
* A static method that attempts to return a EmailProviderInterface instance
* based on the name of the provider class supplied.
*
* @param $providerName The class name of the provider class (fully qualified).
*
* @throws Alpha\Exception\IllegalArguementException
*
* @return Alpha\Util\Http\Email\EmailProviderInterface
*
* @since 2.0
*/
public static function getInstance($providerName)
{
if (self::$logger == null) {
self::$logger = new Logger('EmailProviderFactory');
}

self::$logger->debug('>>getInstance(providerName=['.$providerName.'])');

if (class_exists($providerName)) {
$instance = new $providerName();

if (!$instance instanceof EmailProviderInterface) {
throw new IllegalArguementException('The class ['.$providerName.'] does not implement the expected EmailProviderInterface intwerface!');
}

self::$logger->debug('<<getInstance: [Object '.$providerName.']');

return $instance;
} else {
throw new IllegalArguementException('The class ['.$providerName.'] is not defined anywhere!');
}

self::$logger->debug('<<getInstance');
}
}
57 changes: 57 additions & 0 deletions Alpha/Util/Email/EmailProviderInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<?php

namespace Alpha\Util\Email;

/**
* An interface that describes the use sending of emails.
*
* @since 2.0
*
* @author John Collins <dev@alphaframework.org>
* @license http://www.opensource.org/licenses/bsd-license.php The BSD License
* @copyright Copyright (c) 2015, John Collins (founder of Alpha Framework).
* All rights reserved.
*
* <pre>
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the
* following conditions are met:
*
* * Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
* * Neither the name of the Alpha Framework nor the names
* of its contributors may be used to endorse or promote
* products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* </pre>
*/
interface EmailProviderInterface
{
/**
* Send a new email.
*
* @since 2.0
*
* @throws Alpha\Exception\MailNotSentException
*/
public function send($to, $from, $subject, $body, $isHTML = false);
}
100 changes: 100 additions & 0 deletions Alpha/Util/Email/EmailProviderPHP.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
<?php

namespace Alpha\Util\Email;

use Alpha\Exception\MailNotSentException;
use Alpha\Exception\PHPException;
use Alpha\Util\Logging\Logger;
use Alpha\Util\Config\ConfigProvider;

/**
* Sends an email using the mb_send_mail() function from PHP.
*
* @since 2.0
*
* @author John Collins <dev@alphaframework.org>
* @license http://www.opensource.org/licenses/bsd-license.php The BSD License
* @copyright Copyright (c) 2015, John Collins (founder of Alpha Framework).
* All rights reserved.
*
* <pre>
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the
* following conditions are met:
*
* * Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
* * Neither the name of the Alpha Framework nor the names
* of its contributors may be used to endorse or promote
* products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* </pre>
*/
class EmailProviderPHP implements EmailProviderInterface
{
/**
* Trace logger.
*
* @var Alpha\Util\Logging\Logger
*
* @since 2.0
*/
private static $logger = null;

/**
* Constructor.
*
* @since 2.0
*/
public function __construct()
{
self::$logger = new Logger('EmailProviderPHP');
}

/**
* {@inheritdoc}
*/
public function send($to, $from, $subject, $body, $isHTML = false)
{
self::$logger->debug('>>send(to=['.$to.'], from=['.$from.'], subject=['.$subject.'], body=['.$body.'], isHTML=['.$isHTML.'])');

$config = ConfigProvider::getInstance();

$headers = 'MIME-Version: 1.0'."\n";
if ($isHTML) {
$headers .= 'Content-type: text/html; charset=iso-8859-1'."\n";
}
$headers .= 'From: '.$from."\n";

if ($config->getEnvironment() != 'dev') {
try {
mb_send_mail($to, $subject, $body, $headers);
} catch (PHPException $e) {
throw new MailNotSentException('Error sending a mail to ['.$to.']');
}
} else {
self::$logger->info("Sending email:\n".$headers."\n".$body);
}

self::$logger->debug('<<send');
}
}
8 changes: 6 additions & 2 deletions Alpha/Util/Logging/Logger.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

namespace Alpha\Util\Logging;

use Alpha\Exception\MailNotSentException;
use Alpha\Util\Config\ConfigProvider;
use Alpha\Util\Email\EmailProviderFactory;
use Alpha\Util\Http\Session\SessionProviderFactory;
use Alpha\Util\Http\Request;
use Alpha\Model\ActionLog;
Expand Down Expand Up @@ -246,6 +248,8 @@ public function action($message)
* @param string $message
*
* @since 1.0
*
* @throws Alpha\Exception\MailNotSentException
*/
public function notifyAdmin($message)
{
Expand All @@ -261,8 +265,8 @@ public function notifyAdmin($message)

$body .= "\n\nKind regards,\n\nAdministrator\n--\n".$config->get('app.url');

mb_send_mail($config->get('app.log.error.mail.address'), 'Error in class '.$this->classname.' on site '.$config->get('app.title'), $body,
'From: '.$config->get('email.reply.to')."\r\nReply-To: ".$config->get('email.reply.to')."\r\nX-Mailer: PHP/".phpversion());
$mailer = EmailProviderFactory::getInstance('Alpha\Util\Email\EmailProviderPHP');
$mailer->send($config->get('app.log.error.mail.address'), $config->get('email.reply.to'), 'Error in class '.$this->classname.' on site '.$config->get('app.title'), $body);
}
}

Expand Down
13 changes: 4 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
[![Coverage Status](https://coveralls.io/repos/alphadevx/alpha/badge.svg?branch=2.0.0&service=github)](https://coveralls.io/github/alphadevx/alpha?branch=2.0.0)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/alphadevx/alpha/badges/quality-score.png?b=2.0.0)](https://scrutinizer-ci.com/g/alphadevx/alpha/?branch=2.0.0)

Alpha Framework (2.0 alpha)
Alpha Framework (2.0 beta)
===========================

Introduction
Expand All @@ -28,7 +28,7 @@ The Alpha Framework is a full-stack MVC framework for PHP. It provides the foll
Status
------

Note that this is the working branch for the 2.0 release, currently with **alpha** status so **not suitable for production**. The stable 1.x release are available from here: http://www.alphaframework.org/article/Download
Note that this is the working branch for the 2.0 release, currently with **beta** status so **not suitable for production**, but is **suitable for new development projects**. The stable (but deprecated) 1.x releases are available from here: http://www.alphaframework.org/article/Download

Models
------
Expand Down Expand Up @@ -234,14 +234,9 @@ Alpha can optionally maintain the history of each active record for you, by sett
$record->load(10, 2);
echo $record->get('email'); // two@test.com

Learn more
----------

For further information including installation instructions, please visit the following web page:

http://www.alphaframework.org/article/Documentation

Contact
-------

For bug reports and feature requests, please e-mail: dev@alphaframework.org

On Twitter: [@alphaframework](https://twitter.com/alphaframework)

0 comments on commit 7610b09

Please sign in to comment.