diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..b3d9906
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,9 @@
+# Ignore all test and documentation for archive
+/.github export-ignore
+/.gitattributes export-ignore
+/.gitignore export-ignore
+/.scrutinizer.yml export-ignore
+/.travis.yml export-ignore
+/phpunit.xml.dist export-ignore
+/tests export-ignore
+/docs export-ignore
\ No newline at end of file
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000..99679ca
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,4 @@
+# These are supported funding model platforms
+
+github: [klimov-paul]
+patreon: klimov_paul
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 0000000..2cc6439
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,14 @@
+### What steps will reproduce the problem?
+
+### What is the expected result?
+
+### What do you get instead?
+
+### Additional info
+
+| Q | A
+|-----------------------| ---
+| This Package Version | 1.?.?
+| Yii Framework Version | 1.1.?
+| PHP version |
+| Operating system |
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..f4af2f3
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,7 @@
+| Q | A
+| ------------- | ---
+| Is bugfix? | ✔️/❌
+| New feature? | ✔️/❌
+| Breaks BC? | ✔️/❌
+| Tests pass? | ✔️/❌
+| Fixed issues | comma-separated list of tickets # fixed by the PR, if any
\ No newline at end of file
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..fd0199b
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,31 @@
+name: build
+
+on: [push, pull_request]
+
+jobs:
+ phpunit:
+ name: PHP ${{ matrix.php }} on ${{ matrix.os }}
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [ubuntu-latest]
+ php: ['7.1', '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3']
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+
+ - name: Install PHP
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: ${{ matrix.php }}
+ extensions: mbstring
+ tools: composer:v2
+ coverage: none
+
+ - name: Install dependencies
+ run: |
+ composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi
+ - name: Run unit tests
+ run: vendor/bin/phpunit --colors=always
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..304f7c8
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,35 @@
+# phpstorm project files
+.idea
+
+# netbeans project files
+nbproject
+
+# zend studio for eclipse project files
+.buildpath
+.project
+.settings
+
+# windows thumbnail cache
+Thumbs.db
+
+# composer vendor dir
+/vendor
+
+/composer.lock
+
+# composer itself is not needed
+composer.phar
+
+# Mac DS_Store Files
+.DS_Store
+
+# phpunit itself is not needed
+phpunit.phar
+# local phpunit config
+/phpunit.xml
+# phpunit cache
+.phpunit.result.cache
+
+# test runtime files
+/.phpunit.cache
+/tests/runtime
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..48f3a3e
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,7 @@
+Yii1 Symfony Mailer extension
+=============================
+
+1.0.0 Under Development
+-----------------------
+
+- Initial release.
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 0000000..e641e6f
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,32 @@
+This is free software. It is released under the terms of the
+following BSD License.
+
+Copyright © 2023 by Yii1Tech (https://github.com/yii1tech)
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Yii1Tech nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..a79723b
--- /dev/null
+++ b/README.md
@@ -0,0 +1,41 @@
+
+
+
+
+
Symfony Mailer Extension for Yii 1
+
+
+
+This extension provides integration of [Symfony Mailer](https://symfony.com/doc/current/mailer.html) in the Yii1 application.
+
+For license information check the [LICENSE](LICENSE.md)-file.
+
+[![Latest Stable Version](https://img.shields.io/packagist/v/yii1tech/mailer.svg)](https://packagist.org/packages/yii1tech/mailer)
+[![Total Downloads](https://img.shields.io/packagist/dt/yii1tech/mailer.svg)](https://packagist.org/packages/yii1tech/mailer)
+[![Build Status](https://github.com/yii1tech/mailer/workflows/build/badge.svg)](https://github.com/yii1tech/mailer/actions)
+
+
+Installation
+------------
+
+The preferred way to install this extension is through [composer](http://getcomposer.org/download/).
+
+Either run
+
+```
+php composer.phar require --prefer-dist yii1tech/mailer
+```
+
+or add
+
+```json
+"yii1tech/mailer": "*"
+```
+
+to the "require" section of your composer.json.
+
+
+Usage
+-----
+
+This extension
\ No newline at end of file
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000..5b8c6b3
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,40 @@
+{
+ "name": "yii1tech/mailer",
+ "description": "Provides integration of Symfony Mailer in the Yii1 application",
+ "keywords": ["yii1", "mailer", "mail", "email", "template", "symfony"],
+ "license": "BSD-3-Clause",
+ "support": {
+ "issues": "https://github.com/yii1tech/mailer/issues",
+ "wiki": "https://github.com/yii1tech/mailer/wiki",
+ "source": "https://github.com/yii1tech/mailer"
+ },
+ "authors": [
+ {
+ "name": "Paul Klimov",
+ "email": "klimov.paul@gmail.com"
+ }
+ ],
+ "require": {
+ "php": ">=7.1",
+ "yiisoft/yii": "~1.1.0",
+ "symfony/mailer": ">=4.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0 || ^7.0 || ^8.0 || ^9.3 || ^10.0.7"
+ },
+ "autoload": {
+ "psr-4": {
+ "yii1tech\\mailer\\": "src"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "yii1tech\\mailer\\test\\": "tests"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ }
+}
\ No newline at end of file
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
new file mode 100644
index 0000000..1dc5e87
--- /dev/null
+++ b/phpunit.xml.dist
@@ -0,0 +1,15 @@
+
+
+
+
+ ./tests
+
+
+
diff --git a/src/Mailer.php b/src/Mailer.php
new file mode 100644
index 0000000..a9e2b5b
--- /dev/null
+++ b/src/Mailer.php
@@ -0,0 +1,111 @@
+
+ * @since 1.0
+ */
+class Mailer extends CApplicationComponent
+{
+ /**
+ * @var string the DSN string for the mail transport creation.
+ * For example:
+ *
+ * - 'smtp://user:pass@smtp.example.com:25'
+ * - 'sendmail://default'
+ *
+ * Note: this property will have no effect in case {@see $transport} property is explicitly set.
+ */
+ public $dsn;
+
+ /**
+ * @var \Symfony\Component\Mailer\Mailer Swift mailer instance.
+ */
+ private $_symfonyMailer;
+ /**
+ * @var \Symfony\Component\Mailer\Transport\TransportInterface|\Closure|string|null transport instance or its class name or factory PHP callback.
+ */
+ private $_transport;
+
+ public function send(RawMessage $message, ?Envelope $envelope = null): void
+ {
+ $this->getSymfonyMailer()->send($message, $envelope);
+ }
+
+ public function setSymfonyMailer(?SymfonyMailer $symfonyMailer): self
+ {
+ $this->_symfonyMailer = $symfonyMailer;
+
+ return $this;
+ }
+
+ public function getSymfonyMailer(): SymfonyMailer
+ {
+ if ($this->_symfonyMailer === null) {
+ $this->_symfonyMailer = $this->createSymfonyMailer();
+ }
+
+ return $this->_symfonyMailer;
+ }
+
+ protected function createSymfonyMailer(): SymfonyMailer
+ {
+ return new SymfonyMailer($this->getTransport());
+ }
+
+ /**
+ * @param \Symfony\Component\Mailer\Transport\TransportInterface|\Closure|string|null $transport transport instance or its class name or factory PHP callback.
+ * @return static self reference.
+ */
+ public function setTransport($transport): self
+ {
+ $this->_transport = $transport;
+
+ return $this;
+ }
+
+ /**
+ * @return \Symfony\Component\Mailer\Transport\TransportInterface mail transport instance.
+ */
+ public function getTransport(): TransportInterface
+ {
+ if (empty($this->_transport)) {
+ if (empty($this->dsn)) {
+ throw new \LogicException('Either "' . get_class($this) . '::$dsn" or "' . get_class($this) . '::$transport" property should be set.');
+ }
+
+ $this->_transport = Transport::fromDsn($this->dsn);
+
+ return $this->_transport;
+ }
+
+ if (!is_object($this->_transport) || $this->_transport instanceof \Closure) {
+ $this->_transport = $this->createTransport($this->_transport);
+ }
+
+ return $this->_transport;
+ }
+
+ protected function createTransport($config): TransportInterface
+ {
+ if (is_callable($config)) {
+ return call_user_func($config);
+ }
+
+ if (is_string($config)) {
+ return new $config;
+ }
+
+ throw new \LogicException('Transport configuration should be either a factory callback or a string class name.');
+ }
+}
\ No newline at end of file
diff --git a/src/TemplatedEmail.php b/src/TemplatedEmail.php
new file mode 100644
index 0000000..75ad5b9
--- /dev/null
+++ b/src/TemplatedEmail.php
@@ -0,0 +1,14 @@
+
+ * @since 1.0
+ */
+class TemplatedEmail extends Email
+{
+
+}
\ No newline at end of file
diff --git a/src/ViewRenderer.php b/src/ViewRenderer.php
new file mode 100644
index 0000000..a6dfd60
--- /dev/null
+++ b/src/ViewRenderer.php
@@ -0,0 +1,18 @@
+
+ * @since 1.0
+ */
+class ViewRenderer extends \CBaseController
+{
+ /**
+ * {@inheritDoc}
+ */
+ public function getViewFile($viewName)
+ {
+ // TODO: Implement getViewFile() method.
+ }
+}
\ No newline at end of file
diff --git a/tests/MailerTest.php b/tests/MailerTest.php
new file mode 100644
index 0000000..94be9bf
--- /dev/null
+++ b/tests/MailerTest.php
@@ -0,0 +1,57 @@
+ Mailer::class,
+ 'dsn' => 'smtp://user:pass@smtp.example.com:25',
+ ]);
+
+ $this->assertTrue($mailer->getTransport() instanceof SmtpTransport);
+ }
+
+ public function testCreateTransportFromClassName(): void
+ {
+ /** @var Mailer $mailer */
+ $mailer = Yii::createComponent([
+ 'class' => Mailer::class,
+ 'transport' => NullTransport::class,
+ ]);
+
+ $this->assertTrue($mailer->getTransport() instanceof NullTransport);
+ }
+
+ public function testCreateTransportFromCallable(): void
+ {
+ /** @var Mailer $mailer */
+ $mailer = Yii::createComponent([
+ 'class' => Mailer::class,
+ 'transport' => function () {
+ return new NullTransport();
+ },
+ ]);
+
+ $this->assertTrue($mailer->getTransport() instanceof NullTransport);
+ }
+
+ public function testSetupSymfonyMailer(): void
+ {
+ $mailer = new Mailer();
+
+ $symfonyMailer = new SymfonyMailer(new NullTransport());
+
+ $mailer->setSymfonyMailer($symfonyMailer);
+ $this->assertSame($symfonyMailer, $mailer->getSymfonyMailer());
+ }
+}
\ No newline at end of file
diff --git a/tests/TestCase.php b/tests/TestCase.php
new file mode 100644
index 0000000..064e1fd
--- /dev/null
+++ b/tests/TestCase.php
@@ -0,0 +1,57 @@
+mockApplication();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function tearDown(): void
+ {
+ $this->destroyApplication();
+ }
+
+ /**
+ * Populates Yii::app() with a new application
+ * The application will be destroyed on tearDown() automatically.
+ * @param array $config The application configuration, if needed
+ * @param string $appClass name of the application class to create
+ */
+ protected function mockApplication($config = [], $appClass = CConsoleApplication::class)
+ {
+ Yii::setApplication(null);
+
+ new $appClass(CMap::mergeArray([
+ 'id' => 'testapp',
+ 'basePath' => __DIR__,
+ 'components' => [
+ 'cache' => [
+ 'class' => \CDummyCache::class,
+ ],
+ ],
+ ], $config));
+ }
+
+ /**
+ * Destroys Yii application by setting it to null.
+ */
+ protected function destroyApplication()
+ {
+ Yii::setApplication(null);
+ }
+}
\ No newline at end of file
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
new file mode 100644
index 0000000..f238b2d
--- /dev/null
+++ b/tests/bootstrap.php
@@ -0,0 +1,14 @@
+