Report abuse

<?php
// +---------------------------------------------------------------------------+
// | This file is part of the %%PROJECT_NAME%% project.                        |
// | Copyright (C) Lemieux Bedard Communication                                |
// |                                                                           |
// | For the full copyright and license information, please view the LICENSE   |
// | file that was distributed with this source code.                          |
// +---------------------------------------------------------------------------+

/**
 * LemieuxMail is a class which used to make the process of sending mails using
 * the eazycomponents mail class easier. This class use templates to create
 * the mail content.
 * @package core
 * @subpackage mail
 * @author Jean-Philippe Dery (jean-philippe.dery@lemieuxbedard.com)
 * @copyright Lemieux Bedard Communication (jean-philippe.dery@lemieuxbedard.com)
 * @since 1.0.0
 * @version 1.0.0
 */
class LemieuxMail extends AgaviAttributeHolder
{
	/**
	 * @var object The agavi context.
	 */
	protected $context = null;

	/**
	 * @var object The template parser object.
	 */
	protected $template = null;

	/**
	 * @var object The swift email sender object.
	 */
	protected $swift = null;

	/**
	 * @var string The receiver.
	 */
	protected $to = null;
	
	/**
	 * @var string The sender.
	 */
	protected $from = null;
	
	/**
	 * @var string The subject.
	 */
	protected $subject = null;

	/**
	 * @var string CC and BCC.
	 */
	protected $cc, $bcc = null;

	/**
	 * Constructor. Set the template object which render the message to be send
	 * to the user. Since the email is sent using ezcomponents mail classes, the
	 * content type of the teplate determine wheteher or not the nature of the
	 * mail composer object.
	 * @param object The agavi context.
	 * @param string The template name.
	 * @param string The receiver email address.
	 * @param string The receiver email name.
	 * @return void
	 * @author Jean-Philippe Dery (jean-philippe.dery@lemieuxbedard.com)
	 * @since 1.0.0
	 */
	function __construct(AgaviContext $context, $template, $subject, $toName, $toEmail, $fromName, $fromEmail)
	{
		$this->context = $context;
		$this->template = $template;
		$this->subject = $subject;
		$this->setFrom($fromName, $fromEmail);
		$this->setTo($toName, $toEmail);
		$this->swift = new Swift($this->getSwiftConnection());		
	}

	/**
	 * Set the receiver email address. This method accepts only email address
	 * without the receiver's name. Please note that this parameter may contains
	 * agavi config variables.
	 * @param string The email address.
	 * @return void
	 * @author Jean-Philippe Dery (jean-philippe.dery@lemieuxbedard.com)
	 * @since 1.0.0
	 */
	public function setTo($name, $address)
	{
		$this->to = new LemieuxMailAddress($address, $name);
	}

	/**
	 * Set the receiver email address. This method accepts only email address
	 * without the receiver's name. Please note that this parameter may contains
	 * agavi config variables.
	 * @param string The email address.
	 * @param string The encoding.
	 * @return void.
	 * @author Jean-Philippe Dery (jean-philippe.dery@lemieuxbedard.com)
	 * @since 1.0.0
	 */
	public function setCC($name, $address)
	{
		$this->cc = new LemieuxMailAddress($address, $name);
	}

	/**
	 * Clear the CC value.
	 * @return void.
	 * @author Jean-Philippe Dery (jean-philippe.dery@lemieuxbedard.com)
	 * @since 1.0.0
	 */
	public function clearCC()
	{
		$this->cc = null;
	}

	/**
	 * Set the receiver email address. This method accepts only email address
	 * without the receiver's name. Please note that this parameter may contains
	 * agavi config variables.
	 * @param string The email address.
	 * @param string The email name.
	 * @param string The encoding.
	 * @return void.
	 * @author Jean-Philippe Dery (jean-philippe.dery@lemieuxbedard.com)
	 * @since 1.0.0
	 */
	public function setFrom($name, $address)
	{
		$this->from = new LemieuxMailAddress($address, $name);
	}

	/**
	 * Set the subject of the mail address. Please note that this parameter
	 * may contains agavi config variables.
	 * @param string The subject.
	 * @return void.
	 * @author Jean-Philippe Dery (jean-philippe.dery@lemieuxbedard.com)
	 * @since 1.0.0
	 */
	public function setSubject($subject)
	{
		$this->subject = $subject;
	}

	/**
	 * Return the swift connection object.
	 * @return object The swift connection object.
	 * @author Jean-Philippe Dery (jean-philippe.dery@lemieuxbedard.com)
	 * @since 1.0.0
	 */
	protected function getSwiftConnection()
	{
		return AgaviConfig::get('core.debug') ? return new Swift_Connection_Sendmail() : return new Swift_Connection_SMTP('mail.lemieuxbedard.com');
	}
	
