array( * ... * 'email' => array( * 'class' => 'yii\email\swift\Mailer', * 'transport' => [ * 'class' => 'Swift_SmtpTransport', * 'host' => 'localhost', * 'username' => 'username', * 'password' => 'password', * 'port' => '587', * 'encryption' => 'tls', * ], * ), * ... * ), * ~~~ * * @see http://swiftmailer.org * * @author Paul Klimov * @since 2.0 */ class Mailer extends BaseMailer { /** * @var string|callback SwiftMailer autoloader callback or path to autoloader file. * If the SwiftMailer classes autoloading is already managed in some other place, * for example via Composer, you should leave this field blank. */ public $autoload; /** * @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 \yii\base\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 init() { $this->setupSwiftMailerAutoload(); } /** * Sets up the SwiftMailer autoloader, if it is specified. */ protected function setupSwiftMailerAutoload() { if (!class_exists('Swift', false)) { if (empty($this->autoload)) { $this->autoload = __DIR__ . '/autoload.php'; } if (is_string($this->autoload)) { if (file_exists($this->autoload)) { require_once($this->autoload); } elseif (function_exists($this->autoload)) { spl_autoload_register($this->autoload); } else { throw new InvalidConfigException('"' . get_class($this) . '::autoload" value "' . $this->autoload . '" is invalid: no such function or file exists.'); } } else { spl_autoload_register($this->autoload); } } } /** * @inheritdoc */ public function send($message) { 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 (array_key_exists('class', $config)) { $className = $config['class']; unset($config['class']); } else { $className = 'Swift_MailTransport'; } $transport = call_user_func([$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; } /** * Creates the Swift email message instance. * @return \Swift_Message email message instance. */ public function createSwiftMessage() { return new \Swift_Message(); } }