Issues (3627)

Momentum/Service/SwiftMessageService.php (1 issue)

1
<?php
2
3
/*
4
 * @copyright   2018 Mautic Contributors. All rights reserved
5
 * @author      Mautic
6
 *
7
 * @link        http://mautic.org
8
 *
9
 * @license     GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
10
 */
11
12
namespace Mautic\EmailBundle\Swiftmailer\Momentum\Service;
13
14
use Mautic\EmailBundle\Helper\PlainTextMessageHelper;
15
use Mautic\EmailBundle\Swiftmailer\Message\MauticMessage;
16
use Mautic\EmailBundle\Swiftmailer\Momentum\DTO\TransmissionDTO;
17
use Mautic\EmailBundle\Swiftmailer\Momentum\Metadata\MetadataProcessor;
18
19
final class SwiftMessageService implements SwiftMessageServiceInterface
20
{
21
    private $reservedKeys = [
22
        'MIME-Version',
23
        'Content-Type',
24
        'Content-Transfer-Encoding',
25
        'To',
26
        'From',
27
        'Subject',
28
        'Reply-To',
29
        'BCC',
30
    ];
31
32
    /**
33
     * @return TransmissionDTO
34
     */
35
    public function transformToTransmission(\Swift_Mime_SimpleMessage $message)
36
    {
37
        $messageFrom      = $message->getFrom();
38
        $messageFromEmail = current(array_keys($messageFrom));
0 ignored issues
show
It seems like $messageFrom can also be of type null; however, parameter $array of array_keys() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

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

38
        $messageFromEmail = current(array_keys(/** @scrutinizer ignore-type */ $messageFrom));
Loading history...
39
        $from             = new TransmissionDTO\ContentDTO\FromDTO($messageFromEmail);
40
        if (!empty($messageFrom[$messageFromEmail])) {
41
            $from->setName($messageFrom[$messageFromEmail]);
42
        }
43
44
        // Process metadata before consuming subject, body, etc
45
        $metadataProcessor = new MetadataProcessor($message);
46
47
        $content = new TransmissionDTO\ContentDTO($message->getSubject(), $from);
48
        if ($body = $message->getBody()) {
49
            $content->setHtml($body);
50
        }
51
52
        $headers = $message->getHeaders()->getAll();
53
        /** @var \Swift_Mime_Header $header */
54
        foreach ($headers as $header) {
55
            if (\Swift_Mime_Header::TYPE_TEXT == $header->getFieldType() && !in_array($header->getFieldName(), $this->reservedKeys)) {
56
                $content->addHeader($header->getFieldName(), $header->getFieldBodyModel());
57
            }
58
        }
59
60
        if ($messageText = PlainTextMessageHelper::getPlainTextFromMessage($message)) {
61
            $content->setText($messageText);
62
        }
63
64
        if ($message instanceof MauticMessage) {
65
            foreach ($message->getAttachments() as $attachment) {
66
                if (file_exists($attachment['filePath']) && is_readable($attachment['filePath'])) {
67
                    try {
68
                        $swiftAttachment = \Swift_Attachment::fromPath($attachment['filePath']);
69
70
                        if (!empty($attachment['fileName'])) {
71
                            $swiftAttachment->setFilename($attachment['fileName']);
72
                        }
73
74
                        if (!empty($attachment['contentType'])) {
75
                            $swiftAttachment->setContentType($attachment['contentType']);
76
                        }
77
78
                        if (!empty($attachment['inline'])) {
79
                            $swiftAttachment->setDisposition('inline');
80
                        }
81
                        $attachmentContent = $swiftAttachment->getEncoder()->encodeString($swiftAttachment->getBody());
82
                        $attachment        = new TransmissionDTO\ContentDTO\AttachementDTO(
83
                            $swiftAttachment->getContentType(),
84
                            $swiftAttachment->getFilename(),
85
                            $attachmentContent
86
                        );
87
                        $content->addAttachment($attachment);
88
                    } catch (\Exception $e) {
89
                        error_log($e);
90
                    }
91
                }
92
            }
93
        }
94
95
        $cssHeader = $message->getHeaders()->get('X-MC-InlineCSS');
96
        if (null !== $cssHeader) {
97
            $content->setInlineCss($cssHeader);
98
        }
99
100
        $returnPath = $message->getReturnPath() ? $message->getReturnPath() : $messageFromEmail;
101
102
        $transmission = new TransmissionDTO($content, $returnPath);
103
        $transmission->setCampaignId($metadataProcessor->getCampaignId());
104
105
        $recipientsGrouped = [
106
            'to'  => (array) $message->getTo(),
107
            'cc'  => (array) $message->getCc(),
108
            'bcc' => (array) $message->getBcc(),
109
        ];
110
111
        foreach ($recipientsGrouped as $group => $recipients) {
112
            $isBcc = ('bcc' === $group);
113
            foreach ($recipients as $email => $name) {
114
                $addressDTO   = new TransmissionDTO\RecipientDTO\AddressDTO($email, $name, $isBcc);
115
                $recipientDTO = new TransmissionDTO\RecipientDTO(
116
                    $addressDTO,
117
                    $metadataProcessor->getMetadata($email),
118
                    $metadataProcessor->getSubstitutionData($email)
119
                );
120
121
                $transmission->addRecipient($recipientDTO);
122
            }
123
        }
124
125
        if (count($recipientsGrouped['cc'])) {
126
            $content->addHeader('CC', implode(',', array_keys($recipientsGrouped['cc'])));
127
        }
128
129
        return $transmission;
130
    }
131
}
132