15 changed files with 1814 additions and 1 deletions
			
			
		| @ -0,0 +1,32 @@ | ||||
| The Yii framework is free software. It is released under the terms of | ||||
| the following BSD License. | ||||
| 
 | ||||
| Copyright © 2008-2013 by Yii Software LLC (http://www.yiisoft.com) | ||||
| All rights reserved. | ||||
| 
 | ||||
| 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 Yii Software LLC 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 OWNER 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. | ||||
| @ -0,0 +1,58 @@ | ||||
| Yii 2.0 Public Preview - SwiftMailer Mail Solution | ||||
| ================================================== | ||||
| 
 | ||||
| Thank you for choosing Yii - a high-performance component-based PHP framework. | ||||
| 
 | ||||
| If you are looking for a production-ready PHP framework, please use | ||||
| [Yii v1.1](https://github.com/yiisoft/yii). | ||||
| 
 | ||||
| Yii 2.0 is still under heavy development. We may make significant changes | ||||
| without prior notices. **Yii 2.0 is not ready for production use yet.** | ||||
| 
 | ||||
| [](http://travis-ci.org/yiisoft/yii2) | ||||
| 
 | ||||
| This is the yii2-swiftmailer extension. | ||||
| 
 | ||||
| 
 | ||||
| Installation | ||||
| ------------ | ||||
| 
 | ||||
| The preferred way to install this extension is through [composer](http://getcomposer.org/download/). | ||||
| 
 | ||||
| Either run | ||||
| ``` | ||||
| php composer.phar require yiisoft/yii2-swiftmailer "*" | ||||
| ``` | ||||
| 
 | ||||
| or add | ||||
| ```json | ||||
| "yiisoft/yii2-swiftmailer": "*" | ||||
| ``` | ||||
| to the require section of your composer.json. | ||||
| 
 | ||||
| 
 | ||||
| *Note: You might have to run `php composer.phar selfupdate`* | ||||
| 
 | ||||
| 
 | ||||
| Usage & Documentation | ||||
| --------------------- | ||||
| 
 | ||||
| This extension has to be registered prior to usage. | ||||
| To enable this view renderer add it to the $rendereres property of your view object. | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| ```php | ||||
| <?php | ||||
| // config.php | ||||
| return [ | ||||
| 	//.... | ||||
| 	'components' => [ | ||||
| 		'mail' => [ | ||||
| 			'class' => 'yii\swiftmailer\Mailer', | ||||
| 		], | ||||
| 	], | ||||
| ]; | ||||
| ``` | ||||
| 
 | ||||
| For further instructions refer to the related section in the yii guide. | ||||
| @ -0,0 +1,28 @@ | ||||
| { | ||||
| 	"name": "yiisoft/yii2-swiftmailer", | ||||
| 	"description": "The SwiftMailer integration for the Yii framework", | ||||
| 	"keywords": ["yii", "swift", "swiftmailer", "mail", "email", "mailer"], | ||||
| 	"type": "yii2-extension", | ||||
| 	"license": "BSD-3-Clause", | ||||
| 	"support": { | ||||
| 		"issues": "https://github.com/yiisoft/yii2/issues?state=open", | ||||
| 		"forum": "http://www.yiiframework.com/forum/", | ||||
| 		"wiki": "http://www.yiiframework.com/wiki/", | ||||
| 		"irc": "irc://irc.freenode.net/yii", | ||||
| 		"source": "https://github.com/yiisoft/yii2" | ||||
| 	}, | ||||
| 	"authors": [ | ||||
| 		{ | ||||
| 			"name": "Paul Klimov", | ||||
| 			"email": "klimov.paul@gmail.com" | ||||
| 		} | ||||
| 	], | ||||
| 	"minimum-stability": "dev", | ||||
| 	"require": { | ||||
| 		"yiisoft/yii2": "*", | ||||
| 		"swiftmailer/swiftmailer": "@stable" | ||||
| 	}, | ||||
| 	"autoload": { | ||||
| 		"psr-0": { "yii\\swiftmailer\\": "" } | ||||
| 	} | ||||
| } | ||||
| @ -0,0 +1,142 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @link http://www.yiiframework.com/ | ||||
|  * @copyright Copyright (c) 2008 Yii Software LLC | ||||
|  * @license http://www.yiiframework.com/license/ | ||||
|  */ | ||||
| 
 | ||||
| namespace yii\swiftmailer; | ||||
| 
 | ||||
| use yii\base\InvalidConfigException; | ||||
| use yii\mail\BaseMailer; | ||||
| use Yii; | ||||
| 
 | ||||
| /** | ||||
|  * Mailer based on SwiftMailer library. | ||||
|  * | ||||
|  * By default PHP 'mail' function will be used as default email transport. | ||||
|  * You can setup different email transport via [[vendorMailer]] property: | ||||
|  * ~~~ | ||||
|  * 'components' => array( | ||||
|  *     ... | ||||
|  *     'email' => array( | ||||
|  *         'class' => 'yii\swiftmailer\Mailer', | ||||
|  *         'transport' => [ | ||||
|  *             'class' => 'Swift_SmtpTransport', | ||||
|  *             'host' => 'localhost', | ||||
|  *             'username' => 'username', | ||||
|  *             'password' => 'password', | ||||
|  *             'port' => '587', | ||||
|  *             'encryption' => 'tls', | ||||
|  *         ], | ||||
|  *     ), | ||||
|  *     ... | ||||
|  * ), | ||||
|  * ~~~ | ||||
|  * | ||||
|  * @see http://swiftmailer.org | ||||
|  * | ||||
|  * @method Message compose($view = null, array $params = []) creates new message optionally filling up its body via view rendering. | ||||
|  * | ||||
|  * @author Paul Klimov <klimov.paul@gmail.com> | ||||
|  * @since 2.0 | ||||
|  */ | ||||
| class Mailer extends BaseMailer | ||||
| { | ||||
| 	/** | ||||
| 	 * @var string message default class name. | ||||
| 	 */ | ||||
| 	public $messageClass = 'yii\swiftmailer\Message'; | ||||
| 	/** | ||||
| 	 * @var \Swift_Mailer Swift mailer instance. | ||||
| 	 */ | ||||
| 	private $_swiftMailer; | ||||
| 	/** | ||||
| 	 * @var \Swift_Transport|array Swift transport instance or its array configuration. | ||||
| 	 */ | ||||
| 	private $_transport = []; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @return array|\Swift_Mailer Swift mailer instance or array configuration. | ||||
| 	 */ | ||||
| 	public function getSwiftMailer() | ||||
| 	{ | ||||
| 		if (!is_object($this->_swiftMailer)) { | ||||
| 			$this->_swiftMailer = $this->createSwiftMailer(); | ||||
| 		} | ||||
| 		return $this->_swiftMailer; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param array|\Swift_Transport $transport | ||||
| 	 * @throws \yii\base\InvalidConfigException on invalid argument. | ||||
| 	 */ | ||||
| 	public function setTransport($transport) | ||||
| 	{ | ||||
| 		if (!is_array($transport) && !is_object($transport)) { | ||||
| 			throw new InvalidConfigException('"' . get_class($this) . '::transport" should be either object or array, "' . gettype($transport) . '" given.'); | ||||
| 		} | ||||
| 		$this->_transport = $transport; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @return array|\Swift_Transport | ||||
| 	 */ | ||||
| 	public function getTransport() | ||||
| 	{ | ||||
| 		if (!is_object($this->_transport)) { | ||||
| 			$this->_transport = $this->createTransport($this->_transport); | ||||
| 		} | ||||
| 		return $this->_transport; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @inheritdoc | ||||
| 	 */ | ||||
| 	public function send($message) | ||||
| 	{ | ||||
| 		Yii::trace('Sending email message', __METHOD__); | ||||
| 		return ($this->getSwiftMailer()->send($message->getSwiftMessage()) > 0); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Creates Swift mailer instance. | ||||
| 	 * @return \Swift_Mailer mailer instance. | ||||
| 	 */ | ||||
| 	protected function createSwiftMailer() | ||||
| 	{ | ||||
| 		return \Swift_Mailer::newInstance($this->getTransport()); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Creates email transport instance by its array configuration. | ||||
| 	 * @param array $config transport configuration. | ||||
| 	 * @throws \yii\base\InvalidConfigException on invalid transport configuration. | ||||
| 	 * @return \Swift_Transport transport instance. | ||||
| 	 */ | ||||
| 	protected function createTransport(array $config) | ||||
| 	{ | ||||
| 		if (array_key_exists('class', $config)) { | ||||
| 			$className = $config['class']; | ||||
| 			unset($config['class']); | ||||
| 		} else { | ||||
| 			$className = 'Swift_MailTransport'; | ||||
| 		} | ||||
| 		$transport = call_user_func([$className, 'newInstance']); | ||||
| 		if (!empty($config)) { | ||||
| 			foreach ($config as $name => $value) { | ||||
| 				if (property_exists($transport, $name)) { | ||||
| 					$transport->$name = $value; | ||||
| 				} else { | ||||
| 					$setter = 'set' . $name; | ||||
| 					if (method_exists($transport, $setter)) { | ||||
| 						$transport->$setter($value); | ||||
| 					} else { | ||||
| 						throw new InvalidConfigException('Setting unknown property: ' . get_class($transport) . '::' . $name); | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		return $transport; | ||||
| 	} | ||||
| } | ||||
| @ -0,0 +1,237 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @link http://www.yiiframework.com/ | ||||
|  * @copyright Copyright (c) 2008 Yii Software LLC | ||||
|  * @license http://www.yiiframework.com/license/ | ||||
|  */ | ||||
| 
 | ||||
| namespace yii\swiftmailer; | ||||
| 
 | ||||
| use yii\mail\BaseMessage; | ||||
| 
 | ||||
| /** | ||||
|  * Email message based on SwiftMailer library. | ||||
|  * | ||||
|  * @see http://swiftmailer.org/docs/messages.html | ||||
|  * @see \yii\swiftmailer\Mailer | ||||
|  * | ||||
|  * @method Mailer getMailer() returns mailer instance. | ||||
|  * @property \Swift_Message $swiftMessage vendor message instance. | ||||
|  * | ||||
|  * @author Paul Klimov <klimov.paul@gmail.com> | ||||
|  * @since 2.0 | ||||
|  */ | ||||
| class Message extends BaseMessage | ||||
| { | ||||
| 	/** | ||||
| 	 * @var \Swift_Message Swift message instance. | ||||
| 	 */ | ||||
| 	private $_swiftMessage; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @return \Swift_Message Swift message instance. | ||||
| 	 */ | ||||
| 	public function getSwiftMessage() | ||||
| 	{ | ||||
| 		if (!is_object($this->_swiftMessage)) { | ||||
| 			$this->_swiftMessage = $this->createSwiftMessage(); | ||||
| 		} | ||||
| 		return $this->_swiftMessage; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @inheritdoc | ||||
| 	 */ | ||||
| 	public function charset($charset) | ||||
| 	{ | ||||
| 		$this->getSwiftMessage()->setCharset($charset); | ||||
| 		return $this; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @inheritdoc | ||||
| 	 */ | ||||
| 	public function from($from) | ||||
| 	{ | ||||
| 		$this->getSwiftMessage()->setFrom($from); | ||||
| 		$this->getSwiftMessage()->setReplyTo($from); | ||||
| 		return $this; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @inheritdoc | ||||
| 	 */ | ||||
| 	public function to($to) | ||||
| 	{ | ||||
| 		$this->getSwiftMessage()->setTo($to); | ||||
| 		return $this; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @inheritdoc | ||||
| 	 */ | ||||
| 	public function cc($cc) | ||||
| 	{ | ||||
| 		$this->getSwiftMessage()->setCc($cc); | ||||
| 		return $this; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @inheritdoc | ||||
| 	 */ | ||||
| 	public function bcc($bcc) | ||||
| 	{ | ||||
| 		$this->getSwiftMessage()->setBcc($bcc); | ||||
| 		return $this; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @inheritdoc | ||||
| 	 */ | ||||
| 	public function subject($subject) | ||||
| 	{ | ||||
| 		$this->getSwiftMessage()->setSubject($subject); | ||||
| 		return $this; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @inheritdoc | ||||
| 	 */ | ||||
| 	public function textBody($text) | ||||
| 	{ | ||||
| 		$this->setBody($text, 'text/plain'); | ||||
| 		return $this; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @inheritdoc | ||||
| 	 */ | ||||
| 	public function htmlBody($html) | ||||
| 	{ | ||||
| 		$this->setBody($html, 'text/html'); | ||||
| 		return $this; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Sets the message body. | ||||
| 	 * If body is already set and its content type matches given one, it will | ||||
| 	 * be overridden, if content type miss match the multipart message will be composed. | ||||
| 	 * @param string $body body content. | ||||
| 	 * @param string $contentType body content type. | ||||
| 	 */ | ||||
| 	protected function setBody($body, $contentType) | ||||
| 	{ | ||||
| 		$message = $this->getSwiftMessage(); | ||||
| 		$oldBody = $message->getBody(); | ||||
| 		if (empty($oldBody)) { | ||||
| 			$parts = $message->getChildren(); | ||||
| 			$partFound = false; | ||||
| 			foreach ($parts as $key => $part) { | ||||
| 				if (!($part instanceof \Swift_Mime_Attachment)) { | ||||
| 					/* @var $part \Swift_Mime_MimePart */ | ||||
| 					if ($part->getContentType() == $contentType) { | ||||
| 						unset($parts[$key]); | ||||
| 						$partFound = true; | ||||
| 						break; | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 			if ($partFound) { | ||||
| 				reset($parts); | ||||
| 				$message->setChildren($parts); | ||||
| 				$message->addPart($body, $contentType); | ||||
| 			} else { | ||||
| 				$message->setBody($body, $contentType); | ||||
| 			} | ||||
| 		} else { | ||||
| 			$oldContentType = $message->getContentType(); | ||||
| 			if ($oldContentType == $contentType) { | ||||
| 				$message->setBody($body, $contentType); | ||||
| 			} else { | ||||
| 				$message->setBody(null); | ||||
| 				$message->setContentType(null); | ||||
| 				$message->addPart($oldBody, $oldContentType); | ||||
| 				$message->addPart($body, $contentType); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @inheritdoc | ||||
| 	 */ | ||||
| 	public function attach($fileName, array $options = []) | ||||
| 	{ | ||||
| 		$attachment = \Swift_Attachment::fromPath($fileName); | ||||
| 		if (!empty($options['fileName'])) { | ||||
| 			$attachment->setFilename($options['fileName']); | ||||
| 		} | ||||
| 		if (!empty($options['contentType'])) { | ||||
| 			$attachment->setContentType($options['contentType']); | ||||
| 		} | ||||
| 		$this->getSwiftMessage()->attach($attachment); | ||||
| 		return $this; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @inheritdoc | ||||
| 	 */ | ||||
| 	public function attachContent($content, array $options = []) | ||||
| 	{ | ||||
| 		$attachment = \Swift_Attachment::newInstance($content); | ||||
| 		if (!empty($options['fileName'])) { | ||||
| 			$attachment->setFilename($options['fileName']); | ||||
| 		} | ||||
| 		if (!empty($options['contentType'])) { | ||||
| 			$attachment->setContentType($options['contentType']); | ||||
| 		} | ||||
| 		$this->getSwiftMessage()->attach($attachment); | ||||
| 		return $this; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @inheritdoc | ||||
| 	 */ | ||||
| 	public function embed($fileName, array $options = []) | ||||
| 	{ | ||||
| 		$embedFile = \Swift_EmbeddedFile::fromPath($fileName); | ||||
| 		if (!empty($options['fileName'])) { | ||||
| 			$embedFile->setFilename($options['fileName']); | ||||
| 		} | ||||
| 		if (!empty($options['contentType'])) { | ||||
| 			$embedFile->setContentType($options['contentType']); | ||||
| 		} | ||||
| 		return $this->getSwiftMessage()->embed($embedFile); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @inheritdoc | ||||
| 	 */ | ||||
| 	public function embedContent($content, array $options = []) | ||||
| 	{ | ||||
| 		$embedFile = \Swift_EmbeddedFile::newInstance($content); | ||||
| 		if (!empty($options['fileName'])) { | ||||
| 			$embedFile->setFilename($options['fileName']); | ||||
| 		} | ||||
| 		if (!empty($options['contentType'])) { | ||||
| 			$embedFile->setContentType($options['contentType']); | ||||
| 		} | ||||
| 		return $this->getSwiftMessage()->embed($embedFile); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @inheritdoc | ||||
| 	 */ | ||||
| 	public function toString() | ||||
| 	{ | ||||
| 		return $this->getSwiftMessage()->toString(); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Creates the Swift email message instance. | ||||
| 	 * @return \Swift_Message email message instance. | ||||
| 	 */ | ||||
| 	protected function createSwiftMessage() | ||||
| 	{ | ||||
| 		return new \Swift_Message(); | ||||
| 	} | ||||
| } | ||||
| @ -0,0 +1,212 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @link http://www.yiiframework.com/ | ||||
|  * @copyright Copyright (c) 2008 Yii Software LLC | ||||
|  * @license http://www.yiiframework.com/license/ | ||||
|  */ | ||||
| 
 | ||||
| namespace yii\mail; | ||||
| 
 | ||||
| use yii\base\Component; | ||||
| use yii\base\InvalidConfigException; | ||||
| use Yii; | ||||
| use yii\base\ViewContextInterface; | ||||
| 
 | ||||
| /** | ||||
|  * BaseMailer provides the basic interface for the email mailer application component. | ||||
|  * It provides the default configuration for the email messages. | ||||
|  * Particular implementation of mailer should provide implementation for the [[send()]] method. | ||||
|  * | ||||
|  * @see BaseMessage | ||||
|  * | ||||
|  * @property \yii\base\View|array $view view instance or its array configuration. | ||||
|  * | ||||
|  * @author Paul Klimov <klimov.paul@gmail.com> | ||||
|  * @since 2.0 | ||||
|  */ | ||||
| abstract class BaseMailer extends Component implements MailerInterface, ViewContextInterface | ||||
| { | ||||
| 	/** | ||||
| 	 * @var \yii\base\View|array view instance or its array configuration. | ||||
| 	 */ | ||||
| 	private $_view = []; | ||||
| 	/** | ||||
| 	 * @var string directory containing view files for this email messages. | ||||
| 	 */ | ||||
| 	public $viewPath = '@app/mails'; | ||||
| 	/** | ||||
| 	 * @var string HTML layout view name. | ||||
| 	 */ | ||||
| 	public $htmlLayout = 'layouts/html'; | ||||
| 	/** | ||||
| 	 * @var string text layout view name. | ||||
| 	 */ | ||||
| 	public $textLayout = 'layouts/text'; | ||||
| 	/** | ||||
| 	 * @var array configuration, which should be applied by default to any new created | ||||
| 	 * email message instance. | ||||
| 	 * In addition to normal [[Yii::createObject()]] behavior extra config keys are available: | ||||
| 	 *  - 'charset' argument for [[MessageInterface::charset()]] | ||||
| 	 *  - 'from' argument for [[MessageInterface::from()]] | ||||
| 	 *  - 'to' argument for [[MessageInterface::to()]] | ||||
| 	 *  - 'cc' argument for [[MessageInterface::cc()]] | ||||
| 	 *  - 'bcc' argument for [[MessageInterface::bcc()]] | ||||
| 	 *  - 'subject' argument for [[MessageInterface::subject()]] | ||||
| 	 *  - 'textBody' argument for [[MessageInterface::textBody()]] | ||||
| 	 *  - 'htmlBody' argument for [[MessageInterface::htmlBody()]] | ||||
| 	 * For example: | ||||
| 	 * ~~~ | ||||
| 	 * array( | ||||
| 	 *     'charset' => 'UTF-8', | ||||
| 	 *     'from' => 'noreply@mydomain.com', | ||||
| 	 *     'bcc' => 'developer@mydomain.com', | ||||
| 	 * ) | ||||
| 	 * ~~~ | ||||
| 	 */ | ||||
| 	public $messageConfig = []; | ||||
| 	/** | ||||
| 	 * @var string message default class name. | ||||
| 	 */ | ||||
| 	public $messageClass = 'yii\mail\BaseMessage'; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param array|\yii\base\View $view view instance or its array configuration. | ||||
| 	 * @throws \yii\base\InvalidConfigException on invalid argument. | ||||
| 	 */ | ||||
| 	public function setView($view) | ||||
| 	{ | ||||
| 		if (!is_array($view) && !is_object($view)) { | ||||
| 			throw new InvalidConfigException('"' . get_class($this) . '::view" should be either object or array, "' . gettype($view) . '" given.'); | ||||
| 		} | ||||
| 		$this->_view = $view; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @return \yii\base\View view instance. | ||||
| 	 */ | ||||
| 	public function getView() | ||||
| 	{ | ||||
| 		if (!is_object($this->_view)) { | ||||
| 			$this->_view = $this->createView($this->_view); | ||||
| 		} | ||||
| 		return $this->_view; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Creates view instance from given configuration. | ||||
| 	 * @param array $config view configuration. | ||||
| 	 * @return \yii\base\View view instance. | ||||
| 	 */ | ||||
| 	protected function createView(array $config) | ||||
| 	{ | ||||
| 		if (!array_key_exists('class', $config)) { | ||||
| 			$config['class'] = 'yii\web\View'; | ||||
| 		} | ||||
| 		return Yii::createObject($config); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @inheritdoc | ||||
| 	 */ | ||||
| 	public function compose($view = null, array $params = []) | ||||
| 	{ | ||||
| 		$message = $this->createMessage(); | ||||
| 		if ($view !== null) { | ||||
| 			$params['message'] = $message; | ||||
| 			if (is_array($view)) { | ||||
| 				if (array_key_exists('html', $view)) { | ||||
| 					$message->htmlBody($this->render($view['html'], $params, $this->htmlLayout)); | ||||
| 				} | ||||
| 				if (array_key_exists('text', $view)) { | ||||
| 					$message->textBody($this->render($view['text'], $params, $this->textLayout)); | ||||
| 				} | ||||
| 			} else { | ||||
| 				$html = $this->render($view, $params, $this->htmlLayout); | ||||
| 				$message->htmlBody($html); | ||||
| 				$message->textBody(strip_tags($html)); | ||||
| 			} | ||||
| 		} | ||||
| 		return $message; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Creates mew message instance using configuration from [[messageConfig]]. | ||||
| 	 * If 'class' parameter is omitted, [[messageClass]] will be used. | ||||
| 	 * @return MessageInterface message instance. | ||||
| 	 */ | ||||
| 	protected function createMessage() | ||||
| 	{ | ||||
| 		$config = $this->messageConfig; | ||||
| 		if (!array_key_exists('class', $config)) { | ||||
| 			$config['class'] = $this->messageClass; | ||||
| 		} | ||||
| 		$directSetterNames = [ | ||||
| 			'charset', | ||||
| 			'from', | ||||
| 			'to', | ||||
| 			'cc', | ||||
| 			'bcc', | ||||
| 			'subject', | ||||
| 			'textBody', | ||||
| 			'htmlBody', | ||||
| 		]; | ||||
| 		$directSetterConfig = []; | ||||
| 		foreach ($config as $name => $value) { | ||||
| 			if (in_array($name, $directSetterNames, true)) { | ||||
| 				$directSetterConfig[$name] = $value; | ||||
| 				unset($config[$name]); | ||||
| 			} | ||||
| 		} | ||||
| 		$message = Yii::createObject($config); | ||||
| 		foreach ($directSetterConfig as $name => $value) { | ||||
| 			$message->$name($value); | ||||
| 		} | ||||
| 		return $message; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Sends a couple of messages at once. | ||||
| 	 * Note: some particular mailers may benefit from sending messages as batch, | ||||
| 	 * saving resources, for example on open/close connection operations, | ||||
| 	 * they may override this method to create their specific implementation. | ||||
| 	 * @param array $messages list of email messages, which should be sent. | ||||
| 	 * @return integer number of successful sends. | ||||
| 	 */ | ||||
| 	public function sendMultiple(array $messages) | ||||
| 	{ | ||||
| 		$successCount = 0; | ||||
| 		foreach ($messages as $message) { | ||||
| 			if ($this->send($message)) { | ||||
| 				$successCount++; | ||||
| 			} | ||||
| 		} | ||||
| 		return $successCount; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Renders a view. | ||||
| 	 * @param string $view the view name or the path alias of the view file. | ||||
| 	 * @param array $params the parameters (name-value pairs) that will be extracted and made available in the view file. | ||||
| 	 * @param string|boolean $layout layout view name, if false given no layout will be applied. | ||||
| 	 * @return string the rendering result. | ||||
| 	 */ | ||||
| 	public function render($view, $params = [], $layout = false) | ||||
| 	{ | ||||
| 		$output = $this->getView()->render($view, $params, $this); | ||||
| 		if ($layout !== false) { | ||||
| 			return $this->getView()->render($layout, ['content' => $output], $this); | ||||
| 		} else { | ||||
| 			return $output; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Finds the view file corresponding to the specified relative view name. | ||||
| 	 * @param string $view a relative view name. The name does NOT start with a slash. | ||||
| 	 * @return string the view file path. Note that the file may not exist. | ||||
| 	 */ | ||||
| 	public function findViewFile($view) | ||||
| 	{ | ||||
| 		return Yii::getAlias($this->viewPath) . DIRECTORY_SEPARATOR . $view; | ||||
| 	} | ||||
| } | ||||
| @ -0,0 +1,61 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @link http://www.yiiframework.com/ | ||||
|  * @copyright Copyright (c) 2008 Yii Software LLC | ||||
|  * @license http://www.yiiframework.com/license/ | ||||
|  */ | ||||
| 
 | ||||
| namespace yii\mail; | ||||
| 
 | ||||
| use yii\base\InvalidParamException; | ||||
| use yii\base\Object; | ||||
| use yii\helpers\FileHelper; | ||||
| use Yii; | ||||
| 
 | ||||
| /** | ||||
|  * BaseMessage represent the single email message. | ||||
|  * It functionality depends on application component 'email', | ||||
|  * which should provide the actual email sending functionality as well as | ||||
|  * default message configuration. | ||||
|  * | ||||
|  * @see BaseMailer | ||||
|  * | ||||
|  * @property \yii\mail\BaseMailer $mailer mailer component instance. This property is read-only. | ||||
|  * | ||||
|  * @author Paul Klimov <klimov.paul@gmail.com> | ||||
|  * @since 2.0 | ||||
|  */ | ||||
| abstract class BaseMessage extends Object implements MessageInterface | ||||
| { | ||||
| 	/** | ||||
| 	 * @return \yii\mail\BaseMailer mailer component instance. | ||||
| 	 */ | ||||
| 	public function getMailer() | ||||
| 	{ | ||||
| 		return Yii::$app->getComponent('mail'); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @inheritdoc | ||||
| 	 */ | ||||
| 	public function send() | ||||
| 	{ | ||||
| 		return $this->getMailer()->send($this); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * PHP magic method that returns the string representation of this object. | ||||
| 	 * @return string the string representation of this object. | ||||
| 	 */ | ||||
| 	public function __toString() | ||||
| 	{ | ||||
| 		// __toString cannot throw exception | ||||
| 		// use trigger_error to bypass this limitation | ||||
| 		try { | ||||
| 			return $this->toString(); | ||||
| 		} catch (\Exception $e) { | ||||
| 			trigger_error($e->getMessage()); | ||||
| 			return ''; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @ -0,0 +1,58 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @link http://www.yiiframework.com/ | ||||
|  * @copyright Copyright (c) 2008 Yii Software LLC | ||||
|  * @license http://www.yiiframework.com/license/ | ||||
|  */ | ||||
| 
 | ||||
| namespace yii\mail; | ||||
| 
 | ||||
| /** | ||||
|  * MailerInterface is an interface, which any mailer should apply. | ||||
|  * Mailer creates and sends messages. Also it allows composition of the message | ||||
|  * body via view rendering: | ||||
|  * ~~~php | ||||
|  * Yii::$app->mail->compose('contact/html', ['contactForm' => $form]) | ||||
|  *     ->from('from@domain.com') | ||||
|  *     ->to($form->email) | ||||
|  *     ->subject($form->subject) | ||||
|  *     ->send(); | ||||
|  * ~~~ | ||||
|  * | ||||
|  * @see MessageInterface | ||||
|  * | ||||
|  * @author Paul Klimov <klimov.paul@gmail.com> | ||||
|  * @since 2.0 | ||||
|  */ | ||||
| interface MailerInterface | ||||
| { | ||||
| 	/** | ||||
| 	 * Creates new message optionally filling up its body via view rendering. | ||||
| 	 * The view to be rendered can be specified in one of the following formats: | ||||
| 	 * - path alias (e.g. "@app/mails/contact/body"); | ||||
| 	 * - relative path (e.g. "contact"): the actual view file will be resolved by [[\yii\base\ViewContextInterface]]. | ||||
| 	 * @param string|array $view view, which should be used to render message body | ||||
| 	 *  - if string - the view name or the path alias of the HTML body view file, in this case | ||||
| 	 * text body will be composed automatically from html one. | ||||
| 	 *  - if array - list of views for each body type in format: ['html' => 'htmlView', 'text' => 'textView'] | ||||
| 	 * @param array $params the parameters (name-value pairs) that will be extracted and made available in the view file. | ||||
| 	 * @return MessageInterface message instance. | ||||
| 	 */ | ||||
| 	public function compose($view = null, array $params = []); | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Sends the given email message. | ||||
| 	 * @param object $message email message instance | ||||
| 	 * @return boolean whether the message has been sent. | ||||
| 	 */ | ||||
| 	public function send($message); | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Sends a couple of messages at once. | ||||
| 	 * Note: some particular mailers may benefit from sending messages as batch, | ||||
| 	 * saving resources, for example on open/close connection operations. | ||||
| 	 * @param array $messages list of email messages, which should be sent. | ||||
| 	 * @return integer number of successful sends. | ||||
| 	 */ | ||||
| 	public function sendMultiple(array $messages); | ||||
| } | ||||
| @ -0,0 +1,152 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @link http://www.yiiframework.com/ | ||||
|  * @copyright Copyright (c) 2008 Yii Software LLC | ||||
|  * @license http://www.yiiframework.com/license/ | ||||
|  */ | ||||
| 
 | ||||
| namespace yii\mail; | ||||
| 
 | ||||
| /** | ||||
|  * MessageInterface is an interface, which email message should apply. | ||||
|  * Together with application component, which matches the [[MailerInterface]], | ||||
|  * it introduces following mail sending syntax: | ||||
|  * ~~~php | ||||
|  * Yii::$app->mail->compose() | ||||
|  *     ->from('from@domain.com') | ||||
|  *     ->to('to@domain.com') | ||||
|  *     ->subject('Message Subject') | ||||
|  *     ->textBody('Plain text content') | ||||
|  *     ->htmlBody('<b>HTML content</b>') | ||||
|  *     ->send(); | ||||
|  * ~~~ | ||||
|  * | ||||
|  * @see MailerInterface | ||||
|  * | ||||
|  * @author Paul Klimov <klimov.paul@gmail.com> | ||||
|  * @since 2.0 | ||||
|  */ | ||||
| interface MessageInterface | ||||
| { | ||||
| 	/** | ||||
| 	 * Set the character set of this message. | ||||
| 	 * @param string $charset character set name. | ||||
| 	 * @return static self reference. | ||||
| 	 */ | ||||
| 	public function charset($charset); | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Sets message sender. | ||||
| 	 * @param string|array $from sender email address. | ||||
| 	 * You may pass an array of addresses if this message is from multiple people. | ||||
| 	 * You may also specify sender name in addition to email address using format: | ||||
| 	 * [email => name]. | ||||
| 	 * @return static self reference. | ||||
| 	 */ | ||||
| 	public function from($from); | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Sets message receiver. | ||||
| 	 * @param string|array $to receiver email address. | ||||
| 	 * You may pass an array of addresses if multiple recipients should receive this message. | ||||
| 	 * You may also specify receiver name in addition to email address using format: | ||||
| 	 * [email => name]. | ||||
| 	 * @return static self reference. | ||||
| 	 */ | ||||
| 	public function to($to); | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Set the Cc (additional copy receiver) addresses of this message. | ||||
| 	 * @param string|array $cc copy receiver email address. | ||||
| 	 * You may pass an array of addresses if multiple recipients should receive this message. | ||||
| 	 * You may also specify receiver name in addition to email address using format: | ||||
| 	 * [email => name]. | ||||
| 	 * @return static self reference. | ||||
| 	 */ | ||||
| 	public function cc($cc); | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Set the Bcc (hidden copy receiver) addresses of this message. | ||||
| 	 * @param string|array $bcc hidden copy receiver email address. | ||||
| 	 * You may pass an array of addresses if multiple recipients should receive this message. | ||||
| 	 * You may also specify receiver name in addition to email address using format: | ||||
| 	 * [email => name]. | ||||
| 	 * @return static self reference. | ||||
| 	 */ | ||||
| 	public function bcc($bcc); | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Sets message subject. | ||||
| 	 * @param string $subject message subject | ||||
| 	 * @return static self reference. | ||||
| 	 */ | ||||
| 	public function subject($subject); | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Sets message plain text content. | ||||
| 	 * @param string $text message plain text content. | ||||
| 	 * @return static self reference. | ||||
| 	 */ | ||||
| 	public function textBody($text); | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Sets message HTML content. | ||||
| 	 * @param string $html message HTML content. | ||||
| 	 * @return static self reference. | ||||
| 	 */ | ||||
| 	public function htmlBody($html); | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Attaches existing file to the email message. | ||||
| 	 * @param string $fileName full file name | ||||
| 	 * @param array $options options for embed file. Valid options are: | ||||
| 	 * - fileName: name, which should be used to attach file. | ||||
| 	 * - contentType: attached file MIME type. | ||||
| 	 * @return static self reference. | ||||
| 	 */ | ||||
| 	public function attach($fileName, array $options = []); | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Attach specified content as file for the email message. | ||||
| 	 * @param string $content attachment file content. | ||||
| 	 * @param array $options options for embed file. Valid options are: | ||||
| 	 * - fileName: name, which should be used to attach file. | ||||
| 	 * - contentType: attached file MIME type. | ||||
| 	 * @return static self reference. | ||||
| 	 */ | ||||
| 	public function attachContent($content, array $options = []); | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Attach a file and return it's CID source. | ||||
| 	 * This method should be used when embedding images or other data in a message. | ||||
| 	 * @param string $fileName file name. | ||||
| 	 * @param array $options options for embed file. Valid options are: | ||||
| 	 * - fileName: name, which should be used to attach file. | ||||
| 	 * - contentType: attached file MIME type. | ||||
| 	 * @return string attachment CID. | ||||
| 	 */ | ||||
| 	public function embed($fileName, array $options = []); | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Attach a content as file and return it's CID source. | ||||
| 	 * This method should be used when embedding images or other data in a message. | ||||
| 	 * @param string $content  attachment file content. | ||||
| 	 * @param array $options options for embed file. Valid options are: | ||||
| 	 * - fileName: name, which should be used to attach file. | ||||
| 	 * - contentType: attached file MIME type. | ||||
| 	 * @return string attachment CID. | ||||
| 	 */ | ||||
| 	public function embedContent($content, array $options = []); | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Sends this email message. | ||||
| 	 * @return boolean success. | ||||
| 	 */ | ||||
| 	public function send(); | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Returns string representation of this message. | ||||
| 	 * @return string the string representation of this message. | ||||
| 	 */ | ||||
| 	public function toString(); | ||||
| } | ||||
| @ -0,0 +1,30 @@ | ||||
| <?php | ||||
| 
 | ||||
| namespace yiiunit; | ||||
| 
 | ||||
| use yii\base\NotSupportedException; | ||||
| use Yii; | ||||
| 
 | ||||
| /** | ||||
|  * This is the base class for all yii framework unit tests, which requires | ||||
|  * external vendor libraries to function. | ||||
|  */ | ||||
| class VendorTestCase extends TestCase | ||||
| { | ||||
| 	/** | ||||
| 	 * This method is called before the first test of this test class is run. | ||||
| 	 * Attempts to load vendor autoloader. | ||||
| 	 * @throws \yii\base\NotSupportedException | ||||
| 	 */ | ||||
| 	public static function setUpBeforeClass() | ||||
| 	{ | ||||
| 		$vendorDir = __DIR__ . '/vendor'; | ||||
| 		Yii::setAlias('@vendor', $vendorDir); | ||||
| 		$vendorAutoload = $vendorDir . '/autoload.php'; | ||||
| 		if (file_exists($vendorAutoload)) { | ||||
| 			require_once($vendorAutoload); | ||||
| 		} else { | ||||
| 			throw new NotSupportedException("Vendor autoload file '{$vendorAutoload}' is missing."); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @ -0,0 +1,69 @@ | ||||
| <?php | ||||
| 
 | ||||
| namespace yiiunit\extensions\swiftmailer; | ||||
| 
 | ||||
| use Yii; | ||||
| use yii\swiftmailer\Mailer; | ||||
| use yii\swiftmailer\Message; | ||||
| use yiiunit\VendorTestCase; | ||||
| 
 | ||||
| /** | ||||
|  * @group vendor | ||||
|  * @group mail | ||||
|  * @group swiftmailer | ||||
|  */ | ||||
| class MailerTest extends VendorTestCase | ||||
| { | ||||
| 	public function setUp() | ||||
| 	{ | ||||
| 		$this->mockApplication([ | ||||
| 			'components' => [ | ||||
| 				'email' => $this->createTestEmailComponent() | ||||
| 			] | ||||
| 		]); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @return Mailer test email component instance. | ||||
| 	 */ | ||||
| 	protected function createTestEmailComponent() | ||||
| 	{ | ||||
| 		$component = new Mailer(); | ||||
| 		return $component; | ||||
| 	} | ||||
| 
 | ||||
| 	// Tests : | ||||
| 
 | ||||
| 	public function testSetupTransport() | ||||
| 	{ | ||||
| 		$mailer = new Mailer(); | ||||
| 
 | ||||
| 		$transport = \Swift_MailTransport::newInstance(); | ||||
| 		$mailer->setTransport($transport); | ||||
| 		$this->assertEquals($transport, $mailer->getTransport(), 'Unable to setup transport!'); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @depends testSetupTransport | ||||
| 	 */ | ||||
| 	public function testConfigureTransport() | ||||
| 	{ | ||||
| 		$mailer = new Mailer(); | ||||
| 
 | ||||
| 		$transportConfig = [ | ||||
| 			'class' => 'Swift_SmtpTransport', | ||||
| 			'host' => 'localhost', | ||||
| 		]; | ||||
| 		$mailer->setTransport($transportConfig); | ||||
| 		$transport = $mailer->getTransport(); | ||||
| 		$this->assertTrue(is_object($transport), 'Unable to setup transport via config!'); | ||||
| 		$this->assertEquals($transportConfig['class'], get_class($transport), 'Invalid transport class!'); | ||||
| 		$this->assertEquals($transportConfig['host'], $transport->getHost(), 'Invalid transport host!'); | ||||
| 	} | ||||
| 
 | ||||
| 	public function testGetSwiftMailer() | ||||
| 	{ | ||||
| 		$mailer = new Mailer(); | ||||
| 		$this->assertTrue(is_object($mailer->getSwiftMailer()), 'Unable to get Swift mailer instance!'); | ||||
| 	} | ||||
| } | ||||
| @ -0,0 +1,311 @@ | ||||
| <?php | ||||
| 
 | ||||
| namespace yiiunit\extensions\swiftmailer; | ||||
| 
 | ||||
| use Yii; | ||||
| use yii\helpers\FileHelper; | ||||
| use yii\swiftmailer\Mailer; | ||||
| use yii\swiftmailer\Message; | ||||
| use yiiunit\VendorTestCase; | ||||
| 
 | ||||
| /** | ||||
|  * @group vendor | ||||
|  * @group mail | ||||
|  * @group swiftmailer | ||||
|  */ | ||||
| class MessageTest extends VendorTestCase | ||||
| { | ||||
| 	/** | ||||
| 	 * @var string test email address, which will be used as receiver for the messages. | ||||
| 	 */ | ||||
| 	protected $testEmailReceiver = 'someuser@somedomain.com'; | ||||
| 
 | ||||
| 	public function setUp() | ||||
| 	{ | ||||
| 		$this->mockApplication([ | ||||
| 			'components' => [ | ||||
| 				'mail' => $this->createTestEmailComponent() | ||||
| 			] | ||||
| 		]); | ||||
| 		$filePath = $this->getTestFilePath(); | ||||
| 		if (!file_exists($filePath)) { | ||||
| 			FileHelper::createDirectory($filePath); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public function tearDown() | ||||
| 	{ | ||||
| 		$filePath = $this->getTestFilePath(); | ||||
| 		if (file_exists($filePath)) { | ||||
| 			FileHelper::removeDirectory($filePath); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @return string test file path. | ||||
| 	 */ | ||||
| 	protected function getTestFilePath() | ||||
| 	{ | ||||
| 		return Yii::getAlias('@yiiunit/runtime') . DIRECTORY_SEPARATOR . basename(get_class($this)) . '_' . getmypid(); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @return Mailer test email component instance. | ||||
| 	 */ | ||||
| 	protected function createTestEmailComponent() | ||||
| 	{ | ||||
| 		$component = new Mailer(); | ||||
| 		return $component; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @return Message test message instance. | ||||
| 	 */ | ||||
| 	protected function createTestMessage() | ||||
| 	{ | ||||
| 		return Yii::$app->getComponent('mail')->compose(); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Creates image file with given text. | ||||
| 	 * @param string $fileName file name. | ||||
| 	 * @param string $text text to be applied on image. | ||||
| 	 * @return string image file full name. | ||||
| 	 */ | ||||
| 	protected function createImageFile($fileName = 'test.jpg', $text = 'Test Image') | ||||
| 	{ | ||||
| 		if (!function_exists('imagecreatetruecolor')) { | ||||
| 			$this->markTestSkipped('GD lib required.'); | ||||
| 		} | ||||
| 		$fileFullName = $this->getTestFilePath() . DIRECTORY_SEPARATOR . $fileName; | ||||
| 		$image = imagecreatetruecolor(120, 20); | ||||
| 		$textColor = imagecolorallocate($image, 233, 14, 91); | ||||
| 		imagestring($image, 1, 5, 5, $text, $textColor); | ||||
| 		imagejpeg($image, $fileFullName); | ||||
| 		imagedestroy($image); | ||||
| 		return $fileFullName; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Finds the attachment object in the message. | ||||
| 	 * @param Message $message message instance | ||||
| 	 * @return null|\Swift_Mime_Attachment attachment instance. | ||||
| 	 */ | ||||
| 	protected function getAttachment(Message $message) | ||||
| 	{ | ||||
| 		$messageParts = $message->getSwiftMessage()->getChildren(); | ||||
| 		$attachment = null; | ||||
| 		foreach ($messageParts as $part) { | ||||
| 			if ($part instanceof \Swift_Mime_Attachment) { | ||||
| 				$attachment = $part; | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 		return $attachment; | ||||
| 	} | ||||
| 
 | ||||
| 	// Tests : | ||||
| 
 | ||||
| 	public function testGetSwiftMessage() | ||||
| 	{ | ||||
| 		$message = new Message(); | ||||
| 		$this->assertTrue(is_object($message->getSwiftMessage()), 'Unable to get Swift message!'); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @depends testGetSwiftMessage | ||||
| 	 */ | ||||
| 	public function testSetupHeaders() | ||||
| 	{ | ||||
| 		$charset = 'utf-16'; | ||||
| 		$subject = 'Test Subject'; | ||||
| 		$to = 'someuser@somedomain.com'; | ||||
| 		$cc = 'ccuser@somedomain.com'; | ||||
| 		$bcc = 'bccuser@somedomain.com'; | ||||
| 
 | ||||
| 		$messageString = $this->createTestMessage() | ||||
| 			->charset($charset) | ||||
| 			->subject($subject) | ||||
| 			->to($to) | ||||
| 			->cc($cc) | ||||
| 			->bcc($bcc) | ||||
| 			->toString(); | ||||
| 
 | ||||
| 		$this->assertContains('charset=' . $charset, $messageString, 'Incorrect charset!'); | ||||
| 		$this->assertContains('Subject: ' . $subject, $messageString, 'Incorrect "Subject" header!'); | ||||
| 		$this->assertContains('To: ' . $to, $messageString, 'Incorrect "To" header!'); | ||||
| 		$this->assertContains('Cc: ' . $cc, $messageString, 'Incorrect "Cc" header!'); | ||||
| 		$this->assertContains('Bcc: ' . $bcc, $messageString, 'Incorrect "Bcc" header!'); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @depends testGetSwiftMessage | ||||
| 	 */ | ||||
| 	public function testSetupFrom() | ||||
| 	{ | ||||
| 		$from = 'someuser@somedomain.com'; | ||||
| 		$messageString = $this->createTestMessage() | ||||
| 			->from($from) | ||||
| 			->toString(); | ||||
| 		$this->assertContains('From: ' . $from, $messageString, 'Incorrect "From" header!'); | ||||
| 		$this->assertContains('Reply-To: ' . $from, $messageString, 'Incorrect "Reply-To" header!'); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @depends testGetSwiftMessage | ||||
| 	 */ | ||||
| 	public function testSend() | ||||
| 	{ | ||||
| 		$message = $this->createTestMessage(); | ||||
| 		$message->to($this->testEmailReceiver); | ||||
| 		$message->from('someuser@somedomain.com'); | ||||
| 		$message->subject('Yii Swift Test'); | ||||
| 		$message->textBody('Yii Swift Test body'); | ||||
| 		$this->assertTrue($message->send()); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @depends testSend | ||||
| 	 */ | ||||
| 	public function testAttachFile() | ||||
| 	{ | ||||
| 		$message = $this->createTestMessage(); | ||||
| 
 | ||||
| 		$message->to($this->testEmailReceiver); | ||||
| 		$message->from('someuser@somedomain.com'); | ||||
| 		$message->subject('Yii Swift Attach File Test'); | ||||
| 		$message->textBody('Yii Swift Attach File Test body'); | ||||
| 		$fileName = __FILE__; | ||||
| 		$message->attach($fileName); | ||||
| 
 | ||||
| 		$this->assertTrue($message->send()); | ||||
| 
 | ||||
| 		$attachment = $this->getAttachment($message); | ||||
| 		$this->assertTrue(is_object($attachment), 'No attachment found!'); | ||||
| 		$this->assertContains($attachment->getFilename(), $fileName, 'Invalid file name!'); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @depends testSend | ||||
| 	 */ | ||||
| 	public function testAttachContent() | ||||
| 	{ | ||||
| 		$message = $this->createTestMessage(); | ||||
| 
 | ||||
| 		$message->to($this->testEmailReceiver); | ||||
| 		$message->from('someuser@somedomain.com'); | ||||
| 		$message->subject('Yii Swift Create Attachment Test'); | ||||
| 		$message->textBody('Yii Swift Create Attachment Test body'); | ||||
| 		$fileName = 'test.txt'; | ||||
| 		$fileContent = 'Test attachment content'; | ||||
| 		$message->attachContent($fileContent, ['fileName' => $fileName]); | ||||
| 
 | ||||
| 		$this->assertTrue($message->send()); | ||||
| 
 | ||||
| 		$attachment = $this->getAttachment($message); | ||||
| 		$this->assertTrue(is_object($attachment), 'No attachment found!'); | ||||
| 		$this->assertEquals($fileName, $attachment->getFilename(), 'Invalid file name!'); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @depends testSend | ||||
| 	 */ | ||||
| 	public function testEmbedFile() | ||||
| 	{ | ||||
| 		$fileName = $this->createImageFile('embed_file.jpg', 'Embed Image File'); | ||||
| 
 | ||||
| 		$message = $this->createTestMessage(); | ||||
| 
 | ||||
| 		$cid = $message->embed($fileName); | ||||
| 
 | ||||
| 		$message->to($this->testEmailReceiver); | ||||
| 		$message->from('someuser@somedomain.com'); | ||||
| 		$message->subject('Yii Swift Embed File Test'); | ||||
| 		$message->htmlBody('Embed image: <img src="' . $cid. '" alt="pic">'); | ||||
| 
 | ||||
| 		$this->assertTrue($message->send()); | ||||
| 
 | ||||
| 		$attachment = $this->getAttachment($message); | ||||
| 		$this->assertTrue(is_object($attachment), 'No attachment found!'); | ||||
| 		$this->assertContains($attachment->getFilename(), $fileName, 'Invalid file name!'); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @depends testSend | ||||
| 	 */ | ||||
| 	public function testEmbedContent() | ||||
| 	{ | ||||
| 		$fileFullName = $this->createImageFile('embed_file.jpg', 'Embed Image File'); | ||||
| 		$message = $this->createTestMessage(); | ||||
| 
 | ||||
| 		$fileName = basename($fileFullName); | ||||
| 		$contentType = 'image/jpeg'; | ||||
| 		$fileContent = file_get_contents($fileFullName); | ||||
| 
 | ||||
| 		$cid = $message->embedContent($fileContent, ['fileName' => $fileName, 'contentType' => $contentType]); | ||||
| 
 | ||||
| 		$message->to($this->testEmailReceiver); | ||||
| 		$message->from('someuser@somedomain.com'); | ||||
| 		$message->subject('Yii Swift Embed File Test'); | ||||
| 		$message->htmlBody('Embed image: <img src="' . $cid. '" alt="pic">'); | ||||
| 
 | ||||
| 		$this->assertTrue($message->send()); | ||||
| 
 | ||||
| 		$attachment = $this->getAttachment($message); | ||||
| 		$this->assertTrue(is_object($attachment), 'No attachment found!'); | ||||
| 		$this->assertEquals($fileName, $attachment->getFilename(), 'Invalid file name!'); | ||||
| 		$this->assertEquals($contentType, $attachment->getContentType(), 'Invalid content type!'); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @depends testSend | ||||
| 	 */ | ||||
| 	public function testSendAlternativeBody() | ||||
| 	{ | ||||
| 		$message = $this->createTestMessage(); | ||||
| 
 | ||||
| 		$message->to($this->testEmailReceiver); | ||||
| 		$message->from('someuser@somedomain.com'); | ||||
| 		$message->subject('Yii Swift Alternative Body Test'); | ||||
| 		$message->htmlBody('<b>Yii Swift</b> test HTML body'); | ||||
| 		$message->textBody('Yii Swift test plain text body'); | ||||
| 
 | ||||
| 		$this->assertTrue($message->send()); | ||||
| 
 | ||||
| 		$messageParts = $message->getSwiftMessage()->getChildren(); | ||||
| 		$textPresent = false; | ||||
| 		$htmlPresent = false; | ||||
| 		foreach ($messageParts as $part) { | ||||
| 			if (!($part instanceof \Swift_Mime_Attachment)) { | ||||
| 				/* @var $part \Swift_Mime_MimePart */ | ||||
| 				if ($part->getContentType() == 'text/plain') { | ||||
| 					$textPresent = true; | ||||
| 				} | ||||
| 				if ($part->getContentType() == 'text/html') { | ||||
| 					$htmlPresent = true; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		$this->assertTrue($textPresent, 'No text!'); | ||||
| 		$this->assertTrue($htmlPresent, 'No HTML!'); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @depends testGetSwiftMessage | ||||
| 	 */ | ||||
| 	public function testSerialize() | ||||
| 	{ | ||||
| 		$message = $this->createTestMessage(); | ||||
| 
 | ||||
| 		$message->to($this->testEmailReceiver); | ||||
| 		$message->from('someuser@somedomain.com'); | ||||
| 		$message->subject('Yii Swift Alternative Body Test'); | ||||
| 		$message->textBody('Yii Swift test plain text body'); | ||||
| 
 | ||||
| 		$serializedMessage = serialize($message); | ||||
| 		$this->assertNotEmpty($serializedMessage, 'Unable to serialize message!'); | ||||
| 
 | ||||
| 		$unserializedMessaage = unserialize($serializedMessage); | ||||
| 		$this->assertEquals($message, $unserializedMessaage, 'Unable to unserialize message!'); | ||||
| 	} | ||||
| } | ||||
| @ -0,0 +1,303 @@ | ||||
| <?php | ||||
| 
 | ||||
| namespace yiiunit\framework\mail; | ||||
| 
 | ||||
| use Yii; | ||||
| use yii\base\View; | ||||
| use yii\mail\BaseMailer; | ||||
| use yii\mail\BaseMessage; | ||||
| use yii\helpers\FileHelper; | ||||
| use yiiunit\TestCase; | ||||
| 
 | ||||
| /** | ||||
|  * @group mail | ||||
|  */ | ||||
| class BaseMailerTest extends TestCase | ||||
| { | ||||
| 	public function setUp() | ||||
| 	{ | ||||
| 		$this->mockApplication([ | ||||
| 			'components' => [ | ||||
| 				'mail' => $this->createTestMailComponent(), | ||||
| 			] | ||||
| 		]); | ||||
| 		$filePath = $this->getTestFilePath(); | ||||
| 		if (!file_exists($filePath)) { | ||||
| 			FileHelper::createDirectory($filePath); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public function tearDown() | ||||
| 	{ | ||||
| 		$filePath = $this->getTestFilePath(); | ||||
| 		if (file_exists($filePath)) { | ||||
| 			FileHelper::removeDirectory($filePath); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @return string test file path. | ||||
| 	 */ | ||||
| 	protected function getTestFilePath() | ||||
| 	{ | ||||
| 		return Yii::getAlias('@yiiunit/runtime') . DIRECTORY_SEPARATOR . basename(get_class($this)) . '_' . getmypid(); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @return Mailer test email component instance. | ||||
| 	 */ | ||||
| 	protected function createTestMailComponent() | ||||
| 	{ | ||||
| 		$component = new Mailer(); | ||||
| 		$component->viewPath = $this->getTestFilePath(); | ||||
| 		return $component; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @return Mailer mailer instance | ||||
| 	 */ | ||||
| 	protected function getTestMailComponent() | ||||
| 	{ | ||||
| 		return Yii::$app->getComponent('mail'); | ||||
| 	} | ||||
| 
 | ||||
| 	// Tests : | ||||
| 
 | ||||
| 	public function testSetupView() | ||||
| 	{ | ||||
| 		$mailer = new Mailer(); | ||||
| 
 | ||||
| 		$view = new View(); | ||||
| 		$mailer->setView($view); | ||||
| 		$this->assertEquals($view, $mailer->getView(), 'Unable to setup view!'); | ||||
| 
 | ||||
| 		$viewConfig = [ | ||||
| 			'params' => [ | ||||
| 				'param1' => 'value1', | ||||
| 				'param2' => 'value2', | ||||
| 			] | ||||
| 		]; | ||||
| 		$mailer->setView($viewConfig); | ||||
| 		$view = $mailer->getView(); | ||||
| 		$this->assertTrue(is_object($view), 'Unable to setup view via config!'); | ||||
| 		$this->assertEquals($viewConfig['params'], $view->params, 'Unable to configure view via config array!'); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @depends testSetupView | ||||
| 	 */ | ||||
| 	public function testGetDefaultView() | ||||
| 	{ | ||||
| 		$mailer = new Mailer(); | ||||
| 		$view = $mailer->getView(); | ||||
| 		$this->assertTrue(is_object($view), 'Unable to get default view!'); | ||||
| 	} | ||||
| 
 | ||||
| 	public function testCreateMessage() | ||||
| 	{ | ||||
| 		$mailer = new Mailer(); | ||||
| 		$message = $mailer->compose(); | ||||
| 		$this->assertTrue(is_object($message), 'Unable to create message instance!'); | ||||
| 		$this->assertEquals($mailer->messageClass, get_class($message), 'Invalid message class!'); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @depends testCreateMessage | ||||
| 	 */ | ||||
| 	public function testDefaultMessageConfig() | ||||
| 	{ | ||||
| 		$mailer = new Mailer(); | ||||
| 
 | ||||
| 		$notPropertyConfig = [ | ||||
| 			'charset' => 'utf-16', | ||||
| 			'from' => 'from@domain.com', | ||||
| 			'to' => 'to@domain.com', | ||||
| 			'cc' => 'cc@domain.com', | ||||
| 			'bcc' => 'bcc@domain.com', | ||||
| 			'subject' => 'Test subject', | ||||
| 			'textBody' => 'Test text body', | ||||
| 			'htmlBody' => 'Test HTML body', | ||||
| 		]; | ||||
| 		$propertyConfig = [ | ||||
| 			'id' => 'test-id', | ||||
| 			'encoding' => 'test-encoding', | ||||
| 		]; | ||||
| 		$messageConfig = array_merge($notPropertyConfig, $propertyConfig); | ||||
| 		$mailer->messageConfig = $messageConfig; | ||||
| 
 | ||||
| 		$message = $mailer->compose(); | ||||
| 
 | ||||
| 		foreach ($notPropertyConfig as $name => $value) { | ||||
| 			$this->assertEquals($value, $message->{'_' . $name}); | ||||
| 		} | ||||
| 		foreach ($propertyConfig as $name => $value) { | ||||
| 			$this->assertEquals($value, $message->$name); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @depends testGetDefaultView | ||||
| 	 */ | ||||
| 	public function testRender() | ||||
| 	{ | ||||
| 		$mailer = $this->getTestMailComponent(); | ||||
| 
 | ||||
| 		$viewName = 'test_view'; | ||||
| 		$viewFileName = $this->getTestFilePath() . DIRECTORY_SEPARATOR . $viewName . '.php'; | ||||
| 		$viewFileContent = '<?php echo $testParam; ?>';
 | ||||
| 		file_put_contents($viewFileName, $viewFileContent); | ||||
| 
 | ||||
| 		$params = [ | ||||
| 			'testParam' => 'test output' | ||||
| 		]; | ||||
| 		$renderResult = $mailer->render($viewName, $params); | ||||
| 		$this->assertEquals($params['testParam'], $renderResult); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @depends testRender | ||||
| 	 */ | ||||
| 	public function testRenderLayout() | ||||
| 	{ | ||||
| 		$mailer = $this->getTestMailComponent(); | ||||
| 
 | ||||
| 		$filePath = $this->getTestFilePath(); | ||||
| 
 | ||||
| 		$viewName = 'test_view'; | ||||
| 		$viewFileName = $filePath . DIRECTORY_SEPARATOR . $viewName . '.php'; | ||||
| 		$viewFileContent = 'view file content'; | ||||
| 		file_put_contents($viewFileName, $viewFileContent); | ||||
| 
 | ||||
| 		$layoutName = 'test_layout'; | ||||
| 		$layoutFileName = $filePath . DIRECTORY_SEPARATOR . $layoutName . '.php'; | ||||
| 		$layoutFileContent = 'Begin Layout <?php echo $content; ?> End Layout';
 | ||||
| 		file_put_contents($layoutFileName, $layoutFileContent); | ||||
| 
 | ||||
| 		$renderResult = $mailer->render($viewName, [], $layoutName); | ||||
| 		$this->assertEquals('Begin Layout ' . $viewFileContent . ' End Layout', $renderResult); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @depends testCreateMessage | ||||
| 	 * @depends testRender | ||||
| 	 */ | ||||
| 	public function testCompose() | ||||
| 	{ | ||||
| 		$mailer = $this->getTestMailComponent(); | ||||
| 		$mailer->htmlLayout = false; | ||||
| 		$mailer->textLayout = false; | ||||
| 
 | ||||
| 		$htmlViewName = 'test_html_view'; | ||||
| 		$htmlViewFileName = $this->getTestFilePath() . DIRECTORY_SEPARATOR . $htmlViewName . '.php'; | ||||
| 		$htmlViewFileContent = 'HTML <b>view file</b> content'; | ||||
| 		file_put_contents($htmlViewFileName, $htmlViewFileContent); | ||||
| 		 | ||||
| 		$textViewName = 'test_text_view'; | ||||
| 		$textViewFileName = $this->getTestFilePath() . DIRECTORY_SEPARATOR . $textViewName . '.php'; | ||||
| 		$textViewFileContent = 'Plain text view file content'; | ||||
| 		file_put_contents($textViewFileName, $textViewFileContent); | ||||
| 
 | ||||
| 		$message = $mailer->compose([ | ||||
| 			'html' => $htmlViewName, | ||||
| 			'text' => $textViewName, | ||||
| 		]); | ||||
| 		$this->assertEquals($htmlViewFileContent, $message->_htmlBody, 'Unable to render html!'); | ||||
| 		$this->assertEquals($textViewFileContent, $message->_textBody, 'Unable to render text!'); | ||||
| 
 | ||||
| 		$message = $mailer->compose($htmlViewName); | ||||
| 		$this->assertEquals($htmlViewFileContent, $message->_htmlBody, 'Unable to render html by direct view!'); | ||||
| 		$this->assertEquals(strip_tags($htmlViewFileContent), $message->_textBody, 'Unable to render text by direct view!'); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Test Mailer class | ||||
|  */ | ||||
| class Mailer extends BaseMailer | ||||
| { | ||||
| 	public $messageClass = 'yiiunit\framework\mail\Message'; | ||||
| 	public $sentMessages = []; | ||||
| 
 | ||||
| 	public function send($message) | ||||
| 	{ | ||||
| 		$this->sentMessages[] = $message; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Test Message class | ||||
|  */ | ||||
| class Message extends BaseMessage | ||||
| { | ||||
| 	public $id; | ||||
| 	public $encoding; | ||||
| 	public $_charset; | ||||
| 	public $_from; | ||||
| 	public $_to; | ||||
| 	public $_cc; | ||||
| 	public $_bcc; | ||||
| 	public $_subject; | ||||
| 	public $_textBody; | ||||
| 	public $_htmlBody; | ||||
| 
 | ||||
| 	public function charset($charset) | ||||
| 	{ | ||||
| 		$this->_charset = $charset; | ||||
| 		return $this; | ||||
| 	} | ||||
| 
 | ||||
| 	public function from($from) | ||||
| 	{ | ||||
| 		$this->_from = $from; | ||||
| 		return $this; | ||||
| 	} | ||||
| 
 | ||||
| 	public function to($to) | ||||
| 	{ | ||||
| 		$this->_to = $to; | ||||
| 		return $this; | ||||
| 	} | ||||
| 
 | ||||
| 	public function cc($cc) | ||||
| 	{ | ||||
| 		$this->_cc = $cc; | ||||
| 		return $this; | ||||
| 	} | ||||
| 
 | ||||
| 	public function bcc($bcc) | ||||
| 	{ | ||||
| 		$this->_bcc = $bcc; | ||||
| 		return $this; | ||||
| 	} | ||||
| 
 | ||||
| 	public function subject($subject) | ||||
| 	{ | ||||
| 		$this->_subject = $subject; | ||||
| 		return $this; | ||||
| 	} | ||||
| 
 | ||||
| 	public function textBody($text) | ||||
| 	{ | ||||
| 		$this->_textBody = $text; | ||||
| 		return $this; | ||||
| 	} | ||||
| 
 | ||||
| 	public function htmlBody($html) | ||||
| 	{ | ||||
| 		$this->_htmlBody = $html; | ||||
| 		return $this; | ||||
| 	} | ||||
| 
 | ||||
| 	public function attachContent($content, array $options = []) {} | ||||
| 
 | ||||
| 	public function attach($fileName, array $options = []) {} | ||||
| 
 | ||||
| 	public function embed($fileName, array $options = []) {} | ||||
| 
 | ||||
| 	public function embedContent($content, array $options = []) {} | ||||
| 
 | ||||
| 	public function toString() | ||||
| 	{ | ||||
| 		return get_class($this); | ||||
| 	} | ||||
| } | ||||
| @ -0,0 +1,120 @@ | ||||
| <?php | ||||
| 
 | ||||
| namespace yiiunit\framework\mail; | ||||
| 
 | ||||
| use Yii; | ||||
| use yii\mail\BaseMailer; | ||||
| use yii\mail\BaseMessage; | ||||
| use yiiunit\TestCase; | ||||
| 
 | ||||
| /** | ||||
|  * @group mail | ||||
|  */ | ||||
| class BaseMessageTest extends TestCase | ||||
| { | ||||
| 	public function setUp() | ||||
| 	{ | ||||
| 		$this->mockApplication([ | ||||
| 			'components' => [ | ||||
| 				'mail' => $this->createTestEmailComponent() | ||||
| 			] | ||||
| 		]); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @return Mailer test email component instance. | ||||
| 	 */ | ||||
| 	protected function createTestEmailComponent() | ||||
| 	{ | ||||
| 		$component = new TestMailer(); | ||||
| 		return $component; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @return TestMailer mailer instance. | ||||
| 	 */ | ||||
| 	protected function getMailer() | ||||
| 	{ | ||||
| 		return Yii::$app->getComponent('mail'); | ||||
| 	} | ||||
| 
 | ||||
| 	// Tests : | ||||
| 
 | ||||
| 	public function testGetMailer() | ||||
| 	{ | ||||
| 		$mailer = $this->getMailer(); | ||||
| 		$message = $mailer->compose(); | ||||
| 		$this->assertEquals($mailer, $message->getMailer()); | ||||
| 	} | ||||
| 
 | ||||
| 	public function testSend() | ||||
| 	{ | ||||
| 		$mailer = $this->getMailer(); | ||||
| 		$message = $mailer->compose(); | ||||
| 		$message->send(); | ||||
| 		$this->assertEquals($message, $mailer->sentMessages[0], 'Unable to send message!'); | ||||
| 	} | ||||
| 
 | ||||
| 	public function testToString() | ||||
| 	{ | ||||
| 		$mailer = $this->getMailer(); | ||||
| 		$message = $mailer->compose(); | ||||
| 		$this->assertEquals($message->toString(), '' . $message); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Test Mailer class | ||||
|  */ | ||||
| class TestMailer extends BaseMailer | ||||
| { | ||||
| 	public $messageClass = 'yiiunit\framework\mail\TestMessage'; | ||||
| 	public $sentMessages = array(); | ||||
| 
 | ||||
| 	public function send($message) | ||||
| 	{ | ||||
| 		$this->sentMessages[] = $message; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Test Message class | ||||
|  */ | ||||
| class TestMessage extends BaseMessage | ||||
| { | ||||
| 	public $text; | ||||
| 	public $html; | ||||
| 
 | ||||
| 	public function charset($charset) {} | ||||
| 
 | ||||
| 	public function from($from) {} | ||||
| 
 | ||||
| 	public function to($to) {} | ||||
| 
 | ||||
| 	public function cc($cc) {} | ||||
| 
 | ||||
| 	public function bcc($bcc) {} | ||||
| 
 | ||||
| 	public function subject($subject) {} | ||||
| 
 | ||||
| 	public function textBody($text) { | ||||
| 		$this->text = $text; | ||||
| 	} | ||||
| 
 | ||||
| 	public function htmlBody($html) { | ||||
| 		$this->html = $html; | ||||
| 	} | ||||
| 
 | ||||
| 	public function attachContent($content, array $options = []) {} | ||||
| 
 | ||||
| 	public function attach($fileName, array $options = []) {} | ||||
| 
 | ||||
| 	public function embed($fileName, array $options = []) {} | ||||
| 
 | ||||
| 	public function embedContent($content, array $options = []) {} | ||||
| 
 | ||||
| 	public function toString() | ||||
| 	{ | ||||
| 		return get_class($this); | ||||
| 	} | ||||
| } | ||||
					Loading…
					
					
				
		Reference in new issue