You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
3.0 KiB
135 lines
3.0 KiB
<?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; |
|
} |
|
} |