From 6259159792e13ec93002d55e3c4b045c4df511ff Mon Sep 17 00:00:00 2001 From: Shivam Chandra <56137963+ShivamChandra09@users.noreply.github.com> Date: Sat, 25 Jul 2026 13:07:02 +0530 Subject: [PATCH] feat: add SparkPost email adapter --- .../Messaging/Adapter/Email/SparkPost.php | 74 +++++++++++++++++++ tests/e2e/Email/SparkPostTest.php | 25 +++++++ 2 files changed, 99 insertions(+) create mode 100644 src/Utopia/Messaging/Adapter/Email/SparkPost.php create mode 100644 tests/e2e/Email/SparkPostTest.php diff --git a/src/Utopia/Messaging/Adapter/Email/SparkPost.php b/src/Utopia/Messaging/Adapter/Email/SparkPost.php new file mode 100644 index 00000000..2ef0a0d9 --- /dev/null +++ b/src/Utopia/Messaging/Adapter/Email/SparkPost.php @@ -0,0 +1,74 @@ +isEu ? $euDomain : $usDomain; + + $response = new Response($this->getType()); + $result = $this->request( + method: 'POST', + url: "https://$domain/api/v1/transmissions", + headers: [ + 'Authorization: ' . $this->apiKey, + 'Content-Type: application/json', + ], + body: [ + 'options' => [ + 'sandbox' => false, + ], + 'recipients' => [ + [ + 'address' => [ + 'email' => $message->getTo()[0], + ], + ], + ], + 'content' => [ + 'from' => [ + 'email' => $message->getFrom(), + ], + 'subject' => $message->getSubject(), + 'html' => $message->isHtml() ? $message->getContent() : null, + 'text' => $message->isHtml() ? null : $message->getContent(), + ], + ], + ); + + if ($result['statusCode'] >= 200 && $result['statusCode'] < 300) { + $response->addResult($message->getTo()[0]); + } else { + $error = $result['response']['errors'][0]['message'] ?? $result['error'] ?? 'Unknown error'; + $response->addResult($message->getTo()[0], $error); + } + + return $response->toArray(); + } +} diff --git a/tests/e2e/Email/SparkPostTest.php b/tests/e2e/Email/SparkPostTest.php new file mode 100644 index 00000000..e7f3d08b --- /dev/null +++ b/tests/e2e/Email/SparkPostTest.php @@ -0,0 +1,25 @@ +send($message); + + $this->assertResponse($response); + } +}