aboutsummaryrefslogtreecommitdiff
path: root/External/swiftmailer/lib/classes/Swift/Plugins
diff options
context:
space:
mode:
authorYuchen Pei <hi@ypei.me>2021-10-15 09:52:00 +1100
committerYuchen Pei <hi@ypei.me>2021-10-15 09:52:00 +1100
commit71b0e901f5fb1cfcd162d8acc23120d3f77a3152 (patch)
tree323c00faef1edc7dea2e88ff581cc2258b2b6432 /External/swiftmailer/lib/classes/Swift/Plugins
parent72cce24864b064b5762f4fe97fdf40d8d2ad4b51 (diff)
parent07f5140771388c9e0c8a99b0dd2e5d950bdb173b (diff)
Merge branch 'development' into h-node
Diffstat (limited to 'External/swiftmailer/lib/classes/Swift/Plugins')
-rwxr-xr-xExternal/swiftmailer/lib/classes/Swift/Plugins/AntiFloodPlugin.php147
-rwxr-xr-xExternal/swiftmailer/lib/classes/Swift/Plugins/BandwidthMonitorPlugin.php173
-rwxr-xr-xExternal/swiftmailer/lib/classes/Swift/Plugins/Decorator/Replacements.php36
-rwxr-xr-xExternal/swiftmailer/lib/classes/Swift/Plugins/DecoratorPlugin.php201
-rwxr-xr-xExternal/swiftmailer/lib/classes/Swift/Plugins/Logger.php37
-rwxr-xr-xExternal/swiftmailer/lib/classes/Swift/Plugins/LoggerPlugin.php160
-rwxr-xr-xExternal/swiftmailer/lib/classes/Swift/Plugins/Loggers/ArrayLogger.php73
-rwxr-xr-xExternal/swiftmailer/lib/classes/Swift/Plugins/Loggers/EchoLogger.php64
-rwxr-xr-xExternal/swiftmailer/lib/classes/Swift/Plugins/Pop/Pop3Connection.php36
-rwxr-xr-xExternal/swiftmailer/lib/classes/Swift/Plugins/Pop/Pop3Exception.php34
-rwxr-xr-xExternal/swiftmailer/lib/classes/Swift/Plugins/PopBeforeSmtpPlugin.php288
-rwxr-xr-xExternal/swiftmailer/lib/classes/Swift/Plugins/Reporter.php36
-rwxr-xr-xExternal/swiftmailer/lib/classes/Swift/Plugins/ReporterPlugin.php82
-rwxr-xr-xExternal/swiftmailer/lib/classes/Swift/Plugins/Reporters/HitReporter.php63
-rwxr-xr-xExternal/swiftmailer/lib/classes/Swift/Plugins/Reporters/HtmlReporter.php47
-rwxr-xr-xExternal/swiftmailer/lib/classes/Swift/Plugins/Sleeper.php26
-rwxr-xr-xExternal/swiftmailer/lib/classes/Swift/Plugins/ThrottlerPlugin.php188
-rwxr-xr-xExternal/swiftmailer/lib/classes/Swift/Plugins/Timer.php26
18 files changed, 1717 insertions, 0 deletions
diff --git a/External/swiftmailer/lib/classes/Swift/Plugins/AntiFloodPlugin.php b/External/swiftmailer/lib/classes/Swift/Plugins/AntiFloodPlugin.php
new file mode 100755
index 0000000..46a7f44
--- /dev/null
+++ b/External/swiftmailer/lib/classes/Swift/Plugins/AntiFloodPlugin.php
@@ -0,0 +1,147 @@
+<?php
+
+/*
+ * This file is part of SwiftMailer.
+ * (c) 2004-2009 Chris Corbyn
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+//@require 'Swift/Events/SendListener.php';
+//@require 'Swift/Events/SendEvent.php';
+//@require 'Swift/Plugins/Sleeper.php';
+
+/**
+ * Reduces network flooding when sending large amounts of mail.
+ * @package Swift
+ * @subpackage Plugins
+ * @author Chris Corbyn
+ */
+class Swift_Plugins_AntiFloodPlugin
+ implements Swift_Events_SendListener, Swift_Plugins_Sleeper
+{
+
+ /**
+ * The number of emails to send before restarting Transport.
+ * @var int
+ * @access private
+ */
+ private $_threshold;
+
+ /**
+ * The number of seconds to sleep for during a restart.
+ * @var int
+ * @access private
+ */
+ private $_sleep;
+
+ /**
+ * The internal counter.
+ * @var int
+ * @access private
+ */
+ private $_counter = 0;
+
+ /**
+ * The Sleeper instance for sleeping.
+ * @var Swift_Plugins_Sleeper
+ * @access private
+ */
+ private $_sleeper;
+
+ /**
+ * Create a new AntiFloodPlugin with $threshold and $sleep time.
+ * @param int $threshold
+ * @param int $sleep time
+ * @param Swift_Plugins_Sleeper $sleeper (not needed really)
+ */
+ public function __construct($threshold = 99, $sleep = 0,
+ Swift_Plugins_Sleeper $sleeper = null)
+ {
+ $this->setThreshold($threshold);
+ $this->setSleepTime($sleep);
+ $this->_sleeper = $sleeper;
+ }
+
+ /**
+ * Set the number of emails to send before restarting.
+ * @param int $threshold
+ */
+ public function setThreshold($threshold)
+ {
+ $this->_threshold = $threshold;
+ }
+
+ /**
+ * Get the number of emails to send before restarting.
+ * @return int
+ */
+ public function getThreshold()
+ {
+ return $this->_threshold;
+ }
+
+ /**
+ * Set the number of seconds to sleep for during a restart.
+ * @param int $sleep time
+ */
+ public function setSleepTime($sleep)
+ {
+ $this->_sleep = $sleep;
+ }
+
+ /**
+ * Get the number of seconds to sleep for during a restart.
+ * @return int
+ */
+ public function getSleepTime()
+ {
+ return $this->_sleep;
+ }
+
+ /**
+ * Invoked immediately before the Message is sent.
+ * @param Swift_Events_SendEvent $evt
+ */
+ public function beforeSendPerformed(Swift_Events_SendEvent $evt)
+ {
+ }
+
+ /**
+ * Invoked immediately after the Message is sent.
+ * @param Swift_Events_SendEvent $evt
+ */
+ public function sendPerformed(Swift_Events_SendEvent $evt)
+ {
+ ++$this->_counter;
+ if ($this->_counter >= $this->_threshold)
+ {
+ $transport = $evt->getTransport();
+ $transport->stop();
+ if ($this->_sleep)
+ {
+ $this->sleep($this->_sleep);
+ }
+ $transport->start();
+ $this->_counter = 0;
+ }
+ }
+
+ /**
+ * Sleep for $seconds.
+ * @param int $seconds
+ */
+ public function sleep($seconds)
+ {
+ if (isset($this->_sleeper))
+ {
+ $this->_sleeper->sleep($seconds);
+ }
+ else
+ {
+ sleep($seconds);
+ }
+ }
+
+}
diff --git a/External/swiftmailer/lib/classes/Swift/Plugins/BandwidthMonitorPlugin.php b/External/swiftmailer/lib/classes/Swift/Plugins/BandwidthMonitorPlugin.php
new file mode 100755
index 0000000..501cd80
--- /dev/null
+++ b/External/swiftmailer/lib/classes/Swift/Plugins/BandwidthMonitorPlugin.php
@@ -0,0 +1,173 @@
+<?php
+
+/*
+ * This file is part of SwiftMailer.
+ * (c) 2004-2009 Chris Corbyn
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+//@require 'Swift/Events/SendListener.php';
+//@require 'Swift/Events/SendEvent.php';
+//@require 'Swift/Events/CommandListener.php';
+//@require 'Swift/Events/CommandEvent.php';
+//@require 'Swift/Events/ResponseListener.php';
+//@require 'Swift/Events/ResponseEvent.php';
+//@require 'Swift/InputByteStream.php';
+
+/**
+ * Reduces network flooding when sending large amounts of mail.
+ * @package Swift
+ * @subpackage Plugins
+ * @author Chris Corbyn
+ */
+class Swift_Plugins_BandwidthMonitorPlugin
+ implements Swift_Events_SendListener, Swift_Events_CommandListener,
+ Swift_Events_ResponseListener, Swift_InputByteStream
+{
+
+ /**
+ * The outgoing traffic counter.
+ * @var int
+ * @access private
+ */
+ private $_out = 0;
+
+ /**
+ * The incoming traffic counter.
+ * @var int
+ * @access private
+ */
+ private $_in = 0;
+
+ /** Bound byte streams */
+ private $_mirrors = array();
+
+ /**
+ * Not used.
+ */
+ public function beforeSendPerformed(Swift_Events_SendEvent $evt)
+ {
+ }
+
+ /**
+ * Invoked immediately after the Message is sent.
+ * @param Swift_Events_SendEvent $evt
+ */
+ public function sendPerformed(Swift_Events_SendEvent $evt)
+ {
+ $message = $evt->getMessage();
+ $message->toByteStream($this);
+ }
+
+ /**
+ * Invoked immediately following a command being sent.
+ * @param Swift_Events_ResponseEvent $evt
+ */
+ public function commandSent(Swift_Events_CommandEvent $evt)
+ {
+ $command = $evt->getCommand();
+ $this->_out += strlen($command);
+ }
+
+ /**
+ * Invoked immediately following a response coming back.
+ * @param Swift_Events_ResponseEvent $evt
+ */
+ public function responseReceived(Swift_Events_ResponseEvent $evt)
+ {
+ $response = $evt->getResponse();
+ $this->_in += strlen($response);
+ }
+
+ /**
+ * Called when a message is sent so that the outgoing counter can be increased.
+ * @param string $bytes
+ */
+ public function write($bytes)
+ {
+ $this->_out += strlen($bytes);
+ foreach ($this->_mirrors as $stream)
+ {
+ $stream->write($bytes);
+ }
+ }
+
+ /**
+ * Not used.
+ */
+ public function commit()
+ {
+ }
+
+ /**
+ * Attach $is to this stream.
+ * The stream acts as an observer, receiving all data that is written.
+ * All {@link write()} and {@link flushBuffers()} operations will be mirrored.
+ *
+ * @param Swift_InputByteStream $is
+ */
+ public function bind(Swift_InputByteStream $is)
+ {
+ $this->_mirrors[] = $is;
+ }
+
+ /**
+ * Remove an already bound stream.
+ * If $is is not bound, no errors will be raised.
+ * If the stream currently has any buffered data it will be written to $is
+ * before unbinding occurs.
+ *
+ * @param Swift_InputByteStream $is
+ */
+ public function unbind(Swift_InputByteStream $is)
+ {
+ foreach ($this->_mirrors as $k => $stream)
+ {
+ if ($is === $stream)
+ {
+ unset($this->_mirrors[$k]);
+ }
+ }
+ }
+
+ /**
+ * Not used.
+ */
+ public function flushBuffers()
+ {
+ foreach ($this->_mirrors as $stream)
+ {
+ $stream->flushBuffers();
+ }
+ }
+
+ /**
+ * Get the total number of bytes sent to the server.
+ * @return int
+ */
+ public function getBytesOut()
+ {
+ return $this->_out;
+ }
+
+ /**
+ * Get the total number of bytes received from the server.
+ * @return int
+ */
+ public function getBytesIn()
+ {
+ return $this->_in;
+ }
+
+ /**
+ * Reset the internal counters to zero.
+ */
+ public function reset()
+ {
+ $this->_out = 0;
+ $this->_in = 0;
+ }
+
+}
diff --git a/External/swiftmailer/lib/classes/Swift/Plugins/Decorator/Replacements.php b/External/swiftmailer/lib/classes/Swift/Plugins/Decorator/Replacements.php
new file mode 100755
index 0000000..9735d0a
--- /dev/null
+++ b/External/swiftmailer/lib/classes/Swift/Plugins/Decorator/Replacements.php
@@ -0,0 +1,36 @@
+<?php
+
+/*
+ * This file is part of SwiftMailer.
+ * (c) 2004-2009 Chris Corbyn
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Allows customization of Messages on-the-fly.
+ *
+ * @package Swift
+ * @subpackage Plugins
+ *
+ * @author Chris Corbyn
+ */
+interface Swift_Plugins_Decorator_Replacements
+{
+
+ /**
+ * Return the array of replacements for $address.
+ *
+ * This method is invoked once for every single recipient of a message.
+ *
+ * If no replacements can be found, an empty value (NULL) should be returned
+ * and no replacements will then be made on the message.
+ *
+ * @param string $address
+ *
+ * @return array
+ */
+ public function getReplacementsFor($address);
+
+}
diff --git a/External/swiftmailer/lib/classes/Swift/Plugins/DecoratorPlugin.php b/External/swiftmailer/lib/classes/Swift/Plugins/DecoratorPlugin.php
new file mode 100755
index 0000000..da1a307
--- /dev/null
+++ b/External/swiftmailer/lib/classes/Swift/Plugins/DecoratorPlugin.php
@@ -0,0 +1,201 @@
+<?php
+
+/*
+ * This file is part of SwiftMailer.
+ * (c) 2004-2009 Chris Corbyn
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+//@require 'Swift/Events/SendListener.php';
+//@require 'Swift/Events/SendEvent.php';
+//@require 'Swift/Plugins/Decorator/Replacements.php';
+
+/**
+ * Allows customization of Messages on-the-fly.
+ *
+ * @package Swift
+ * @subpackage Plugins
+ *
+ * @author Chris Corbyn
+ */
+class Swift_Plugins_DecoratorPlugin
+ implements Swift_Events_SendListener, Swift_Plugins_Decorator_Replacements
+{
+
+ /** The replacement map */
+ private $_replacements;
+
+ /** The body as it was before replacements */
+ private $_orginalBody;
+
+ /** The original subject of the message, before replacements */
+ private $_originalSubject;
+
+ /** Bodies of children before they are replaced */
+ private $_originalChildBodies = array();
+
+ /** The Message that was last replaced */
+ private $_lastMessage;
+
+ /**
+ * Create a new DecoratorPlugin with $replacements.
+ *
+ * The $replacements can either be an associative array, or an implementation
+ * of {@link Swift_Plugins_Decorator_Replacements}.
+ *
+ * When using an array, it should be of the form:
+ * <code>
+ * $replacements = array(
+ * "address1@domain.tld" => array("{a}" => "b", "{c}" => "d"),
+ * "address2@domain.tld" => array("{a}" => "x", "{c}" => "y")
+ * )
+ * </code>
+ *
+ * When using an instance of {@link Swift_Plugins_Decorator_Replacements},
+ * the object should return just the array of replacements for the address
+ * given to {@link Swift_Plugins_Decorator_Replacements::getReplacementsFor()}.
+ *
+ * @param mixed $replacements
+ */
+ public function __construct($replacements)
+ {
+ if (!($replacements instanceof Swift_Plugins_Decorator_Replacements))
+ {
+ $this->_replacements = (array) $replacements;
+ }
+ else
+ {
+ $this->_replacements = $replacements;
+ }
+ }
+
+ /**
+ * Invoked immediately before the Message is sent.
+ *
+ * @param Swift_Events_SendEvent $evt
+ */
+ public function beforeSendPerformed(Swift_Events_SendEvent $evt)
+ {
+ $message = $evt->getMessage();
+ $this->_restoreMessage($message);
+ $to = array_keys($message->getTo());
+ $address = array_shift($to);
+ if ($replacements = $this->getReplacementsFor($address))
+ {
+ $body = $message->getBody();
+ $search = array_keys($replacements);
+ $replace = array_values($replacements);
+ $bodyReplaced = str_replace(
+ $search, $replace, $body
+ );
+ if ($body != $bodyReplaced)
+ {
+ $this->_originalBody = $body;
+ $message->setBody($bodyReplaced);
+ }
+ $subject = $message->getSubject();
+ $subjectReplaced = str_replace(
+ $search, $replace, $subject
+ );
+ if ($subject != $subjectReplaced)
+ {
+ $this->_originalSubject = $subject;
+ $message->setSubject($subjectReplaced);
+ }
+ $children = (array) $message->getChildren();
+ foreach ($children as $child)
+ {
+ list($type, ) = sscanf($child->getContentType(), '%[^/]/%s');
+ if ('text' == $type)
+ {
+ $body = $child->getBody();
+ $bodyReplaced = str_replace(
+ $search, $replace, $body
+ );
+ if ($body != $bodyReplaced)
+ {
+ $child->setBody($bodyReplaced);
+ $this->_originalChildBodies[$child->getId()] = $body;
+ }
+ }
+ }
+ $this->_lastMessage = $message;
+ }
+ }
+
+ /**
+ * Find a map of replacements for the address.
+ *
+ * If this plugin was provided with a delegate instance of
+ * {@link Swift_Plugins_Decorator_Replacements} then the call will be
+ * delegated to it. Otherwise, it will attempt to find the replacements
+ * from the array provided in the constructor.
+ *
+ * If no replacements can be found, an empty value (NULL) is returned.
+ *
+ * @param string $address
+ *
+ * @return array
+ */
+ public function getReplacementsFor($address)
+ {
+ if ($this->_replacements instanceof Swift_Plugins_Decorator_Replacements)
+ {
+ return $this->_replacements->getReplacementsFor($address);
+ }
+ else
+ {
+ return isset($this->_replacements[$address])
+ ? $this->_replacements[$address]
+ : null
+ ;
+ }
+ }
+
+ /**
+ * Invoked immediately after the Message is sent.
+ *
+ * @param Swift_Events_SendEvent $evt
+ */
+ public function sendPerformed(Swift_Events_SendEvent $evt)
+ {
+ $this->_restoreMessage($evt->getMessage());
+ }
+
+ // -- Private methods
+
+ /** Restore a changed message back to its original state */
+ private function _restoreMessage(Swift_Mime_Message $message)
+ {
+ if ($this->_lastMessage === $message)
+ {
+ if (isset($this->_originalBody))
+ {
+ $message->setBody($this->_originalBody);
+ $this->_originalBody = null;
+ }
+ if (isset($this->_originalSubject))
+ {
+ $message->setSubject($this->_originalSubject);
+ $this->_originalSubject = null;
+ }
+ if (!empty($this->_originalChildBodies))
+ {
+ $children = (array) $message->getChildren();
+ foreach ($children as $child)
+ {
+ $id = $child->getId();
+ if (array_key_exists($id, $this->_originalChildBodies))
+ {
+ $child->setBody($this->_originalChildBodies[$id]);
+ }
+ }
+ $this->_originalChildBodies = array();
+ }
+ $this->_lastMessage = null;
+ }
+ }
+
+}
diff --git a/External/swiftmailer/lib/classes/Swift/Plugins/Logger.php b/External/swiftmailer/lib/classes/Swift/Plugins/Logger.php
new file mode 100755
index 0000000..9864da0
--- /dev/null
+++ b/External/swiftmailer/lib/classes/Swift/Plugins/Logger.php
@@ -0,0 +1,37 @@
+<?php
+
+/*
+ * This file is part of SwiftMailer.
+ * (c) 2004-2009 Chris Corbyn
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Logs events in the Transport system.
+ * @package Swift
+ * @subpackage Transport
+ * @author Chris Corbyn
+ */
+interface Swift_Plugins_Logger
+{
+
+ /**
+ * Add a log entry.
+ * @param string $entry
+ */
+ public function add($entry);
+
+ /**
+ * Clear the log contents.
+ */
+ public function clear();
+
+ /**
+ * Get this log as a string.
+ * @return string
+ */
+ public function dump();
+
+}
diff --git a/External/swiftmailer/lib/classes/Swift/Plugins/LoggerPlugin.php b/External/swiftmailer/lib/classes/Swift/Plugins/LoggerPlugin.php
new file mode 100755
index 0000000..d595f26
--- /dev/null
+++ b/External/swiftmailer/lib/classes/Swift/Plugins/LoggerPlugin.php
@@ -0,0 +1,160 @@
+<?php
+
+/*
+ * This file is part of SwiftMailer.
+ * (c) 2004-2009 Chris Corbyn
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+//@require 'Swift/Events/CommandListener.php';
+//@require 'Swift/Events/CommandEvent.php';
+//@require 'Swift/Events/ResponseListener.php';
+//@require 'Swift/Events/ResponseEvent.php';
+//@require 'Swift/Events/TransportChangeListener.php';
+//@require 'Swift/Events/TransportChangeEvent.php';
+//@require 'Swift/Events/TransportExceptionEvent.php';
+//@require 'Swift/Events/TransportExceptionListener.php';
+//@require 'Swift/Events/TransportException.php';
+//@require 'Swift/Plugins/Logger.php';
+
+/**
+ * Does real time logging of Transport level information.
+ *
+ * @package Swift
+ * @subpackage Plugins
+ *
+ * @author Chris Corbyn
+ */
+class Swift_Plugins_LoggerPlugin
+ implements Swift_Events_CommandListener, Swift_Events_ResponseListener,
+ Swift_Events_TransportChangeListener, Swift_Events_TransportExceptionListener,
+ Swift_Plugins_Logger
+{
+
+ /** The logger which is delegated to */
+ private $_logger;
+
+ /**
+ * Create a new LoggerPlugin using $logger.
+ *
+ * @param Swift_Plugins_Logger $logger
+ */
+ public function __construct(Swift_Plugins_Logger $logger)
+ {
+ $this->_logger = $logger;
+ }
+
+ /**
+ * Add a log entry.
+ *
+ * @param string $entry
+ */
+ public function add($entry)
+ {
+ $this->_logger->add($entry);
+ }
+
+ /**
+ * Clear the log contents.
+ */
+ public function clear()
+ {
+ $this->_logger->clear();
+ }
+
+ /**
+ * Get this log as a string.
+ *
+ * @return string
+ */
+ public function dump()
+ {
+ return $this->_logger->dump();
+ }
+
+ /**
+ * Invoked immediately following a command being sent.
+ *
+ * @param Swift_Events_ResponseEvent $evt
+ */
+ public function commandSent(Swift_Events_CommandEvent $evt)
+ {
+ $command = $evt->getCommand();
+ $this->_logger->add(sprintf(">> %s", $command));
+ }
+
+ /**
+ * Invoked immediately following a response coming back.
+ *
+ * @param Swift_Events_ResponseEvent $evt
+ */
+ public function responseReceived(Swift_Events_ResponseEvent $evt)
+ {
+ $response = $evt->getResponse();
+ $this->_logger->add(sprintf("<< %s", $response));
+ }
+
+ /**
+ * Invoked just before a Transport is started.
+ *
+ * @param Swift_Events_TransportChangeEvent $evt
+ */
+ public function beforeTransportStarted(Swift_Events_TransportChangeEvent $evt)
+ {
+ $transportName = get_class($evt->getSource());
+ $this->_logger->add(sprintf("++ Starting %s", $transportName));
+ }
+
+ /**
+ * Invoked immediately after the Transport is started.
+ *
+ * @param Swift_Events_TransportChangeEvent $evt
+ */
+ public function transportStarted(Swift_Events_TransportChangeEvent $evt)
+ {
+ $transportName = get_class($evt->getSource());
+ $this->_logger->add(sprintf("++ %s started", $transportName));
+ }
+
+ /**
+ * Invoked just before a Transport is stopped.
+ *
+ * @param Swift_Events_TransportChangeEvent $evt
+ */
+ public function beforeTransportStopped(Swift_Events_TransportChangeEvent $evt)
+ {
+ $transportName = get_class($evt->getSource());
+ $this->_logger->add(sprintf("++ Stopping %s", $transportName));
+ }
+
+ /**
+ * Invoked immediately after the Transport is stopped.
+ *
+ * @param Swift_Events_TransportChangeEvent $evt
+ */
+ public function transportStopped(Swift_Events_TransportChangeEvent $evt)
+ {
+ $transportName = get_class($evt->getSource());
+ $this->_logger->add(sprintf("++ %s stopped", $transportName));
+ }
+
+ /**
+ * Invoked as a TransportException is thrown in the Transport system.
+ *
+ * @param Swift_Events_TransportExceptionEvent $evt
+ */
+ public function exceptionThrown(Swift_Events_TransportExceptionEvent $evt)
+ {
+ $e = $evt->getException();
+ $message = $e->getMessage();
+ $this->_logger->add(sprintf("!! %s", $message));
+ $message .= PHP_EOL;
+ $message .= 'Log data:' . PHP_EOL;
+ $message .= $this->_logger->dump();
+ $evt->cancelBubble();
+ throw new Swift_TransportException($message);
+ }
+
+}
diff --git a/External/swiftmailer/lib/classes/Swift/Plugins/Loggers/ArrayLogger.php b/External/swiftmailer/lib/classes/Swift/Plugins/Loggers/ArrayLogger.php
new file mode 100755
index 0000000..930eca2
--- /dev/null
+++ b/External/swiftmailer/lib/classes/Swift/Plugins/Loggers/ArrayLogger.php
@@ -0,0 +1,73 @@
+<?php
+
+/*
+ * This file is part of SwiftMailer.
+ * (c) 2004-2009 Chris Corbyn
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Logs to an Array backend.
+ * @package Swift
+ * @subpackage Transport
+ * @author Chris Corbyn
+ */
+class Swift_Plugins_Loggers_ArrayLogger implements Swift_Plugins_Logger
+{
+
+ /**
+ * The log contents.
+ * @var array
+ * @access private
+ */
+ private $_log = array();
+
+ /**
+ * Max size of the log.
+ * @var int
+ * @access private
+ */
+ private $_size = 0;
+
+ /**
+ * Create a new ArrayLogger with a maximum of $size entries.
+ * @var int $size
+ */
+ public function __construct($size = 50)
+ {
+ $this->_size = $size;
+ }
+
+ /**
+ * Add a log entry.
+ * @param string $entry
+ */
+ public function add($entry)
+ {
+ $this->_log[] = $entry;
+ while (count($this->_log) > $this->_size)
+ {
+ array_shift($this->_log);
+ }
+ }
+
+ /**
+ * Clear the log contents.
+ */
+ public function clear()
+ {
+ $this->_log = array();
+ }
+
+ /**
+ * Get this log as a string.
+ * @return string
+ */
+ public function dump()
+ {
+ return implode(PHP_EOL, $this->_log);
+ }
+
+}
diff --git a/External/swiftmailer/lib/classes/Swift/Plugins/Loggers/EchoLogger.php b/External/swiftmailer/lib/classes/Swift/Plugins/Loggers/EchoLogger.php
new file mode 100755
index 0000000..83dd54b
--- /dev/null
+++ b/External/swiftmailer/lib/classes/Swift/Plugins/Loggers/EchoLogger.php
@@ -0,0 +1,64 @@
+<?php
+
+/*
+ * This file is part of SwiftMailer.
+ * (c) 2004-2009 Chris Corbyn
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Prints all log messages in real time.
+ *
+ * @package Swift
+ * @subpackage Transport
+ * @author Chris Corbyn
+ */
+class Swift_Plugins_Loggers_EchoLogger implements Swift_Plugins_Logger
+{
+
+ /** Whether or not HTML should be output */
+ private $_isHtml;
+
+ /**
+ * Create a new EchoLogger.
+ *
+ * @param boolean $isHtml
+ */
+ public function __construct($isHtml = true)
+ {
+ $this->_isHtml = $isHtml;
+ }
+
+ /**
+ * Add a log entry.
+ * @param string $entry
+ */
+ public function add($entry)
+ {
+ if ($this->_isHtml)
+ {
+ printf('%s%s%s', htmlspecialchars($entry, ENT_QUOTES), '<br />', PHP_EOL);
+ }
+ else
+ {
+ printf('%s%s', $entry, PHP_EOL);
+ }
+ }
+
+ /**
+ * Not implemented.
+ */
+ public function clear()
+ {
+ }
+
+ /**
+ * Not implemented.
+ */
+ public function dump()
+ {
+ }
+
+}
diff --git a/External/swiftmailer/lib/classes/Swift/Plugins/Pop/Pop3Connection.php b/External/swiftmailer/lib/classes/Swift/Plugins/Pop/Pop3Connection.php
new file mode 100755
index 0000000..1c96dcf
--- /dev/null
+++ b/External/swiftmailer/lib/classes/Swift/Plugins/Pop/Pop3Connection.php
@@ -0,0 +1,36 @@
+<?php
+
+/*
+ * This file is part of SwiftMailer.
+ * (c) 2004-2009 Chris Corbyn
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Pop3Connection interface for connecting and disconnecting to a POP3 host.
+ *
+ * @package Swift
+ * @subpackage Plugins
+ *
+ * @author Chris Corbyn
+ */
+interface Swift_Plugins_Pop_Pop3Connection
+{
+
+ /**
+ * Connect to the POP3 host and throw an Exception if it fails.
+ *
+ * @throws Swift_Plugins_Pop_Pop3Exception
+ */
+ public function connect();
+
+ /**
+ * Disconnect from the POP3 host and throw an Exception if it fails.
+ *
+ * @throws Swift_Plugins_Pop_Pop3Exception
+ */
+ public function disconnect();
+
+}
diff --git a/External/swiftmailer/lib/classes/Swift/Plugins/Pop/Pop3Exception.php b/External/swiftmailer/lib/classes/Swift/Plugins/Pop/Pop3Exception.php
new file mode 100755
index 0000000..e0205f4
--- /dev/null
+++ b/External/swiftmailer/lib/classes/Swift/Plugins/Pop/Pop3Exception.php
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of SwiftMailer.
+ * (c) 2004-2009 Chris Corbyn
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+//@require 'Swift/IoException.php';
+
+/**
+ * Pop3Exception thrown when an error occurs connecting to a POP3 host.
+ *
+ * @package Swift
+ * @subpackage Transport
+ *
+ * @author Chris Corbyn
+ */
+class Swift_Plugins_Pop_Pop3Exception extends Swift_IoException
+{
+
+ /**
+ * Create a new Pop3Exception with $message.
+ *
+ * @param string $message
+ */
+ public function __construct($message)
+ {
+ parent::__construct($message);
+ }
+
+}
diff --git a/External/swiftmailer/lib/classes/Swift/Plugins/PopBeforeSmtpPlugin.php b/External/swiftmailer/lib/classes/Swift/Plugins/PopBeforeSmtpPlugin.php
new file mode 100755
index 0000000..fd1cf46
--- /dev/null
+++ b/External/swiftmailer/lib/classes/Swift/Plugins/PopBeforeSmtpPlugin.php
@@ -0,0 +1,288 @@
+<?php
+
+/*
+ * This file is part of SwiftMailer.
+ * (c) 2004-2009 Chris Corbyn
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+//@require 'Swift/Events/TransportChangeListener.php';
+//@require 'Swift/Events/TransportChangeEvent.php';
+
+/**
+ * Makes sure a connection to a POP3 host has been established prior to connecting to SMTP.
+ *
+ * @package Swift
+ * @subpackage Plugins
+ *
+ * @author Chris Corbyn
+ */
+class Swift_Plugins_PopBeforeSmtpPlugin
+ implements Swift_Events_TransportChangeListener, Swift_Plugins_Pop_Pop3Connection
+{
+
+ /** A delegate connection to use (mostly a test hook) */
+ private $_connection;
+
+ /** Hostname of the POP3 server */
+ private $_host;
+
+ /** Port number to connect on */
+ private $_port;
+
+ /** Encryption type to use (if any) */
+ private $_crypto;
+
+ /** Username to use (if any) */
+ private $_username;
+
+ /** Password to use (if any) */
+ private $_password;
+
+ /** Established connection via TCP socket */
+ private $_socket;
+
+ /** Connect timeout in seconds */
+ private $_timeout = 10;
+
+ /** SMTP Transport to bind to */
+ private $_transport;
+
+ /**
+ * Create a new PopBeforeSmtpPlugin for $host and $port.
+ *
+ * @param string $host
+ * @param int $port
+ * @param string $cypto as "tls" or "ssl"
+ */
+ public function __construct($host, $port = 110, $crypto = null)
+ {
+ $this->_host = $host;
+ $this->_port = $port;
+ $this->_crypto = $crypto;
+ }
+
+ /**
+ * Create a new PopBeforeSmtpPlugin for $host and $port.
+ *
+ * @param string $host
+ * @param int $port
+ * @param string $cypto as "tls" or "ssl"
+ *
+ * @return Swift_Plugins_PopBeforeSmtpPlugin
+ */
+ public static function newInstance($host, $port = 110, $crypto = null)
+ {
+ return new self($host, $port, $crypto);
+ }
+
+ /**
+ * Set a Pop3Connection to delegate to instead of connecting directly.
+ *
+ * @param Swift_Plugins_Pop_Pop3Connection $connection
+ */
+ public function setConnection(Swift_Plugins_Pop_Pop3Connection $connection)
+ {
+ $this->_connection = $connection;
+ return $this;
+ }
+
+ /**
+ * Bind this plugin to a specific SMTP transport instance.
+ *
+ * @param Swift_Transport
+ */
+ public function bindSmtp(Swift_Transport $smtp)
+ {
+ $this->_transport = $smtp;
+ }
+
+ /**
+ * Set the connection timeout in seconds (default 10).
+ *
+ * @param int $timeout
+ */
+ public function setTimeout($timeout)
+ {
+ $this->_timeout = (int) $timeout;
+ return $this;
+ }
+
+ /**
+ * Set the username to use when connecting (if needed).
+ *
+ * @param string $username
+ */
+ public function setUsername($username)
+ {
+ $this->_username = $username;
+ return $this;
+ }
+
+ /**
+ * Set the password to use when connecting (if needed).
+ *
+ * @param string $password
+ */
+ public function setPassword($password)
+ {
+ $this->_password = $password;
+ return $this;
+ }
+
+ /**
+ * Connect to the POP3 host and authenticate.
+ *
+ * @throws Swift_Plugins_Pop_Pop3Exception if connection fails
+ */
+ public function connect()
+ {
+ if (isset($this->_connection))
+ {
+ $this->_connection->connect();
+ }
+ else
+ {
+ if (!isset($this->_socket))
+ {
+ if (!$socket = fsockopen(
+ $this->_getHostString(), $this->_port, $errno, $errstr, $this->_timeout))
+ {
+ throw new Swift_Plugins_Pop_Pop3Exception(
+ sprintf('Failed to connect to POP3 host [%s]: %s', $this->_host, $errstr)
+ );
+ }
+ $this->_socket = $socket;
+
+ if (false === $greeting = fgets($this->_socket))
+ {
+ throw new Swift_Plugins_Pop_Pop3Exception(
+ sprintf('Failed to connect to POP3 host [%s]', trim($greeting))
+ );
+ }
+
+ $this->_assertOk($greeting);
+
+ if ($this->_username)
+ {
+ $this->_command(sprintf("USER %s\r\n", $this->_username));
+ $this->_command(sprintf("PASS %s\r\n", $this->_password));
+ }
+ }
+ }
+ }
+
+ /**
+ * Disconnect from the POP3 host.
+ */
+ public function disconnect()
+ {
+ if (isset($this->_connection))
+ {
+ $this->_connection->disconnect();
+ }
+ else
+ {
+ $this->_command("QUIT\r\n");
+ if (!fclose($this->_socket))
+ {
+ throw new Swift_Plugins_Pop_Pop3Exception(
+ sprintf('POP3 host [%s] connection could not be stopped', $this->_host)
+ );
+ }
+ $this->_socket = null;
+ }
+ }
+
+ /**
+ * Invoked just before a Transport is started.
+ *
+ * @param Swift_Events_TransportChangeEvent $evt
+ */
+ public function beforeTransportStarted(Swift_Events_TransportChangeEvent $evt)
+ {
+ if (isset($this->_transport))
+ {
+ if ($this->_transport !== $evt->getTransport())
+ {
+ return;
+ }
+ }
+
+ $this->connect();
+ $this->disconnect();
+ }
+
+ /**
+ * Not used.
+ */
+ public function transportStarted(Swift_Events_TransportChangeEvent $evt)
+ {
+ }
+
+ /**
+ * Not used.
+ */
+ public function beforeTransportStopped(Swift_Events_TransportChangeEvent $evt)
+ {
+ }
+
+ /**
+ * Not used.
+ */
+ public function transportStopped(Swift_Events_TransportChangeEvent $evt)
+ {
+ }
+
+ // -- Private Methods
+
+ private function _command($command)
+ {
+ if (!fwrite($this->_socket, $command))
+ {
+ throw new Swift_Plugins_Pop_Pop3Exception(
+ sprintf('Failed to write command [%s] to POP3 host', trim($command))
+ );
+ }
+
+ if (false === $response = fgets($this->_socket))
+ {
+ throw new Swift_Plugins_Pop_Pop3Exception(
+ sprintf('Failed to read from POP3 host after command [%s]', trim($command))
+ );
+ }
+
+ $this->_assertOk($response);
+
+ return $response;
+ }
+
+ private function _assertOk($response)
+ {
+ if (substr($response, 0, 3) != '+OK')
+ {
+ throw new Swift_Plugins_Pop_Pop3Exception(
+ sprintf('POP3 command failed [%s]', trim($response))
+ );
+ }
+ }
+
+ private function _getHostString()
+ {
+ $host = $this->_host;
+ switch (strtolower($this->_crypto))
+ {
+ case 'ssl':
+ $host = 'ssl://' . $host;
+ break;
+
+ case 'tls':
+ $host = 'tls://' . $host;
+ break;
+ }
+ return $host;
+ }
+
+}
diff --git a/External/swiftmailer/lib/classes/Swift/Plugins/Reporter.php b/External/swiftmailer/lib/classes/Swift/Plugins/Reporter.php
new file mode 100755
index 0000000..00d5765
--- /dev/null
+++ b/External/swiftmailer/lib/classes/Swift/Plugins/Reporter.php
@@ -0,0 +1,36 @@
+<?php
+
+/*
+ * This file is part of SwiftMailer.
+ * (c) 2004-2009 Chris Corbyn
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+//@require 'Swift/Mime/Message.php';
+
+/**
+ * The Reporter plugin sends pass/fail notification to a Reporter.
+ * @package Swift
+ * @subpackage Plugins
+ * @author Chris Corbyn
+ */
+interface Swift_Plugins_Reporter
+{
+
+ /** The recipient was accepted for delivery */
+ const RESULT_PASS = 0x01;
+
+ /** The recipient could not be accepted */
+ const RESULT_FAIL = 0x10;
+
+ /**
+ * Notifies this ReportNotifier that $address failed or succeeded.
+ * @param Swift_Mime_Message $message
+ * @param string $address
+ * @param int $result from {@link RESULT_PASS, RESULT_FAIL}
+ */
+ public function notify(Swift_Mime_Message $message, $address, $result);
+
+}
diff --git a/External/swiftmailer/lib/classes/Swift/Plugins/ReporterPlugin.php b/External/swiftmailer/lib/classes/Swift/Plugins/ReporterPlugin.php
new file mode 100755
index 0000000..1beac5b
--- /dev/null
+++ b/External/swiftmailer/lib/classes/Swift/Plugins/ReporterPlugin.php
@@ -0,0 +1,82 @@
+<?php
+
+/*
+ * This file is part of SwiftMailer.
+ * (c) 2004-2009 Chris Corbyn
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+//@require 'Swift/Events/SendListener.php';
+//@require 'Swift/Events/SendEvent.php';
+//@require 'Swift/Plugins/Reporter.php';
+
+/**
+ * Does real time reporting of pass/fail for each recipient.
+ * @package Swift
+ * @subpackage Plugins
+ * @author Chris Corbyn
+ */
+class Swift_Plugins_ReporterPlugin
+ implements Swift_Events_SendListener
+{
+
+ /**
+ * The reporter backend which takes notifications.
+ * @var Swift_Plugin_Reporter
+ * @access private
+ */
+ private $_reporter;
+
+ /**
+ * Create a new ReporterPlugin using $reporter.
+ * @param Swift_Plugins_Reporter $reporter
+ */
+ public function __construct(Swift_Plugins_Reporter $reporter)
+ {
+ $this->_reporter = $reporter;
+ }
+
+ /**
+ * Not used.
+ */
+ public function beforeSendPerformed(Swift_Events_SendEvent $evt)
+ {
+ }
+
+ /**
+ * Invoked immediately after the Message is sent.
+ * @param Swift_Events_SendEvent $evt
+ */
+ public function sendPerformed(Swift_Events_SendEvent $evt)
+ {
+ $message = $evt->getMessage();
+ $failures = array_flip($evt->getFailedRecipients());
+ foreach ((array) $message->getTo() as $address => $null)
+ {
+ $this->_reporter->notify(
+ $message, $address, (array_key_exists($address, $failures)
+ ? Swift_Plugins_Reporter::RESULT_FAIL
+ : Swift_Plugins_Reporter::RESULT_PASS)
+ );
+ }
+ foreach ((array) $message->getCc() as $address => $null)
+ {
+ $this->_reporter->notify(
+ $message, $address, (array_key_exists($address, $failures)
+ ? Swift_Plugins_Reporter::RESULT_FAIL
+ : Swift_Plugins_Reporter::RESULT_PASS)
+ );
+ }
+ foreach ((array) $message->getBcc() as $address => $null)
+ {
+ $this->_reporter->notify(
+ $message, $address, (array_key_exists($address, $failures)
+ ? Swift_Plugins_Reporter::RESULT_FAIL
+ : Swift_Plugins_Reporter::RESULT_PASS)
+ );
+ }
+ }
+
+}
diff --git a/External/swiftmailer/lib/classes/Swift/Plugins/Reporters/HitReporter.php b/External/swiftmailer/lib/classes/Swift/Plugins/Reporters/HitReporter.php
new file mode 100755
index 0000000..0022f5e
--- /dev/null
+++ b/External/swiftmailer/lib/classes/Swift/Plugins/Reporters/HitReporter.php
@@ -0,0 +1,63 @@
+<?php
+
+/*
+ * This file is part of SwiftMailer.
+ * (c) 2004-2009 Chris Corbyn
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+//@require 'Swift/Plugins/Reporter.php';
+//@require 'Swift/Mime/Message.php';
+
+/**
+ * A reporter which "collects" failures for the Reporter plugin.
+ * @package Swift
+ * @subpackage Plugins
+ * @author Chris Corbyn
+ */
+class Swift_Plugins_Reporters_HitReporter implements Swift_Plugins_Reporter
+{
+
+ /**
+ * The list of failures.
+ * @var array
+ * @access private
+ */
+ private $_failures = array();
+ private $_failures_cache = array();
+
+ /**
+ * Notifies this ReportNotifier that $address failed or succeeded.
+ * @param Swift_Mime_Message $message
+ * @param string $address
+ * @param int $result from {@link RESULT_PASS, RESULT_FAIL}
+ */
+ public function notify(Swift_Mime_Message $message, $address, $result)
+ {
+ if (self::RESULT_FAIL == $result && !isset($this->_failures_cache[$address]))
+ {
+ $this->_failures[] = $address;
+ $this->_failures_cache[$address] = true;
+ }
+ }
+
+ /**
+ * Get an array of addresses for which delivery failed.
+ * @return array
+ */
+ public function getFailedRecipients()
+ {
+ return $this->_failures;
+ }
+
+ /**
+ * Clear the buffer (empty the list).
+ */
+ public function clear()
+ {
+ $this->_failures = $this->_failures_cache = array();
+ }
+
+}
diff --git a/External/swiftmailer/lib/classes/Swift/Plugins/Reporters/HtmlReporter.php b/External/swiftmailer/lib/classes/Swift/Plugins/Reporters/HtmlReporter.php
new file mode 100755
index 0000000..7370078
--- /dev/null
+++ b/External/swiftmailer/lib/classes/Swift/Plugins/Reporters/HtmlReporter.php
@@ -0,0 +1,47 @@
+<?php
+
+/*
+ * This file is part of SwiftMailer.
+ * (c) 2004-2009 Chris Corbyn
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+//@require 'Swift/Plugins/Reporter.php';
+//@require 'Swift/Mime/Message.php';
+
+/**
+ * A HTML output reporter for the Reporter plugin.
+ * @package Swift
+ * @subpackage Plugins
+ * @author Chris Corbyn
+ */
+class Swift_Plugins_Reporters_HtmlReporter implements Swift_Plugins_Reporter
+{
+
+ /**
+ * Notifies this ReportNotifier that $address failed or succeeded.
+ * @param Swift_Mime_Message $message
+ * @param string $address
+ * @param int $result from {@link RESULT_PASS, RESULT_FAIL}
+ */
+ public function notify(Swift_Mime_Message $message, $address, $result)
+ {
+ if (self::RESULT_PASS == $result)
+ {
+ echo "<div style=\"color: #fff; background: #006600; padding: 2px; margin: 2px;\">" . PHP_EOL;
+ echo "PASS " . $address . PHP_EOL;
+ echo "</div>" . PHP_EOL;
+ flush();
+ }
+ else
+ {
+ echo "<div style=\"color: #fff; background: #880000; padding: 2px; margin: 2px;\">" . PHP_EOL;
+ echo "FAIL " . $address . PHP_EOL;
+ echo "</div>" . PHP_EOL;
+ flush();
+ }
+ }
+
+}
diff --git a/External/swiftmailer/lib/classes/Swift/Plugins/Sleeper.php b/External/swiftmailer/lib/classes/Swift/Plugins/Sleeper.php
new file mode 100755
index 0000000..148cbd3
--- /dev/null
+++ b/External/swiftmailer/lib/classes/Swift/Plugins/Sleeper.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * This file is part of SwiftMailer.
+ * (c) 2004-2009 Chris Corbyn
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Sleeps for a duration of time.
+ * @package Swift
+ * @subpackage Plugins
+ * @author Chris Corbyn
+ */
+interface Swift_Plugins_Sleeper
+{
+
+ /**
+ * Sleep for $seconds.
+ * @param int $seconds
+ */
+ public function sleep($seconds);
+
+}
diff --git a/External/swiftmailer/lib/classes/Swift/Plugins/ThrottlerPlugin.php b/External/swiftmailer/lib/classes/Swift/Plugins/ThrottlerPlugin.php
new file mode 100755
index 0000000..43bb1f4
--- /dev/null
+++ b/External/swiftmailer/lib/classes/Swift/Plugins/ThrottlerPlugin.php
@@ -0,0 +1,188 @@
+<?php
+
+/*
+ * This file is part of SwiftMailer.
+ * (c) 2004-2009 Chris Corbyn
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+//@require 'Swift/Events/SendEvent.php';
+//@require 'Swift/Plugins/BandwidthMonitorPlugin.php';
+//@require 'Swift/Plugins/Sleeper.php';
+//@require 'Swift/Plugins/Timer.php';
+
+/**
+ * Throttles the rate at which emails are sent.
+ * @package Swift
+ * @subpackage Plugins
+ * @author Chris Corbyn
+ */
+class Swift_Plugins_ThrottlerPlugin
+ extends Swift_Plugins_BandwidthMonitorPlugin
+ implements Swift_Plugins_Sleeper, Swift_Plugins_Timer
+{
+
+ /** Flag for throttling in bytes per minute */
+ const BYTES_PER_MINUTE = 0x01;
+
+ /** Flag for throttling in emails per minute */
+ const MESSAGES_PER_MINUTE = 0x10;
+
+ /**
+ * The Sleeper instance for sleeping.
+ * @var Swift_Plugins_Sleeper
+ * @access private
+ */
+ private $_sleeper;
+
+ /**
+ * The Timer instance which provides the timestamp.
+ * @var Swift_Plugins_Timer
+ * @access private
+ */
+ private $_timer;
+
+ /**
+ * The time at which the first email was sent.
+ * @var int
+ * @access private
+ */
+ private $_start;
+
+ /**
+ * The rate at which messages should be sent.
+ * @var int
+ * @access private
+ */
+ private $_rate;
+
+ /**
+ * The mode for throttling.
+ * This is {@link BYTES_PER_MINUTE} or {@link MESSAGES_PER_MINUTE}
+ * @var int
+ * @access private
+ */
+ private $_mode;
+
+ /**
+ * An internal counter of the number of messages sent.
+ * @var int
+ * @access private
+ */
+ private $_messages = 0;
+
+ /**
+ * Create a new ThrottlerPlugin.
+ * @param int $rate
+ * @param int $mode, defaults to {@link BYTES_PER_MINUTE}
+ * @param Swift_Plugins_Sleeper $sleeper (only needed in testing)
+ * @param Swift_Plugins_Timer $timer (only needed in testing)
+ */
+ public function __construct($rate, $mode = self::BYTES_PER_MINUTE,
+ Swift_Plugins_Sleeper $sleeper = null, Swift_Plugins_Timer $timer = null)
+ {
+ $this->_rate = $rate;
+ $this->_mode = $mode;
+ $this->_sleeper = $sleeper;
+ $this->_timer = $timer;
+ }
+
+ /**
+ * Invoked immediately before the Message is sent.
+ * @param Swift_Events_SendEvent $evt
+ */
+ public function beforeSendPerformed(Swift_Events_SendEvent $evt)
+ {
+ $time = $this->getTimestamp();
+ if (!isset($this->_start))
+ {
+ $this->_start = $time;
+ }
+ $duration = $time - $this->_start;
+
+ if (self::BYTES_PER_MINUTE == $this->_mode)
+ {
+ $sleep = $this->_throttleBytesPerMinute($duration);
+ }
+ else
+ {
+ $sleep = $this->_throttleMessagesPerMinute($duration);
+ }
+
+ if ($sleep > 0)
+ {
+ $this->sleep($sleep);
+ }
+ }
+
+ /**
+ * Invoked when a Message is sent.
+ * @param Swift_Events_SendEvent $evt
+ */
+ public function sendPerformed(Swift_Events_SendEvent $evt)
+ {
+ parent::sendPerformed($evt);
+ ++$this->_messages;
+ }
+
+ /**
+ * Sleep for $seconds.
+ * @param int $seconds
+ */
+ public function sleep($seconds)
+ {
+ if (isset($this->_sleeper))
+ {
+ $this->_sleeper->sleep($seconds);
+ }
+ else
+ {
+ sleep($seconds);
+ }
+ }
+
+ /**
+ * Get the current UNIX timestamp
+ * @return int
+ */
+ public function getTimestamp()
+ {
+ if (isset($this->_timer))
+ {
+ return $this->_timer->getTimestamp();
+ }
+ else
+ {
+ return time();
+ }
+ }
+
+ // -- Private methods
+
+ /**
+ * Get a number of seconds to sleep for.
+ * @param int $timePassed
+ * @return int
+ * @access private
+ */
+ private function _throttleBytesPerMinute($timePassed)
+ {
+ $expectedDuration = $this->getBytesOut() / ($this->_rate / 60);
+ return (int) ceil($expectedDuration - $timePassed);
+ }
+
+ /**
+ * Get a number of seconds to sleep for.
+ * @param int $timePassed
+ * @return int
+ * @access private
+ */
+ private function _throttleMessagesPerMinute($timePassed)
+ {
+ $expectedDuration = $this->_messages / ($this->_rate / 60);
+ return (int) ceil($expectedDuration - $timePassed);
+ }
+
+}
diff --git a/External/swiftmailer/lib/classes/Swift/Plugins/Timer.php b/External/swiftmailer/lib/classes/Swift/Plugins/Timer.php
new file mode 100755
index 0000000..92207bf
--- /dev/null
+++ b/External/swiftmailer/lib/classes/Swift/Plugins/Timer.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * This file is part of SwiftMailer.
+ * (c) 2004-2009 Chris Corbyn
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Provides timestamp data.
+ * @package Swift
+ * @subpackage Plugins
+ * @author Chris Corbyn
+ */
+interface Swift_Plugins_Timer
+{
+
+ /**
+ * Get the current UNIX timestamp.
+ * @return int
+ */
+ public function getTimestamp();
+
+}