MailgunTransport::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 1
eloc 4
c 1
b 0
f 1
nc 1
nop 3
dl 0
loc 6
rs 9.4285
1
<?php
2
3
namespace DoS\MailerBundle\Transportor;
4
5
use Mailgun\Mailgun;
6
use Swift_Events_EventListener;
7
use Swift_Events_SendEvent;
8
use Swift_Mime_Message;
9
use Swift_Transport;
10
11
class MailgunTransport implements Swift_Transport
12
{
13
    /**
14
     * @var \Mailgun\Mailgun mailgun
15
     */
16
    private $mailgun;
17
18
    /**
19
     * @var string domain
20
     */
21
    private $domain;
22
23
    /**
24
     * The event dispatcher from the plugin API.
25
     *
26
     * @var \Swift_Events_EventDispatcher eventDispatcher
27
     */
28
    private $eventDispatcher;
29
30
    /**
31
     * @param \Swift_Events_EventDispatcher $eventDispatcher
32
     * @param Mailgun $mailgun
33
     * @param $domain
34
     */
35
    public function __construct(\Swift_Events_EventDispatcher $eventDispatcher, Mailgun $mailgun, $domain)
36
    {
37
        $this->eventDispatcher = $eventDispatcher;
38
        $this->domain = $domain;
39
        $this->mailgun = $mailgun;
40
    }
41
42
    /**
43
     * Not used.
44
     */
45
    public function isStarted()
46
    {
47
        return true;
48
    }
49
50
    /**
51
     * Not used.
52
     */
53
    public function start()
54
    {
55
    }
56
57
    /**
58
     * Not used.
59
     */
60
    public function stop()
61
    {
62
    }
63
64
    /**
65
     * Send the given Message.
66
     *
67
     * Recipient/sender data will be retrieved from the Message API.
68
     * The return value is the number of recipients who were accepted for delivery.
69
     *
70
     * @param Swift_Mime_Message $message
71
     * @param string[] $failedRecipients An array of failures by-reference
72
     *
73
     * @return integer number of mails sent
74
     * @throws \Swift_TransportException
75
     */
76
    public function send(Swift_Mime_Message $message, &$failedRecipients = null)
77
    {
78
        if ($evt = $this->eventDispatcher->createSendEvent($this, $message)) {
79
            $this->eventDispatcher->dispatchEvent($evt, 'beforeSendPerformed');
80
81
            if ($evt->bubbleCancelled()) {
82
                return 0;
83
            }
84
        }
85
86
        if (null === $message->getHeaders()->get('To')) {
87
            throw new \Swift_TransportException(
88
                'Cannot send message without a recipient'
89
            );
90
        }
91
92
        $postData = $this->prepareRecipients($message);
93
        $result = $this->mailgun->sendMessage($this->domain, $postData, $message->toString());
94
95
        if ($evt) {
96
            $evt->setResult(
97
                $result->http_response_code == 200 ? Swift_Events_SendEvent::RESULT_SUCCESS : Swift_Events_SendEvent::RESULT_FAILED
98
            );
99
            $this->eventDispatcher->dispatchEvent($evt, 'sendPerformed');
100
        }
101
102
        return 1;
103
    }
104
105
    /**
106
     * Register a plugin in the Transport.
107
     *
108
     * @param Swift_Events_EventListener $plugin
109
     */
110
    public function registerPlugin(Swift_Events_EventListener $plugin)
111
    {
112
        $this->eventDispatcher->bindEventListener($plugin);
113
    }
114
115
    /**
116
     * @param Swift_Mime_Message $message
117
     *
118
     * @return array
119
     */
120
    protected function prepareRecipients(Swift_Mime_Message $message)
121
    {
122
        $headerNames = array('from', 'to', 'bcc', 'cc');
123
        $messageHeaders = $message->getHeaders();
124
        $postData = array();
125
126
        foreach ($headerNames as $name) {
127
            /** @var \Swift_Mime_Headers_MailboxHeader $h */
128
            $h = $messageHeaders->get($name);
129
            $postData[$name] = $h === null ? array() : $h->getAddresses();
130
        }
131
        // Merge 'bcc' and 'cc' into 'to'.
132
        $postData['to'] = array_merge($postData['to'], $postData['bcc'], $postData['cc']);
133
134
        unset($postData['bcc']);
135
        unset($postData['cc']);
136
137
        // Remove Bcc to make sure it is hidden
138
        $messageHeaders->removeAll('bcc');
139
140
        return $postData;
141
    }
142
}
143