Dmitry Erofeev
11 years ago
4 changed files with 217 additions and 2 deletions
@ -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; |
||||
} |
||||
} |
@ -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') |
||||
); |
||||
} |
||||
} |
||||
|
Loading…
Reference in new issue