Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
70.97% covered (success)
70.97%
22 / 31
75.00% covered (success)
75.00%
6 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
Mailer
70.97% covered (success)
70.97%
22 / 31
75.00% covered (success)
75.00%
6 / 8
27.83
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 transport
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setDefaultFrom
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getDefaultFrom
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 hasDefaultFrom
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 send
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
3
 sendFromQueue
50.00% covered (warning)
50.00%
4 / 8
0.00% covered (danger)
0.00%
0 / 1
6.00
 sendFromDir
61.54% covered (warning)
61.54%
8 / 13
0.00% covered (danger)
0.00%
0 / 1
9.79
1<?php
2/**
3 * Pop PHP Framework (https://www.popphp.org/)
4 *
5 * @link       https://github.com/popphp/popphp-framework
6 * @author     Nick Sagona, III <dev@noladev.com>
7 * @copyright  Copyright (c) 2009-2026 NOLA Interactive, LLC.
8 * @license    https://www.popphp.org/license     New BSD License
9 */
10
11/**
12 * @namespace
13 */
14namespace Pop\Mail;
15
16use Pop\Mail\Transport\TransportInterface;
17
18/**
19 * Mailer class
20 *
21 * @category   Pop
22 * @package    Pop\Mail
23 * @author     Nick Sagona, III <dev@noladev.com>
24 * @copyright  Copyright (c) 2009-2026 NOLA Interactive, LLC.
25 * @license    https://www.popphp.org/license     New BSD License
26 * @version    4.0.7
27 */
28class Mailer
29{
30
31    /**
32     * Transport object
33     * @var ?TransportInterface
34     */
35    protected ?TransportInterface $transport = null;
36
37
38    /**
39     * Default from address
40     * @var ?string
41     */
42    protected ?string $defaultFrom = null;
43
44    /**
45     * Constructor
46     *
47     * Instantiate the message object
48     *
49     * @param TransportInterface $transport
50     * @param ?string            $defaultFrom
51     */
52    public function __construct(TransportInterface $transport, ?string $defaultFrom = null)
53    {
54        $this->transport   = $transport;
55        $this->defaultFrom = $defaultFrom;
56    }
57
58    /**
59     * Get the transport object
60     *
61     * @return TransportInterface
62     */
63    public function transport(): TransportInterface
64    {
65        return $this->transport;
66    }
67
68    /**
69     * Set default from address
70     *
71     * @param  string $from
72     * @return Mailer
73     */
74    public function setDefaultFrom(string $from): Mailer
75    {
76        $this->defaultFrom = $from;
77        return $this;
78    }
79
80    /**
81     * Get default from address
82     *
83     * @return ?string
84     */
85    public function getDefaultFrom(): ?string
86    {
87        return $this->defaultFrom;
88    }
89
90    /**
91     * Has default from address
92     *
93     * @return bool
94     */
95    public function hasDefaultFrom(): bool
96    {
97        return ($this->defaultFrom !== null);
98    }
99
100    /**
101     * Send message
102     *
103     * @param  Message $message
104     * @return mixed
105     */
106    public function send(Message $message): mixed
107    {
108        if ((!$message->hasFrom()) && ($this->hasDefaultFrom())) {
109            $message->setFrom($this->defaultFrom);
110        }
111
112        return $this->transport->send($message);
113    }
114
115    /**
116     * Send messages from mail queue
117     *
118     * @param  Queue $queue
119     * @return int
120     */
121    public function sendFromQueue(Queue $queue): int
122    {
123        $sent     = 0;
124        $messages = $queue->prepare();
125
126        foreach ($messages as $message) {
127            if ((!$message->hasFrom()) && ($this->hasDefaultFrom())) {
128                $message->setFrom($this->defaultFrom);
129            }
130
131            $this->transport->send($message);
132            $sent++;
133        }
134
135        return $sent;
136    }
137
138    /**
139     * Send messages from email messages saved to disk in a directory
140     *
141     * @param  string $dir
142     * @throws Exception
143     * @return int
144     */
145    public function sendFromDir(string $dir): int
146    {
147        if (!file_exists($dir)) {
148            throw new Exception('Error: That directory does not exist');
149        }
150
151        $sent  = 0;
152        $files = array_filter(scandir($dir), function($value) {
153            return (($value != '.') && ($value != '..') && ($value != '.empty'));
154        });
155
156        foreach ($files as $file) {
157            $message = Message::load($dir . DIRECTORY_SEPARATOR . $file);
158
159            if ((!$message->hasFrom()) && ($this->hasDefaultFrom())) {
160                $message->setFrom($this->defaultFrom);
161            }
162
163            $this->transport->send($message);
164            $sent++;
165        }
166
167        return $sent;
168    }
169
170}