Paul Klimov
11 years ago
28 changed files with 2088 additions and 30 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,158 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* @link http://www.yiiframework.com/ |
||||||
|
* @copyright Copyright (c) 2008 Yii Software LLC |
||||||
|
* @license http://www.yiiframework.com/license/ |
||||||
|
*/ |
||||||
|
|
||||||
|
namespace yii\swiftmailer; |
||||||
|
|
||||||
|
use Yii; |
||||||
|
use yii\base\InvalidConfigException; |
||||||
|
use yii\mail\BaseMailer; |
||||||
|
|
||||||
|
/** |
||||||
|
* Mailer implements a mailer based on SwiftMailer. |
||||||
|
* |
||||||
|
* To use Mailer, you should configure it in the application configuration like the following, |
||||||
|
* |
||||||
|
* ~~~ |
||||||
|
* 'components' => array( |
||||||
|
* ... |
||||||
|
* 'email' => array( |
||||||
|
* 'class' => 'yii\swiftmailer\Mailer', |
||||||
|
* 'transport' => [ |
||||||
|
* 'class' => 'Swift_SmtpTransport', |
||||||
|
* 'host' => 'localhost', |
||||||
|
* 'username' => 'username', |
||||||
|
* 'password' => 'password', |
||||||
|
* 'port' => '587', |
||||||
|
* 'encryption' => 'tls', |
||||||
|
* ], |
||||||
|
* ), |
||||||
|
* ... |
||||||
|
* ), |
||||||
|
* ~~~ |
||||||
|
* |
||||||
|
* You may also skip the configuration of the [[transport]] property. In that case, the default |
||||||
|
* PHP `mail()` function will be used to send emails. |
||||||
|
* |
||||||
|
* To send an email, you may use the following code: |
||||||
|
* |
||||||
|
* ~~~ |
||||||
|
* Yii::$app->mail->compose('contact/html', ['contactForm' => $form]) |
||||||
|
* ->setFrom('from@domain.com') |
||||||
|
* ->setTo($form->email) |
||||||
|
* ->setSubject($form->subject) |
||||||
|
* ->send(); |
||||||
|
* ~~~ |
||||||
|
* |
||||||
|
* @see http://swiftmailer.org |
||||||
|
* |
||||||
|
* @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 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) |
||||||
|
{ |
||||||
|
$address = $message->getTo(); |
||||||
|
if (is_array($address)) { |
||||||
|
$address = implode(', ', $address); |
||||||
|
} |
||||||
|
Yii::trace('Sending email "' . $message->getSubject() . '" to "' . $address . '"', __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 (isset($config['class'])) { |
||||||
|
$className = $config['class']; |
||||||
|
unset($config['class']); |
||||||
|
} else { |
||||||
|
$className = 'Swift_MailTransport'; |
||||||
|
} |
||||||
|
/** @var \Swift_MailTransport $transport */ |
||||||
|
$transport = $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,301 @@ |
|||||||
|
<?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; |
||||||
|
|
||||||
|
/** |
||||||
|
* Message implements a message class based on SwiftMailer. |
||||||
|
* |
||||||
|
* @see http://swiftmailer.org/docs/messages.html |
||||||
|
* @see 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 getCharset() |
||||||
|
{ |
||||||
|
$this->getSwiftMessage()->getCharset(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @inheritdoc |
||||||
|
*/ |
||||||
|
public function setCharset($charset) |
||||||
|
{ |
||||||
|
$this->getSwiftMessage()->setCharset($charset); |
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @inheritdoc |
||||||
|
*/ |
||||||
|
public function getFrom() |
||||||
|
{ |
||||||
|
$this->getSwiftMessage()->getFrom(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @inheritdoc |
||||||
|
*/ |
||||||
|
public function setFrom($from) |
||||||
|
{ |
||||||
|
$this->getSwiftMessage()->setFrom($from); |
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @inheritdoc |
||||||
|
*/ |
||||||
|
public function getReplyTo() |
||||||
|
{ |
||||||
|
$this->getSwiftMessage()->getReplyTo(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @inheritdoc |
||||||
|
*/ |
||||||
|
public function setReplyTo($replyTo) |
||||||
|
{ |
||||||
|
$this->getSwiftMessage()->setReplyTo($replyTo); |
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @inheritdoc |
||||||
|
*/ |
||||||
|
public function getTo() |
||||||
|
{ |
||||||
|
$this->getSwiftMessage()->getTo(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @inheritdoc |
||||||
|
*/ |
||||||
|
public function setTo($to) |
||||||
|
{ |
||||||
|
$this->getSwiftMessage()->setTo($to); |
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @inheritdoc |
||||||
|
*/ |
||||||
|
public function getCc() |
||||||
|
{ |
||||||
|
$this->getSwiftMessage()->getCc(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @inheritdoc |
||||||
|
*/ |
||||||
|
public function setCc($cc) |
||||||
|
{ |
||||||
|
$this->getSwiftMessage()->setCc($cc); |
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @inheritdoc |
||||||
|
*/ |
||||||
|
public function getBcc() |
||||||
|
{ |
||||||
|
$this->getSwiftMessage()->getBcc(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @inheritdoc |
||||||
|
*/ |
||||||
|
public function setBcc($bcc) |
||||||
|
{ |
||||||
|
$this->getSwiftMessage()->setBcc($bcc); |
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @inheritdoc |
||||||
|
*/ |
||||||
|
public function getSubject() |
||||||
|
{ |
||||||
|
$this->getSwiftMessage()->getSubject(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @inheritdoc |
||||||
|
*/ |
||||||
|
public function setSubject($subject) |
||||||
|
{ |
||||||
|
$this->getSwiftMessage()->setSubject($subject); |
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @inheritdoc |
||||||
|
*/ |
||||||
|
public function setTextBody($text) |
||||||
|
{ |
||||||
|
$this->setBody($text, 'text/plain'); |
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @inheritdoc |
||||||
|
*/ |
||||||
|
public function setHtmlBody($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,49 @@ |
|||||||
|
SwiftMailer Extension for Yii 2 |
||||||
|
=============================== |
||||||
|
|
||||||
|
This extension provides a `SwiftMailer` mail solution for Yii 2. |
||||||
|
|
||||||
|
To use this extension, simply add the following code in your application configuration: |
||||||
|
|
||||||
|
```php |
||||||
|
return [ |
||||||
|
//.... |
||||||
|
'components' => [ |
||||||
|
'mail' => [ |
||||||
|
'class' => 'yii\swiftmailer\Mailer', |
||||||
|
], |
||||||
|
], |
||||||
|
]; |
||||||
|
``` |
||||||
|
|
||||||
|
You can then send an email as follows: |
||||||
|
|
||||||
|
```php |
||||||
|
Yii::$app->mail->compose('contact/html') |
||||||
|
->from('from@domain.com') |
||||||
|
->to($form->email) |
||||||
|
->subject($form->subject) |
||||||
|
->send(); |
||||||
|
``` |
||||||
|
|
||||||
|
For further instructions refer to the related section in the Yii Definitive Guide. |
||||||
|
|
||||||
|
|
||||||
|
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. |
@ -0,0 +1,29 @@ |
|||||||
|
{ |
||||||
|
"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\\": "" } |
||||||
|
}, |
||||||
|
"target-dir": "yii/swiftmailer" |
||||||
|
} |
@ -0,0 +1,223 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* @link http://www.yiiframework.com/ |
||||||
|
* @copyright Copyright (c) 2008 Yii Software LLC |
||||||
|
* @license http://www.yiiframework.com/license/ |
||||||
|
*/ |
||||||
|
|
||||||
|
namespace yii\mail; |
||||||
|
|
||||||
|
use Yii; |
||||||
|
use yii\base\Component; |
||||||
|
use yii\base\InvalidConfigException; |
||||||
|
use yii\base\ViewContextInterface; |
||||||
|
use yii\web\View; |
||||||
|
|
||||||
|
/** |
||||||
|
* BaseMailer serves as a base class that implements the basic functions required by [[MailerInterface]]. |
||||||
|
* |
||||||
|
* Concrete child classes should may focus on implementing the [[send()]] method. |
||||||
|
* |
||||||
|
* @see BaseMessage |
||||||
|
* |
||||||
|
* @property 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. |
||||||
|
* This can be specified as an absolute path or path alias. |
||||||
|
*/ |
||||||
|
public $viewPath = '@app/mails'; |
||||||
|
/** |
||||||
|
* @var string|boolean HTML layout view name. This is the layout used to render HTML mail body. |
||||||
|
* The property can take the following values: |
||||||
|
* |
||||||
|
* - a relative view name: a view file relative to [[viewPath]], e.g., 'layouts/html'. |
||||||
|
* - a path alias: an absolute view file path specified as a path alias, e.g., '@app/mails/html'. |
||||||
|
* - a boolean false: the layout is disabled. |
||||||
|
*/ |
||||||
|
public $htmlLayout = 'layouts/html'; |
||||||
|
/** |
||||||
|
* @var string|boolean text layout view name. This is the layout used to render TEXT mail body. |
||||||
|
* Please refer to [[htmlLayout]] for possible values that this property can take. |
||||||
|
*/ |
||||||
|
public $textLayout = 'layouts/text'; |
||||||
|
/** |
||||||
|
* @var array the configuration that should be applied to any newly created |
||||||
|
* email message instance by [[createMessage()]] or [[compose()]]. Any valid property defined |
||||||
|
* by [[MessageInterface]] can be configured, such as `from`, `to`, `subject`, `textBody`, `htmlBody`, etc. |
||||||
|
* |
||||||
|
* For example: |
||||||
|
* |
||||||
|
* ~~~ |
||||||
|
* [ |
||||||
|
* 'charset' => 'UTF-8', |
||||||
|
* 'from' => 'noreply@mydomain.com', |
||||||
|
* 'bcc' => 'developer@mydomain.com', |
||||||
|
* ] |
||||||
|
* ~~~ |
||||||
|
*/ |
||||||
|
public $messageConfig = []; |
||||||
|
/** |
||||||
|
* @var string the default class name of the new message instances created by [[createMessage()]] |
||||||
|
*/ |
||||||
|
public $messageClass = 'yii\mail\BaseMessage'; |
||||||
|
|
||||||
|
/** |
||||||
|
* @param array|View $view view instance or its array configuration that will be used to |
||||||
|
* render message bodies. |
||||||
|
* @throws 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 configuration array, "' . gettype($view) . '" given.'); |
||||||
|
} |
||||||
|
$this->_view = $view; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @return 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 View view instance. |
||||||
|
*/ |
||||||
|
protected function createView(array $config) |
||||||
|
{ |
||||||
|
if (!array_key_exists('class', $config)) { |
||||||
|
$config['class'] = View::className(); |
||||||
|
} |
||||||
|
return Yii::createObject($config); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates a new message instance and optionally composes its body content via view rendering. |
||||||
|
* |
||||||
|
* @param string|array $view the view to be used for rendering the message body. This can be: |
||||||
|
* |
||||||
|
* - a string, which represents the view name or path alias for rendering the HTML body of the email. |
||||||
|
* In this case, the text body will be generated by applying `strip_tags()` to the HTML body. |
||||||
|
* - an array with 'html' and/or 'text' elements. The 'html' element refers to the view name or path alias |
||||||
|
* for rendering the HTML body, while 'text' element is for rendering the text body. For example, |
||||||
|
* `['html' => 'contact-html', 'text' => 'contact-text']`. |
||||||
|
* - null, meaning the message instance will be returned without body content. |
||||||
|
* |
||||||
|
* The view to be rendered can be specified in one of the following formats: |
||||||
|
* |
||||||
|
* - path alias (e.g. "@app/mails/contact"); |
||||||
|
* - a relative view name (e.g. "contact"): the actual view file will be resolved by [[findViewFile()]] |
||||||
|
* |
||||||
|
* @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 = []) |
||||||
|
{ |
||||||
|
$message = $this->createMessage(); |
||||||
|
if ($view !== null) { |
||||||
|
$params['message'] = $message; |
||||||
|
if (is_array($view)) { |
||||||
|
if (isset($view['html'])) { |
||||||
|
$html = $this->render($view['html'], $params, $this->htmlLayout); |
||||||
|
} |
||||||
|
if (isset($view['text'])) { |
||||||
|
$text = $this->render($view['text'], $params, $this->textLayout); |
||||||
|
} |
||||||
|
} else { |
||||||
|
$html = $this->render($view, $params, $this->htmlLayout); |
||||||
|
} |
||||||
|
if (isset($html)) { |
||||||
|
$message->setHtmlBody($html); |
||||||
|
} |
||||||
|
if (isset($text)) { |
||||||
|
$message->setTextBody($text); |
||||||
|
} elseif (isset($html)) { |
||||||
|
$message->setTextBody(strip_tags($html)); |
||||||
|
} |
||||||
|
} |
||||||
|
return $message; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates a new message instance. |
||||||
|
* The newly created instance will be initialized with the configuration specified by [[messageConfig]]. |
||||||
|
* If the configuration does not specify a 'class', the [[messageClass]] will be used as the class |
||||||
|
* of the new message instance. |
||||||
|
* @return MessageInterface message instance. |
||||||
|
*/ |
||||||
|
protected function createMessage() |
||||||
|
{ |
||||||
|
$config = $this->messageConfig; |
||||||
|
if (!array_key_exists('class', $config)) { |
||||||
|
$config['class'] = $this->messageClass; |
||||||
|
} |
||||||
|
return Yii::createObject($config); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Sends multiple messages at once. |
||||||
|
* |
||||||
|
* The default implementation simply calls [[send()]] multiple times. |
||||||
|
* Child classes may override this method to implement more efficient way of |
||||||
|
* sending multiple messages. |
||||||
|
* |
||||||
|
* @param array $messages list of email messages, which should be sent. |
||||||
|
* @return integer number of messages that are successfully sent. |
||||||
|
*/ |
||||||
|
public function sendMultiple(array $messages) |
||||||
|
{ |
||||||
|
$successCount = 0; |
||||||
|
foreach ($messages as $message) { |
||||||
|
if ($this->send($message)) { |
||||||
|
$successCount++; |
||||||
|
} |
||||||
|
} |
||||||
|
return $successCount; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Renders the specified view with optional parameters and layout. |
||||||
|
* The view will be rendered using the [[view]] component. |
||||||
|
* @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 or path alias. If false, 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. |
||||||
|
* This method will return the view file by prefixing the view name with [[viewPath]]. |
||||||
|
* @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,59 @@ |
|||||||
|
<?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\Object; |
||||||
|
use Yii; |
||||||
|
|
||||||
|
/** |
||||||
|
* BaseMessage serves as a base class that implements the [[send()]] method required by [[MessageInterface]]. |
||||||
|
* |
||||||
|
* By default, [[send()]] will use the "mail" application component to send the current message. |
||||||
|
* The "mail" application component should be a mailer instance implementing [[MailerInterface]]. |
||||||
|
* |
||||||
|
* @see BaseMailer |
||||||
|
* |
||||||
|
* @property 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 MailerInterface the mailer component |
||||||
|
*/ |
||||||
|
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,64 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* @link http://www.yiiframework.com/ |
||||||
|
* @copyright Copyright (c) 2008 Yii Software LLC |
||||||
|
* @license http://www.yiiframework.com/license/ |
||||||
|
*/ |
||||||
|
|
||||||
|
namespace yii\mail; |
||||||
|
|
||||||
|
/** |
||||||
|
* MailerInterface is the interface that should be implemented by mailer classes. |
||||||
|
* |
||||||
|
* A mailer should mainly support creating and sending [[MessageInterface|mail messages]]. It should |
||||||
|
* also support composition of the message body through the view rendering mechanism. For example, |
||||||
|
* |
||||||
|
* ~~~ |
||||||
|
* Yii::$app->mail->compose('contact/html', ['contactForm' => $form]) |
||||||
|
* ->setFrom('from@domain.com') |
||||||
|
* ->setTo($form->email) |
||||||
|
* ->setSubject($form->subject) |
||||||
|
* ->send(); |
||||||
|
* ~~~ |
||||||
|
* |
||||||
|
* @see MessageInterface |
||||||
|
* |
||||||
|
* @author Paul Klimov <klimov.paul@gmail.com> |
||||||
|
* @since 2.0 |
||||||
|
*/ |
||||||
|
interface MailerInterface |
||||||
|
{ |
||||||
|
/** |
||||||
|
* Creates a new message instance and optionally composes its body content via view rendering. |
||||||
|
* |
||||||
|
* @param string|array $view the view to be used for rendering the message body. This can be: |
||||||
|
* |
||||||
|
* - a string, which represents the view name or path alias for rendering the HTML body of the email. |
||||||
|
* In this case, the text body will be generated by applying `strip_tags()` to the HTML body. |
||||||
|
* - an array with 'html' and/or 'text' elements. The 'html' element refers to the view name or path alias |
||||||
|
* for rendering the HTML body, while 'text' element is for rendering the text body. For example, |
||||||
|
* `['html' => 'contact-html', 'text' => 'contact-text']`. |
||||||
|
* - null, meaning the message instance will be returned without body content. |
||||||
|
* |
||||||
|
* @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 MessageInterface $message email message instance to be sent |
||||||
|
* @return boolean whether the message has been sent successfully |
||||||
|
*/ |
||||||
|
public function send($message); |
||||||
|
|
||||||
|
/** |
||||||
|
* Sends multiple messages at once. |
||||||
|
* |
||||||
|
* This method may be implemented by some mailers which support more efficient way of sending multiple messages in the same batch. |
||||||
|
* |
||||||
|
* @param array $messages list of email messages, which should be sent. |
||||||
|
* @return integer number of messages that are successfully sent. |
||||||
|
*/ |
||||||
|
public function sendMultiple(array $messages); |
||||||
|
} |
@ -0,0 +1,216 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* @link http://www.yiiframework.com/ |
||||||
|
* @copyright Copyright (c) 2008 Yii Software LLC |
||||||
|
* @license http://www.yiiframework.com/license/ |
||||||
|
*/ |
||||||
|
|
||||||
|
namespace yii\mail; |
||||||
|
|
||||||
|
/** |
||||||
|
* MessageInterface is the interface that should be implemented by mail message classes. |
||||||
|
* |
||||||
|
* A message represents the settings and content of an email, such as the sender, recipient, |
||||||
|
* subject, body, etc. |
||||||
|
* |
||||||
|
* Messages are sent by a [[MailerInterface||mailer]], like the following, |
||||||
|
* |
||||||
|
* ~~~ |
||||||
|
* Yii::$app->mail->compose() |
||||||
|
* ->setFrom('from@domain.com') |
||||||
|
* ->setTo($form->email) |
||||||
|
* ->setSubject($form->subject) |
||||||
|
* ->setTextBody('Plain text content') |
||||||
|
* ->setHtmlBody('<b>HTML content</b>') |
||||||
|
* ->send(); |
||||||
|
* ~~~ |
||||||
|
* |
||||||
|
* @see MailerInterface |
||||||
|
* |
||||||
|
* @author Paul Klimov <klimov.paul@gmail.com> |
||||||
|
* @since 2.0 |
||||||
|
*/ |
||||||
|
interface MessageInterface |
||||||
|
{ |
||||||
|
/** |
||||||
|
* Returns the character set of this message. |
||||||
|
* @return string the character set of this message. |
||||||
|
*/ |
||||||
|
public function getCharset(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets the character set of this message. |
||||||
|
* @param string $charset character set name. |
||||||
|
* @return static self reference. |
||||||
|
*/ |
||||||
|
public function setCharset($charset); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the message sender. |
||||||
|
* @return string the sender |
||||||
|
*/ |
||||||
|
public function getFrom(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets the 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 setFrom($from); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the message recipient(s). |
||||||
|
* @return array the message recipients |
||||||
|
*/ |
||||||
|
public function getTo(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets the message recipient(s). |
||||||
|
* @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 setTo($to); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the reply-to address of this message. |
||||||
|
* @return string the reply-to address of this message. |
||||||
|
*/ |
||||||
|
public function getReplyTo(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets the reply-to address of this message. |
||||||
|
* @param string|array $replyTo the reply-to address. |
||||||
|
* You may pass an array of addresses if this message should be replied to multiple people. |
||||||
|
* You may also specify reply-to name in addition to email address using format: |
||||||
|
* `[email => name]`. |
||||||
|
* @return static self reference. |
||||||
|
*/ |
||||||
|
public function setReplyTo($replyTo); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the Cc (additional copy receiver) addresses of this message. |
||||||
|
* @return array the Cc (additional copy receiver) addresses of this message. |
||||||
|
*/ |
||||||
|
public function getCc(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets 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 setCc($cc); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the Bcc (hidden copy receiver) addresses of this message. |
||||||
|
* @return array the Bcc (hidden copy receiver) addresses of this message. |
||||||
|
*/ |
||||||
|
public function getBcc(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets 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 setBcc($bcc); |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the message subject. |
||||||
|
* @return string the message subject |
||||||
|
*/ |
||||||
|
public function getSubject(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets the message subject. |
||||||
|
* @param string $subject message subject |
||||||
|
* @return static self reference. |
||||||
|
*/ |
||||||
|
public function setSubject($subject); |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets message plain text content. |
||||||
|
* @param string $text message plain text content. |
||||||
|
* @return static self reference. |
||||||
|
*/ |
||||||
|
public function setTextBody($text); |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets message HTML content. |
||||||
|
* @param string $html message HTML content. |
||||||
|
* @return static self reference. |
||||||
|
*/ |
||||||
|
public function setHtmlBody($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 whether this message is sent successfully. |
||||||
|
*/ |
||||||
|
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() |
||||||
|
->setCharset($charset) |
||||||
|
->setSubject($subject) |
||||||
|
->setTo($to) |
||||||
|
->setCc($cc) |
||||||
|
->setBcc($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() |
||||||
|
->setFrom($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->setTo($this->testEmailReceiver); |
||||||
|
$message->setFrom('someuser@somedomain.com'); |
||||||
|
$message->setSubject('Yii Swift Test'); |
||||||
|
$message->setTextBody('Yii Swift Test body'); |
||||||
|
$this->assertTrue($message->send()); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @depends testSend |
||||||
|
*/ |
||||||
|
public function testAttachFile() |
||||||
|
{ |
||||||
|
$message = $this->createTestMessage(); |
||||||
|
|
||||||
|
$message->setTo($this->testEmailReceiver); |
||||||
|
$message->setFrom('someuser@somedomain.com'); |
||||||
|
$message->setSubject('Yii Swift Attach File Test'); |
||||||
|
$message->setTextBody('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->setTo($this->testEmailReceiver); |
||||||
|
$message->setFrom('someuser@somedomain.com'); |
||||||
|
$message->setSubject('Yii Swift Create Attachment Test'); |
||||||
|
$message->setTextBody('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->setTo($this->testEmailReceiver); |
||||||
|
$message->setFrom('someuser@somedomain.com'); |
||||||
|
$message->setSubject('Yii Swift Embed File Test'); |
||||||
|
$message->setHtmlBody('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->setTo($this->testEmailReceiver); |
||||||
|
$message->setFrom('someuser@somedomain.com'); |
||||||
|
$message->setSubject('Yii Swift Embed File Test'); |
||||||
|
$message->setHtmlBody('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->setTo($this->testEmailReceiver); |
||||||
|
$message->setFrom('someuser@somedomain.com'); |
||||||
|
$message->setSubject('Yii Swift Alternative Body Test'); |
||||||
|
$message->setHtmlBody('<b>Yii Swift</b> test HTML body'); |
||||||
|
$message->setTextBody('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->setTo($this->testEmailReceiver); |
||||||
|
$message->setFrom('someuser@somedomain.com'); |
||||||
|
$message->setSubject('Yii Swift Alternative Body Test'); |
||||||
|
$message->setTextBody('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,345 @@ |
|||||||
|
<?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 $_replyTo; |
||||||
|
public $_to; |
||||||
|
public $_cc; |
||||||
|
public $_bcc; |
||||||
|
public $_subject; |
||||||
|
public $_textBody; |
||||||
|
public $_htmlBody; |
||||||
|
|
||||||
|
public function getCharset() |
||||||
|
{ |
||||||
|
return $this->_charset; |
||||||
|
} |
||||||
|
|
||||||
|
public function setCharset($charset) |
||||||
|
{ |
||||||
|
$this->_charset = $charset; |
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
public function getFrom() |
||||||
|
{ |
||||||
|
return $this->_from; |
||||||
|
} |
||||||
|
|
||||||
|
public function setFrom($from) |
||||||
|
{ |
||||||
|
$this->_from = $from; |
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
public function getTo() |
||||||
|
{ |
||||||
|
return $this->_to; |
||||||
|
} |
||||||
|
|
||||||
|
public function setTo($to) |
||||||
|
{ |
||||||
|
$this->_to = $to; |
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
public function getCc() |
||||||
|
{ |
||||||
|
return $this->_cc; |
||||||
|
} |
||||||
|
|
||||||
|
public function setCc($cc) |
||||||
|
{ |
||||||
|
$this->_cc = $cc; |
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
public function getBcc() |
||||||
|
{ |
||||||
|
return $this->_bcc; |
||||||
|
} |
||||||
|
|
||||||
|
public function setBcc($bcc) |
||||||
|
{ |
||||||
|
$this->_bcc = $bcc; |
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
public function getSubject() |
||||||
|
{ |
||||||
|
return $this->_subject; |
||||||
|
} |
||||||
|
|
||||||
|
public function setSubject($subject) |
||||||
|
{ |
||||||
|
$this->_subject = $subject; |
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
public function getReplyTo() |
||||||
|
{ |
||||||
|
return $this->_replyTo; |
||||||
|
} |
||||||
|
|
||||||
|
public function setReplyTo($replyTo) |
||||||
|
{ |
||||||
|
$this->_replyTo = $replyTo; |
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
public function setTextBody($text) |
||||||
|
{ |
||||||
|
$this->_textBody = $text; |
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
public function setHtmlBody($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,136 @@ |
|||||||
|
<?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 getCharset() {return '';} |
||||||
|
|
||||||
|
public function setCharset($charset) {} |
||||||
|
|
||||||
|
public function getFrom() {return '';} |
||||||
|
|
||||||
|
public function setFrom($from) {} |
||||||
|
|
||||||
|
public function getReplyTo() {return '';} |
||||||
|
|
||||||
|
public function setReplyTo($replyTo) {} |
||||||
|
|
||||||
|
public function getTo() {return '';} |
||||||
|
|
||||||
|
public function setTo($to) {} |
||||||
|
|
||||||
|
public function getCc() {return '';} |
||||||
|
|
||||||
|
public function setCc($cc) {} |
||||||
|
|
||||||
|
public function getBcc() {return '';} |
||||||
|
|
||||||
|
public function setBcc($bcc) {} |
||||||
|
|
||||||
|
public function getSubject() {return '';} |
||||||
|
|
||||||
|
public function setSubject($subject) {} |
||||||
|
|
||||||
|
public function setTextBody($text) { |
||||||
|
$this->text = $text; |
||||||
|
} |
||||||
|
|
||||||
|
public function setHtmlBody($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