Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
64 / 64
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
Ses
100.00% covered (success)
100.00%
64 / 64
100.00% covered (success)
100.00%
2 / 2
20
100.00% covered (success)
100.00%
1 / 1
 createClient
100.00% covered (success)
100.00%
15 / 15
100.00% covered (success)
100.00%
1 / 1
4
 send
100.00% covered (success)
100.00%
49 / 49
100.00% covered (success)
100.00%
1 / 1
16
1<?php
2declare(strict_types=1);
3/**
4 * Pop PHP Framework (https://www.popphp.org/)
5 *
6 * @link       https://github.com/popphp/popphp-framework
7 * @author     Nick Sagona, III <dev@noladev.com>
8 * @copyright  Copyright (c) 2009-2027 NOLA Interactive, LLC.
9 * @license    https://www.popphp.org/license     New BSD License
10 */
11
12/**
13 * @namespace
14 */
15namespace Pop\Mail\Transport;
16
17use Pop\Http\Client;
18use Pop\Mail\Api\AbstractHttp;
19use Pop\Mail\Message;
20use Aws\Ses\SesClient;
21use Pop\Mail\Message\Attachment;
22use Pop\Mail\Message\Html;
23use Pop\Mail\Message\Text;
24
25/**
26 * Mailgun API transport class
27 *
28 * @category   Pop
29 * @package    Pop\Mail
30 * @author     Nick Sagona, III <dev@noladev.com>
31 * @copyright  Copyright (c) 2009-2027 NOLA Interactive, LLC.
32 * @license    https://www.popphp.org/license     New BSD License
33 * @version    5.0.0
34 */
35class Ses extends AbstractHttp implements TransportInterface
36{
37
38    /**
39     * Create the API client
40     *
41     * @param  array|string $options
42     * @throws Exception|\Pop\Mail\Api\Exception
43     * @return Ses
44     */
45    public function createClient(array|string $options): Ses
46    {
47        if (is_string($options)) {
48            $options = $this->parseOptions($options);
49        }
50
51        $key    = $options['key'] ?? null;
52        $secret = $options['secret'] ?? null;
53
54        if (($key === null) || ($secret === null)) {
55            throw new Exception('Error: The required credentials to create the client object are missing.');
56        }
57
58        $this->client = new SesClient([
59            'credentials' => [
60                'key'     => $key,
61                'secret'  => $secret
62            ],
63            'version' => 'latest',
64            'region'  => $options['region'] ?? 'us-east-1'
65        ]);
66
67        return $this;
68    }
69
70    /**
71     * Send the message
72     *
73     * @param  Message $message
74     * @return mixed
75     */
76    public function send(Message $message): mixed
77    {
78        if ($message->hasAttachments()) {
79            return $this->client->sendRawEmail([
80                'RawMessage' => [
81                    'Data' => $message->render()
82                ]
83            ]);
84        } else {
85            $parts       = $message->getParts();
86            $messageData = [
87                'Destination' => [
88                    'ToAddresses' => []
89                ],
90                'Message' => [
91                    'Subject' => [
92                        'Data' => $message->getSubject()
93                    ],
94                    'Body' => []
95                ],
96                'Source' => array_key_first($message->getFrom())
97            ];
98
99            $toAddresses       = $message->getTo();
100            $ccAddresses       = $message->getCc();
101            $bccAddresses      = $message->getBcc();
102            $replyToAddress    = $message->getReplyTo();
103            $returnPathAddress = $message->getReturnPath();
104
105            if (!empty($toAddresses)) {
106                foreach ($toAddresses as $email => $name) {
107                    $messageData['Destination']['ToAddresses'][] = (!empty($name)) ? $name . ' <' . $email . '>' : $email;
108                }
109            }
110            if (!empty($ccAddresses)) {
111                $messageData['Destination']['CcAddresses'] = [];
112                foreach ($ccAddresses as $email => $name) {
113                    $messageData['Destination']['CcAddresses'][] = (!empty($name)) ? $name . ' <' . $email . '>' : $email;
114                }
115            }
116            if (!empty($bccAddresses)) {
117                $messageData['Destination']['BccAddresses'] = [];
118                foreach ($bccAddresses as $email => $name) {
119                    $messageData['Destination']['BccAddresses'][] = (!empty($name)) ? $name . ' <' . $email . '>' : $email;
120                }
121            }
122            if (!empty($replyToAddress)) {
123                $messageData['ReplyToAddresses'] = [array_key_first($replyToAddress)];
124            }
125            if (!empty($returnPathAddress)) {
126                $messageData['ReturnPath'] = array_key_first($returnPathAddress);
127            }
128
129            foreach ($parts as $part) {
130                if ($part instanceof Text) {
131                    $messageData['Message']['Body']['Text'] = [
132                        'Data' => $part->getContent()
133                    ];
134                } else if ($part instanceof Html) {
135                    $messageData['Message']['Body']['Html'] = [
136                        'Data' => $part->getContent()
137                    ];
138                }
139            }
140
141            return $this->client->sendEmail($messageData);
142        }
143    }
144
145}