Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
99 / 99
100.00% covered (success)
100.00%
1 / 1
CRAP
100.00% covered (success)
100.00%
1 / 1
Office365
100.00% covered (success)
100.00%
99 / 99
100.00% covered (success)
100.00%
1 / 1
22
100.00% covered (success)
100.00%
1 / 1
 send
100.00% covered (success)
100.00%
99 / 99
100.00% covered (success)
100.00%
1 / 1
22
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;
18use Pop\Mail\Api\AbstractOffice365;
19use Pop\Mail\Message;
20use Pop\Mail\Message\Html;
21use Pop\Mail\Message\Text;
22use Pop\Mail\Message\Attachment;
23
24/**
25 * Mailgun API transport class
26 *
27 * @category   Pop
28 * @package    Pop\Mail
29 * @author     Nick Sagona, III <dev@noladev.com>
30 * @copyright  Copyright (c) 2009-2027 NOLA Interactive, LLC.
31 * @license    https://www.popphp.org/license     New BSD License
32 * @version    5.0.0
33 */
34class Office365 extends AbstractOffice365 implements TransportInterface
35{
36
37    /**
38     * Send the message
39     *
40     * @param  Message $message
41     * @return mixed
42     */
43    public function send(Message $message): mixed
44    {
45        $headers         = $message->getHeaders();
46        $parts           = $message->getParts();
47        $personalHeaders = ['From', 'Reply-To', 'Subject', 'To', 'CC', 'BCC', 'MIME-Version'];
48        $fields          = [
49            'message' => [
50                'subject' => $message->getSubject(),
51                'body'    => []
52            ],
53        ];
54
55        $toAddresses    = $message->getTo();
56        $ccAddresses    = $message->getCc();
57        $bccAddresses   = $message->getBcc();
58        $replyToAddress = $message->getReplyTo();
59        $senderAddress  = $message->getSender();
60
61        if (!empty($toAddresses)) {
62            $fields['message']['toRecipients'] = [];
63            foreach ($toAddresses as $email => $name) {
64                if (!empty($name)) {
65                    $fields['message']['toRecipients'][] = [
66                        'emailAddress' => [
67                            'address' => $email,
68                            'name'   => $name
69                        ]
70                    ];
71                } else {
72                    $fields['message']['toRecipients'][] = [
73                        'emailAddress' => [
74                            'address' => $email
75                        ]
76                    ];
77                }
78            }
79        }
80
81        if (!empty($ccAddresses)) {
82            $fields['message']['ccRecipients'] = [];
83            foreach ($ccAddresses as $email => $name) {
84                if (!empty($name)) {
85                    $fields['message']['ccRecipients'][] = [
86                        'emailAddress' => [
87                            'address' => $email,
88                            'name'    => $name
89                        ]
90                    ];
91                } else {
92                    $fields['message']['ccRecipients'][] = [
93                        'emailAddress' => [
94                            'address' => $email
95                        ]
96                    ];
97                }
98            }
99        }
100
101        if (!empty($bccAddresses)) {
102            $fields['message']['bccRecipients'] = [];
103            foreach ($bccAddresses as $email => $name) {
104                if (!empty($name)) {
105                    $fields['message']['bccRecipients'][] = [
106                        'emailAddress' => [
107                            'address' => $email,
108                            'name'    => $name
109                        ]
110                    ];
111                } else {
112                    $fields['message']['bccRecipients'][] = [
113                        'emailAddress' => [
114                            'address' => $email
115                        ]
116                    ];
117                }
118            }
119        }
120
121        if (!empty($replyToAddress)) {
122            $fields['message']['replyTo'] = ['emailAddress' => ['address' => array_key_first($replyToAddress)]];
123        }
124        if (!empty($senderAddress)) {
125            $fields['message']['sender'] = ['emailAddress' => ['address' => array_key_first($senderAddress)]];
126        }
127
128        if (!empty($headers)) {
129            foreach ($headers as $header => $value) {
130                if (!in_array($header, $personalHeaders)) {
131                    if (!isset($fields['message']['internetMessageHeaders'])) {
132                        $fields['message']['internetMessageHeaders'] = [];
133                    }
134                    $fields['message']['internetMessageHeaders'][$header] = $value;
135                }
136            }
137        }
138
139        foreach ($parts as $part) {
140            if ($part instanceof Text) {
141                $fields['message']['body'] = [
142                    'contentType' => 'text',
143                    'content'     => $part->getContent()
144                ];
145            } else if ($part instanceof Html) {
146                $fields['message']['body'] = [
147                    'contentType' => 'html',
148                    'content'     => $part->getContent()
149                ];
150            } else if ($part instanceof Attachment) {
151                if (!isset($fields['message']['attachments'])) {
152                    $fields['message']['attachments'] = [];
153                }
154                $contentType = $part->getContentType();
155                if (str_contains($contentType, ';')) {
156                    $contentType = trim(substr($contentType, 0, strpos($contentType, ';')));
157                }
158                $fields['message']['attachments'][] = [
159                    '@odata.type'  =>  "#microsoft.graph.fileAttachment",
160                    'contentBytes' => base64_encode(file_get_contents($part->getFilename())),
161                    'contentType'  => $contentType,
162                    'name'         => $part->getBasename(),
163                ];
164            }
165        }
166
167        $this->verifyToken();
168
169        $this->client->setAuth(Http\Auth::createBearer($this->token));
170        $this->client->addOption('method', 'POST');
171        $this->client->addOption('type', Http\Client\Request::JSON);
172        $this->client->addOption('auto', true);
173
174        $this->client->setData($fields);
175        return $this->client->send('/' . $this->accountId . '/sendmail');
176    }
177
178}