summaryrefslogtreecommitdiff
path: root/src/Mail/Transport
diff options
context:
space:
mode:
authorIgor Scheller <igor.scheller@igorshp.de>2018-09-05 13:40:03 +0200
committerIgor Scheller <igor.scheller@igorshp.de>2018-09-05 13:44:43 +0200
commit01e9c22695a3e495f07ab445750221af72e09fe4 (patch)
tree63c01a396d289f5f1e4d11259654e772300ff98c /src/Mail/Transport
parent9d34f371cb9c5ab0d60bd3158678b9cc9da6cc80 (diff)
Implemented mailing abstraction
Closes #434
Diffstat (limited to 'src/Mail/Transport')
-rw-r--r--src/Mail/Transport/LogTransport.php44
-rw-r--r--src/Mail/Transport/Transport.php103
2 files changed, 147 insertions, 0 deletions
diff --git a/src/Mail/Transport/LogTransport.php b/src/Mail/Transport/LogTransport.php
new file mode 100644
index 00000000..6e351302
--- /dev/null
+++ b/src/Mail/Transport/LogTransport.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace Engelsystem\Mail\Transport;
+
+use Psr\Log\LoggerInterface;
+use Swift_Mime_SimpleMessage as SimpleMessage;
+
+class LogTransport extends Transport
+{
+ /** @var LoggerInterface */
+ protected $logger;
+
+ public function __construct(LoggerInterface $logger)
+ {
+ $this->logger = $logger;
+ }
+
+ /**
+ * Send the given Message.
+ *
+ * Recipient/sender data will be retrieved from the Message API.
+ * The return value is the number of recipients
+ *
+ * @param SimpleMessage $message
+ * @param string[] $failedRecipients An array of failures by-reference
+ *
+ * @return int
+ */
+ public function send(
+ SimpleMessage $message,
+ &$failedRecipients = null
+ ): int {
+ $this->logger->debug(
+ 'Mail: Send mail "{title}" to "{recipients}":' . PHP_EOL . '{content}',
+ [
+ 'title' => $message->getSubject(),
+ 'recipients' => $this->getTo($message),
+ 'content' => (string)$message->getHeaders() . PHP_EOL . PHP_EOL . $message->toString(),
+ ]
+ );
+
+ return count($this->allRecipients($message));
+ }
+}
diff --git a/src/Mail/Transport/Transport.php b/src/Mail/Transport/Transport.php
new file mode 100644
index 00000000..691faf60
--- /dev/null
+++ b/src/Mail/Transport/Transport.php
@@ -0,0 +1,103 @@
+<?php
+
+namespace Engelsystem\Mail\Transport;
+
+use Swift_Events_EventListener;
+use Swift_Mime_SimpleMessage as SimpleMessage;
+use Swift_Transport as SwiftTransport;
+
+abstract class Transport implements SwiftTransport
+{
+ /**
+ * Test if this Transport mechanism has started.
+ *
+ * @return bool
+ */
+ public function isStarted(): bool
+ {
+ return true;
+ }
+
+ /**
+ * Start this Transport mechanism.
+ */
+ public function start() { }
+
+ /**
+ * Stop this Transport mechanism.
+ */
+ public function stop() { }
+
+ /**
+ * Check if this Transport mechanism is alive.
+ *
+ * If a Transport mechanism session is no longer functional, the method
+ * returns FALSE. It is the responsibility of the developer to handle this
+ * case and restart the Transport mechanism manually.
+ *
+ * @example
+ *
+ * if (!$transport->ping()) {
+ * $transport->stop();
+ * $transport->start();
+ * }
+ *
+ * The Transport mechanism will be started, if it is not already.
+ *
+ * It is undefined if the Transport mechanism attempts to restart as long as
+ * the return value reflects whether the mechanism is now functional.
+ *
+ * @return bool TRUE if the transport is alive
+ */
+ public function ping(): bool
+ {
+ return true;
+ }
+
+ /**
+ * Register a plugin in the Transport.
+ *
+ * @param Swift_Events_EventListener $plugin
+ */
+ public function registerPlugin(Swift_Events_EventListener $plugin) { }
+
+ /**
+ * Returns a unified list of all recipients
+ *
+ * @param SimpleMessage $message
+ * @return array
+ */
+ protected function allRecipients(SimpleMessage $message): array
+ {
+ return array_merge(
+ (array)$message->getTo(),
+ (array)$message->getCc(),
+ (array)$message->getBcc()
+ );
+ }
+
+ /**
+ * Returns a concatenated list of mail recipients
+ *
+ * @param SimpleMessage $message
+ * @return string
+ */
+ protected function getTo(SimpleMessage $message): string
+ {
+ return $this->formatTo($this->allRecipients($message));
+ }
+
+ /**
+ * @param array $recipients
+ * @return string
+ */
+ protected function formatTo(array $recipients)
+ {
+ $list = [];
+ foreach ($recipients as $address => $name) {
+ $list[] = $name ? sprintf('%s <%s>', $name, $address) : $address;
+ }
+
+ return implode(',', $list);
+ }
+}