From 7169d3db5df0e50d1ab02d19bd3f52ec4544e6ef Mon Sep 17 00:00:00 2001 From: Paul Klimov Date: Tue, 9 Apr 2024 18:50:47 +0300 Subject: [PATCH] initial commit --- .gitattributes | 9 +++ .github/FUNDING.yml | 4 ++ .github/ISSUE_TEMPLATE.md | 14 ++++ .github/PULL_REQUEST_TEMPLATE.md | 7 ++ .github/workflows/build.yml | 31 +++++++++ .gitignore | 35 ++++++++++ CHANGELOG.md | 7 ++ LICENSE.md | 32 +++++++++ README.md | 41 ++++++++++++ composer.json | 40 +++++++++++ phpunit.xml.dist | 15 +++++ src/Mailer.php | 111 +++++++++++++++++++++++++++++++ src/TemplatedEmail.php | 14 ++++ src/ViewRenderer.php | 18 +++++ tests/MailerTest.php | 57 ++++++++++++++++ tests/TestCase.php | 57 ++++++++++++++++ tests/bootstrap.php | 14 ++++ 17 files changed, 506 insertions(+) create mode 100644 .gitattributes create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/build.yml create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 composer.json create mode 100644 phpunit.xml.dist create mode 100644 src/Mailer.php create mode 100644 src/TemplatedEmail.php create mode 100644 src/ViewRenderer.php create mode 100644 tests/MailerTest.php create mode 100644 tests/TestCase.php create mode 100644 tests/bootstrap.php 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 @@ +