Passed
Pull Request — master (#10)
by Chris
01:42
created

SwiftMailerCourier::supportsContent()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 0
Metric Value
dl 0
loc 9
ccs 0
cts 5
cp 0
rs 9.6666
c 0
b 0
f 0
cc 3
eloc 4
nc 3
nop 1
crap 12
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Courier;
6
7
use Courier\Exceptions\TransmissionException;
8
use Courier\Exceptions\UnsupportedContentException;
9
use PhpEmail\Attachment\FileAttachment;
10
use PhpEmail\Content;
11
use PhpEmail\Email;
12
use Swift_Attachment;
13
use Swift_Mailer;
14
use Swift_Message;
15
16
class SwiftMailerCourier implements Courier
17
{
18
    /**
19
     * @var Swift_Mailer
20
     */
21
    private $mailer;
22
23
    /**
24
     * @param Swift_Mailer $mailer
25
     */
26
    public function __construct(Swift_Mailer $mailer)
27
    {
28
        $this->mailer = $mailer;
29
    }
30
31
    /**
32
     * @param Email $email
33
     *
34
     * @throws TransmissionException
35
     * @throws UnsupportedContentException
36
     *
37
     * @return void
38
     */
39
    public function deliver(Email $email): void
40
    {
41
        if (!$this->supportsContent($email->getContent())) {
42
            throw new UnsupportedContentException($email->getContent());
43
        }
44
45
        $message = new Swift_Message($email->getSubject());
46
47
        $this->addBody($email->getContent(), $message);
48
49
        $this->addRecipients($email, $message);
50
51
        $this->addFrom($email, $message);
52
53
        $this->addAttachments($email, $message);
54
55
        $this->mailer->send($message);
56
    }
57
58
    /**
59
     * @return array
60
     */
61
    protected function supportedContent(): array
62
    {
63
        return [
64
            Content\EmptyContent::class,
65
            Content\Contracts\SimpleContent::class,
66
        ];
67
    }
68
69
    /**
70
     * Determine if the content is supported by this courier.
71
     *
72
     * @param Content $content
73
     *
74
     * @return bool
75
     */
76
    protected function supportsContent(Content $content): bool
77
    {
78
        foreach ($this->supportedContent() as $contentType) {
79
            if ($content instanceof $contentType) {
80
                return true;
81
            }
82
        }
83
84
        return false;
85
    }
86
87
    /**
88
     * @param Content       $content
89
     * @param Swift_Message $message
90
     *
91
     * @return void
92
     */
93
    protected function addBody(Content $content, Swift_Message $message): void
94
    {
95
        if ($content instanceof Content\SimpleContent) {
96
            if ($content->getHtml() && $content->getText()) {
97
                // Use HTML for the body and add a part for the text
98
                $message->setBody($content->getHtml(), 'text/html');
99
                $message->addPart($content->getText(), 'text/plain');
0 ignored issues
show
Bug introduced by
$content->getText() of type PhpEmail\Content\SimpleContent\Message is incompatible with the type Swift_OutputByteStream|string expected by parameter $body of Swift_Message::addPart(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

99
                $message->addPart(/** @scrutinizer ignore-type */ $content->getText(), 'text/plain');
Loading history...
100
            } elseif ($content->getHtml()) {
101
                $message->setBody($content->getHtml(), 'text/html');
102
            } elseif ($content->getText()) {
103
                $message->setBody($content->getText(), 'text/plain');
104
            }
105
        }
106
    }
107
108
    /**
109
     * @param Email         $email
110
     * @param Swift_Message $message
111
     *
112
     * @return void
113
     */
114
    protected function addRecipients(Email $email, Swift_Message $message): void
115
    {
116
        foreach ($email->getToRecipients() as $recipient) {
117
            $message->addTo($recipient->getEmail(), $recipient->getName());
118
        }
119
120
        foreach ($email->getCcRecipients() as $recipient) {
121
            $message->addCc($recipient->getEmail(), $recipient->getName());
122
        }
123
124
        foreach ($email->getBccRecipients() as $recipient) {
125
            $message->addBcc($recipient->getEmail(), $recipient->getName());
126
        }
127
    }
128
129
    /**
130
     * @param Email         $email
131
     * @param Swift_Message $message
132
     *
133
     * @return void
134
     */
135
    protected function addFrom(Email $email, Swift_Message $message): void
136
    {
137
        $message->setFrom($email->getFrom()->getEmail(), $email->getFrom()->getName());
138
139
        foreach ($email->getReplyTos() as $replyTo) {
140
            $message->addReplyTo($replyTo->getEmail(), $replyTo->getName());
141
        }
142
    }
143
144
    /**
145
     * @param Email         $email
146
     * @param Swift_Message $message
147
     *
148
     * @return void
149
     */
150
    protected function addAttachments(Email $email, Swift_Message $message): void
151
    {
152
        foreach ($email->getAttachments() as $attachment) {
153
            if ($attachment instanceof FileAttachment) {
154
                $swiftAttachment = Swift_Attachment::fromPath($attachment->getFile(), $attachment->getContentType())
155
                    ->setFilename($attachment->getName());
156
            } else {
157
                $swiftAttachment = new Swift_Attachment(
158
                    $attachment->getContent(),
159
                    $attachment->getName(),
160
                    $attachment->getContentType()
161
                );
162
            }
163
164
            $message->attach($swiftAttachment);
165
        }
166
    }
167
}
168