mirror of
https://github.com/yiisoft/yii2.git
synced 2025-11-11 19:20:01 +08:00
added FileMailer implementation of mailer interface
This commit is contained in:
135
extensions/swiftmailer/FileMailer.php
Normal file
135
extensions/swiftmailer/FileMailer.php
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
<?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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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 @@
|
|||||||
{
|
{
|
||||||
"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",
|
||||||
|
|||||||
62
tests/unit/extensions/swiftmailer/FileMailerTest.php
Normal file
62
tests/unit/extensions/swiftmailer/FileMailerTest.php
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
<?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')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user