	/**
	 * Return the swift message object.
	 * @return object The swift connection object.
	 * @author Jean-Philippe Dery (jean-philippe.dery@lemieuxbedard.com)
	 * @since 1.0.0
	 */
	protected function getSwiftMessage()
	{
		return new Swift_Message($this->subject, $this->render());
	}

    /**
	 * Start the rendering process by loading the template file under an output
	 * buffer and caching the results and display it. The common object used in
	 * most agavi template will be created too.
	 * @return string The rendered result.
     * @author Jean-Philippe Dery (jean-philippe.dery@lemieuxbedard.com)
     * @since 1.0.0
	 */
	public function render()
	{
		$layer = new LemieuxMailTemplateLayer();
		$layer->initialize($this->context);
		$layer->setParameter('template', $this->template);
		$layer->setParameter('extension', '.php');
		$renderer = new LemieuxMailRenderer();
		$renderer->initialize($this->context, array('assigns' => array('routing' => 'ro', 'translation_manager' => 'tm')));
		return $renderer->render($layer, $this->getAttributes());
	}

	/**
	 * Send the email. Replace all the variable for the value and send the
	 * email to the receiver.
	 * @return void.
	 * @author Jean-Philippe Dery (jean-philippe.dery@lemieuxbedard.com)
	 * @since 1.0.0
	 * @todo Make better.
	 */
	public function send()
	{
		$message = $this->getSwiftMessage();
		// add the cc and bcc if they have been set. Only the sender and receiver
		// informations are required
		if ($this->cc != null) $message->setCC($this->cc->mail, $this->cc->name); 
		if ($this->bcc != null) $message->setBcc($this->bcc->mail, $this->bcc->name);
		// at this point we are ready to send the email
		return $this->swift->send($message,
			new Swift_Address($this->to->mail, $this->to->name),
			new Swift_Address($this->from->mail, $this->from->name)
		);
	}
}

/**
 * LemieuxMailAddress is a simple component to store an email address with the
 * name of the owner.
 * @package core
 * @subpackage mail
 * @author Jean-Philippe Dery (jean-philippe.dery@lemieuxbedard.com)
 * @copyright Lemieux Bedard Communication (jean-philippe.dery@lemieuxbedard.com)
 * @since 1.0.0
 * @version 1.0.0
 */
class LemieuxMailAddress 
{
	public $name = '';
	public $mail = '';
	public function __construct($mail, $name = '') {
		$this->name = $name;
		$this->mail = $mail;
	}
}
?>

<?php
// +---------------------------------------------------------------------------+
// | This file is part of a ImNoDesigner project.                              |
// | Copyright (C) Lemieux Bedard Communication                                |
// |                                                                           |
// | For the full copyright and license information, please view the LICENSE   |
// | file that was distributed with this source code.                          |
// +---------------------------------------------------------------------------+

/**
 * A renderer produces the output as defined by a View.
 * @package core
 * @subpackage control
 * @author David Zülke <dz@bitxtender.com>
 * @author Jean-Philippe Dery (jean-philippe.dery@lemieuxbedard.com)
 * @copyright Lemieux Bedard Communication (jean-philippe.dery@lemieuxbedard.com)
 * @since 1.0.0
 * @version 1.0.0
 */
class LemieuxMailRenderer extends AgaviPhpRenderer
{
	protected $moreAssigns = array();
}
?>

<?php
// +---------------------------------------------------------------------------+
// | This file is part of a ImNoDesigner project.                              |
// | Copyright (C) Lemieux Bedard Communication                                |
// |                                                                           |
// | For the full copyright and license information, please view the LICENSE   |
// | file that was distributed with this source code.                          |
// +---------------------------------------------------------------------------+

/**
 * Template layer implementation for templates fetched using a PHP stream.
 * @package core
 * @subpackage control
 * @author David Zülke <dz@bitxtender.com>
 * @author Jean-Philippe Dery (jean-philippe.dery@lemieuxbedard.com)
 * @copyright  Jean-Philippe Dery
 * @since 1.0.0
 * @version 1.0.0
 */
class LemieuxMailTemplateLayer extends AgaviStreamTemplateLayer
{
	/**
	 * Constructor
	 * @param array Initial parameters.
	 * @author David Zülke <dz@bitxtender.com>
	 * @since 0.11.0
	 */
	public function __construct(array $parameters = array())
	{
		$targets = array();
		if (AgaviConfig::get('core.use_translation')) {
			$targets[] = '${directory}/${locale}/${template}${extension}';
			$targets[] = '${directory}/${template}.${locale}${extension}';
		}
		$targets[] = '${directory}/${template}${extension}';
		parent::__construct(array_merge(array(
			'directory' => AgaviConfig::get('core.template_dir') . '/mails',
			'scheme' => 'file',
			'check' => true,
			'targets' => $targets,
		), $parameters));
	}
}
?>