Completed
Push — master ( 3ff097...503b9d )
by Frederik
06:54
created

SmtpTransport::send()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 21
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 21
ccs 13
cts 13
cp 1
rs 9.3142
c 0
b 0
f 0
cc 2
eloc 15
nc 2
nop 1
crap 2
1
<?php
2
declare(strict_types=1);
3
4
namespace Genkgo\Mail\Transport;
5
6
use Genkgo\Mail\AddressList;
7
use Genkgo\Mail\MessageInterface;
8
use Genkgo\Mail\Protocol\Smtp\ClientFactoryInterface;
9
use Genkgo\Mail\Protocol\Smtp\Request\DataCommand;
10
use Genkgo\Mail\Protocol\Smtp\Request\DataRequest;
11
use Genkgo\Mail\Protocol\Smtp\Request\MailFromCommand;
12
use Genkgo\Mail\Protocol\Smtp\Request\RcptToCommand;
13
use Genkgo\Mail\Stream\MessageStream;
14
use Genkgo\Mail\TransportInterface;
15
16
final class SmtpTransport implements TransportInterface
17
{
18
    /**
19
     * @var ClientFactoryInterface
20
     */
21
    private $clientFactory;
22
    /**
23
     * @var EnvelopeFactory
24
     */
25
    private $envelopeFactory;
26
27
    /**
28
     * PhpMailTransport constructor.
29
     * @param ClientFactoryInterface $clientFactory
30
     * @param EnvelopeFactory $envelopeFactory
31
     */
32 1
    public function __construct(
33
        ClientFactoryInterface $clientFactory,
34
        EnvelopeFactory $envelopeFactory
35
    ) {
36 1
        $this->clientFactory = $clientFactory;
37 1
        $this->envelopeFactory = $envelopeFactory;
38 1
    }
39
40
    /**
41
     * @param MessageInterface $message
42
     * @return void
43
     */
44 1
    public function send(MessageInterface $message): void
45
    {
46 1
        $client = $this->clientFactory->newClient();
47
48
        $client
49 1
            ->request(new MailFromCommand($this->envelopeFactory->make($message)))
50 1
            ->assertCompleted();
51
52 1
        $addresses = $this->createAddressList($message);
53 1
        foreach ($addresses as $address) {
54
            $client
55 1
                ->request(new RcptToCommand($address->getAddress()))
56 1
                ->assertCompleted();
57
        }
58
59
        $client
60 1
            ->request(new DataCommand())
61 1
            ->assertIntermediate()
62 1
            ->request(new DataRequest(new MessageStream($message)))
63 1
            ->assertCompleted();
64 1
    }
65
66
    /**
67
     * @param MessageInterface $message
68
     * @return AddressList
69
     */
70 1
    private function createAddressList(MessageInterface $message): AddressList
71
    {
72 1
        $list = new AddressList();
73
74 1
        foreach (['to', 'cc', 'bcc'] as $name) {
75 1
            foreach ($message->getHeader($name) as $header) {
76 1
                $list = $list->withList(
77 1
                    AddressList::fromString(
78 1
                        (string)$header->getValue()
79
                    )
80
                );
81
            }
82
        }
83
84 1
        return $list;
85
    }
86
}