diff --git a/src/Mailer/Adapters/ResendAdapter.php b/src/Mailer/Adapters/ResendAdapter.php new file mode 100644 index 00000000..d66c7b5d --- /dev/null +++ b/src/Mailer/Adapters/ResendAdapter.php @@ -0,0 +1,102 @@ + + * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) + * @link http://quantum.softberg.org/ + * @since 3.0.0 + */ + +namespace Quantum\Mailer\Adapters; + +use Quantum\Mailer\Contracts\MailerInterface; +use Quantum\Mailer\Traits\MailerTrait; +use Quantum\HttpClient\HttpClient; +use Exception; + +/** + * class ResendAdapter + * @package Quantum\Mailer + */ +class ResendAdapter implements MailerInterface +{ + use MailerTrait; + + public string $name = 'Resend'; + + /** + * @var string|null + */ + private $apiKey; + + private string $apiUrl = 'https://api.resend.com/emails'; + + /** + * @var array + */ + private array $data = []; + + /** + * ResendAdapter constructor + * @param array $params + */ + public function __construct(array $params) + { + $this->httpClient = new HttpClient(); + $this->apiKey = $params['api_key']; + } + + /** + * Prepares the data + */ + private function prepare(): void + { + $fromName = $this->from['name'] ?? null; + + $this->data['from'] = $fromName + ? $fromName . ' <' . $this->from['email'] . '>' + : $this->from['email']; + + $this->data['to'] = array_column($this->addresses, 'email'); + + if ($this->subject) { + $this->data['subject'] = $this->subject; + } + + if ($this->message) { + if ($this->templatePath) { + $body = $this->createFromTemplate(); + } else { + $body = is_array($this->message) ? implode('', $this->message) : $this->message; + } + + $this->data['html'] = trim(str_replace(["\n", "\r"], '', $body)); + } + } + + private function sendEmail(): bool + { + try { + $this->httpClient + ->createRequest($this->apiUrl) + ->setMethod('POST') + ->setHeaders([ + 'Authorization' => 'Bearer ' . $this->apiKey, + 'Content-Type' => 'application/json', + ]) + ->setData(json_encode($this->data)) + ->start(); + + return true; + } catch (Exception $e) { + return false; + } + } +} diff --git a/src/Mailer/Enums/MailerType.php b/src/Mailer/Enums/MailerType.php index 9f4e4b47..4cd538a8 100644 --- a/src/Mailer/Enums/MailerType.php +++ b/src/Mailer/Enums/MailerType.php @@ -33,6 +33,8 @@ final class MailerType public const SENDINBLUE = 'sendinblue'; + public const RESEND = 'resend'; + private function __construct() { } diff --git a/src/Mailer/Factories/MailerFactory.php b/src/Mailer/Factories/MailerFactory.php index dfd8a26e..70a43c6b 100644 --- a/src/Mailer/Factories/MailerFactory.php +++ b/src/Mailer/Factories/MailerFactory.php @@ -24,6 +24,7 @@ use Quantum\Mailer\Adapters\MailgunAdapter; use Quantum\App\Exceptions\BaseException; use Quantum\Mailer\Adapters\SmtpAdapter; +use Quantum\Mailer\Adapters\ResendAdapter; use Quantum\Di\Exceptions\DiException; use Quantum\Mailer\Enums\MailerType; use Quantum\Mailer\Mailer; @@ -45,6 +46,7 @@ class MailerFactory MailerType::MANDRILL => MandrillAdapter::class, MailerType::SENDGRID => SendgridAdapter::class, MailerType::SENDINBLUE => SendinblueAdapter::class, + MailerType::RESEND => ResendAdapter::class, ]; /** diff --git a/tests/Unit/Mailer/Adapters/ResendAdapterTest.php b/tests/Unit/Mailer/Adapters/ResendAdapterTest.php new file mode 100644 index 00000000..467f70a7 --- /dev/null +++ b/tests/Unit/Mailer/Adapters/ResendAdapterTest.php @@ -0,0 +1,37 @@ +adapter = new ResendAdapter(['api_key' => 'xxx111222333']); + } + + public function testResendAdapterInstance(): void + { + $this->assertInstanceOf(ResendAdapter::class, $this->adapter); + + $this->assertInstanceOf(MailerInterface::class, $this->adapter); + } + + public function testResendAdapterSend(): void + { + $this->adapter->setFrom('john@hotmail.com', 'John Doe'); + + $this->adapter->setAddress('benny@gmail.com', 'Benny'); + + $this->adapter->setSubject('Lorem'); + + $this->adapter->setBody('Lorem ipsum dolor sit amet'); + + $this->assertTrue($this->adapter->send()); + } +} diff --git a/tests/Unit/Mailer/Factories/MailerFactoryTest.php b/tests/Unit/Mailer/Factories/MailerFactoryTest.php index ea94894e..9ad9111e 100644 --- a/tests/Unit/Mailer/Factories/MailerFactoryTest.php +++ b/tests/Unit/Mailer/Factories/MailerFactoryTest.php @@ -7,6 +7,7 @@ use Quantum\Mailer\Adapters\MandrillAdapter; use Quantum\Mailer\Adapters\SendgridAdapter; use Quantum\Mailer\Adapters\MailgunAdapter; +use Quantum\Mailer\Adapters\ResendAdapter; use Quantum\Mailer\Factories\MailerFactory; use Quantum\Mailer\Adapters\SmtpAdapter; use Quantum\Mailer\Enums\MailerType; @@ -76,6 +77,13 @@ public function testMailerFactoryGetSendinblueAdapter(): void $this->assertInstanceOf(SendinblueAdapter::class, $mailer->getAdapter()); } + public function testMailerFactoryGetResendAdapter(): void + { + $mailer = MailerFactory::get(MailerType::RESEND); + + $this->assertInstanceOf(ResendAdapter::class, $mailer->getAdapter()); + } + public function testMailerFactoryGetInvalidTypeAdapter(): void { $this->expectException(MailerException::class); diff --git a/tests/Unit/Mailer/Helpers/MailerHelperFunctionsTest.php b/tests/Unit/Mailer/Helpers/MailerHelperFunctionsTest.php index eae56d47..cdac3983 100644 --- a/tests/Unit/Mailer/Helpers/MailerHelperFunctionsTest.php +++ b/tests/Unit/Mailer/Helpers/MailerHelperFunctionsTest.php @@ -6,6 +6,7 @@ use Quantum\Mailer\Adapters\SendgridAdapter; use Quantum\Mailer\Adapters\MandrillAdapter; use Quantum\Mailer\Adapters\MailgunAdapter; +use Quantum\Mailer\Adapters\ResendAdapter; use Quantum\Mailer\Adapters\SmtpAdapter; use Quantum\Mailer\Enums\MailerType; use Quantum\Tests\Unit\AppTestCase; @@ -66,4 +67,13 @@ public function testMailerHelperGetSendinblueAdapter(): void $this->assertInstanceOf(SendinblueAdapter::class, $mailer->getAdapter()); } + + public function testMailerHelperGetResendAdapter(): void + { + $mailer = mailer(MailerType::RESEND); + + $this->assertInstanceOf(Mailer::class, $mailer); + + $this->assertInstanceOf(ResendAdapter::class, $mailer->getAdapter()); + } } diff --git a/tests/_root/shared/config/mailer.php b/tests/_root/shared/config/mailer.php index b1e028a0..87b0fc3a 100644 --- a/tests/_root/shared/config/mailer.php +++ b/tests/_root/shared/config/mailer.php @@ -25,6 +25,10 @@ 'api_key' => 'mandrill_api_key', ], + 'resend' => [ + 'api_key' => 'resend_api_key', + ], + 'mailgun' => [ 'api_key' => 'mailgun_api_key', 'domain' => 'mailgun_domain',