<?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */ namespace yii\swiftmailer; use Yii; use yii\base\InvalidConfigException; use yii\mail\BaseMailer; /** * Mailer implements a mailer based on SwiftMailer. * * To use Mailer, you should configure it in the application configuration like the following, * * ~~~ * 'components' => [ * ... * 'mail' => [ * 'class' => 'yii\swiftmailer\Mailer', * 'transport' => [ * 'class' => 'Swift_SmtpTransport', * 'host' => 'localhost', * 'username' => 'username', * 'password' => 'password', * 'port' => '587', * 'encryption' => 'tls', * ], * ], * ... * ], * ~~~ * * You may also skip the configuration of the [[transport]] property. In that case, the default * PHP `mail()` function will be used to send emails. * * You specify the transport constructor arguments using 'constructArgs' key in the config. * You can also specify the list of plugins, which should be registered to the transport using * 'plugins' key. For example: * * ~~~ * 'transport' => [ * 'class' => 'Swift_SmtpTransport', * 'constructArgs' => ['localhost', 25] * 'plugins' => [ * [ * 'class' => 'Swift_Plugins_ThrottlerPlugin', * 'constructArgs' => [20], * ], * ], * ], * ~~~ * * 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(); * ~~~ * * @see http://swiftmailer.org * * @property array|\Swift_Mailer $swiftMailer Swift mailer instance or array configuration. This property is * read-only. * @property array|\Swift_Transport $transport This property is read-only. * * @author Paul Klimov <klimov.paul@gmail.com> * @since 2.0 */ class Mailer extends BaseMailer { /** * @var string message default class name. */ public $messageClass = 'yii\swiftmailer\Message'; /** * @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 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 */ protected function sendMessage($message) { $address = $message->getTo(); if (is_array($address)) { $address = implode(', ', array_keys($address)); } Yii::info('Sending email "' . $message->getSubject() . '" to "' . $address . '"', __METHOD__); 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 (!isset($config['class'])) { $config['class'] = 'Swift_MailTransport'; } if (isset($config['plugins'])) { $plugins = $config['plugins']; unset($config['plugins']); } /** @var \Swift_MailTransport $transport */ $transport = $this->createSwiftObject($config); if (isset($plugins)) { foreach ($plugins as $plugin) { if (is_array($plugin) && isset($plugin['class'])) { $plugin = $this->createSwiftObject($plugin); } $transport->registerPlugin($plugin); } } return $transport; } /** * Creates Swift library object, from given array configuration. * @param array $config object configuration * @return Object created object * @throws \yii\base\InvalidConfigException on invalid configuration. */ protected function createSwiftObject(array $config) { if (isset($config['class'])) { $className = $config['class']; unset($config['class']); } else { throw new InvalidConfigException('Object configuration must be an array containing a "class" element.'); } if (isset($config['constructArgs'])) { $args = []; foreach ($config['constructArgs'] as $arg) { if (is_array($arg) && isset($arg['class'])) { $args[] = $this->createSwiftObject($arg); } else { $args[] = $arg; } } unset($config['constructArgs']); $object = Yii::createObject($className, $args); } else { $object = Yii::createObject($className); } if (!empty($config)) { foreach ($config as $name => $value) { if (property_exists($object, $name)) { $object->$name = $value; } else { $setter = 'set' . $name; if (method_exists($object, $setter) || method_exists($object, '__call')) { $object->$setter($value); } else { throw new InvalidConfigException('Setting unknown property: ' . $className . '::' . $name); } } } } return $object; } }