Commit 5d679813 by Alexander Makarov

Merge pull request #1167 from dmeroff/filemailer

Added FileMailer implementation of mailer interface
parents 3bda94ee 7d6d01b4
<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace yii\swiftmailer;
use yii\helpers\FileHelper;
use yii\mail\BaseMailer;
use Yii;
/**
* FileMailer implements a mailer that saves mails as files under runtime directory.
*
* To use FileMailer, you should configure it in the application configuration like the following,
*
* ~~~
* 'components' => array(
* ...
* 'email' => array(
* 'class' => 'yii\swiftmailer\FileMailer'
* ),
* ...
* ),
* ~~~
*
* 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();
* ~~~
*
* @author Dmitry Erofeev <dmeroff@gmail.com>
* @since 2.0
*/
class FileMailer extends BaseMailer
{
/**
* @var string message default class name.
*/
public $messageClass = 'yii\swiftmailer\Message';
/**
* @var string The path under which mail files will be written. Defaults to "@app/runtime/mail".
*/
protected $path;
/**
* @var callable Callback that will be used to generate name of the message to save.
*/
protected $callback;
/**
* Sets path under which mail files will be written.
* Any trailing '/' and '\' characters in the given path will be trimmed.
*
* @param $path
* @throws \InvalidArgumentException
*/
public function setPath($path)
{
$path = Yii::getAlias($path);
if (!is_dir($path) || !is_writable($path)) {
throw new \InvalidArgumentException('Filemailer::setPath expects a valid path in which to write mail files');
}
$this->path = rtrim($path, '\\/');
}
/**
* Gets path under which mail files will be written.
*
* @return string
*/
public function getPath()
{
if ($this->path == null) {
$path = Yii::getAlias('@app/runtime/mail');
if (!is_dir($path)) {
FileHelper::createDirectory($path);
}
$this->setPath($path);
}
return $this->path;
}
/**
* Sets callback that will be used to generate name of the message to save.
*
* @param callable $callback
*/
public function setCallback(callable $callback)
{
$this->callback = $callback;
}
/**
* Gets callback that will be used to generate name of the message to save.
*
* @return callable
*/
public function getCallback()
{
if ($this->callback == null) {
$this->setCallback(function () {
return uniqid('Message_') . '.txt';
});
}
return $this->callback;
}
/**
* @inheritdoc
*/
public function send($message)
{
$address = $message->getTo();
if (is_array($address)) {
$address = implode(', ', array_keys($address));
}
Yii::trace('Sending email "' . $message->getSubject() . '" to "' . $address . '"', __METHOD__);
$filename = $this->getPath() . DIRECTORY_SEPARATOR . call_user_func($this->getCallback());
return file_put_contents($filename, $message->toString()) !== false;
}
}
\ No newline at end of file
...@@ -16,6 +16,20 @@ return [ ...@@ -16,6 +16,20 @@ return [
]; ];
``` ```
Extension also includes `FileMailer` that saves mails as files under runtime directory.
It can be useful during development. To use it add the following code in your application configuration:
```php
return [
//....
'components' => [
'mail' => [
'class' => 'yii\swiftmailer\FileMailer',
],
],
];
```
You can then send an email as follows: You can then send an email as follows:
```php ```php
......
...@@ -15,6 +15,10 @@ ...@@ -15,6 +15,10 @@
{ {
"name": "Paul Klimov", "name": "Paul Klimov",
"email": "klimov.paul@gmail.com" "email": "klimov.paul@gmail.com"
},
{
"name": "Dmitry Erofeev",
"email": "dmeroff@gmail.com"
} }
], ],
"minimum-stability": "dev", "minimum-stability": "dev",
......
<?php
namespace yiiunit\extensions\swiftmailer;
require __DIR__ . '/../../../../extensions/swiftmailer/FileMailer.php';
use yii\swiftmailer\FileMailer;
use yiiunit\VendorTestCase;
/**
* @group vendor
* @group mail
* @group swiftmailer
*/
class FileMailerTest extends VendorTestCase
{
public function setUp()
{
$this->mockApplication([
'components' => [
'mail' => $this->createTestEmailComponent()
]
]);
}
/**
* @return FileMailer test email component instance.
*/
protected function createTestEmailComponent()
{
$component = new FileMailer([
'callback' => function () {
return 'Message_test.txt';
}
]);
return $component;
}
public function testConfigurePath()
{
$mailer = new FileMailer();
$this->assertEquals(\Yii::getAlias('@app/runtime/mail'), $mailer->getPath());
$mailer->setPath('@yiiunit/runtime/');
$this->assertEquals(\Yii::getAlias('@yiiunit/runtime'), $mailer->getPath());
}
public function testSend()
{
$message = \Yii::$app->mail->compose()
->setTo('tester@example.com')
->setFrom('admin@example.com')
->setSubject('Just a test')
->setHtmlBody('This is html body');
$message->send();
$this->assertEquals(
$message->toString(),
file_get_contents(\Yii::$app->getRuntimePath() . '/mail/Message_test.txt')
);
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment