You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
4.7 KiB
PHP
196 lines
4.7 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of SwiftMailer.
|
|
* (c) 2009 Fabien Potencier
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
/**
|
|
* Redirects all email to a single recipient.
|
|
*
|
|
* @package Swift
|
|
* @subpackage Plugins
|
|
* @author Fabien Potencier
|
|
*/
|
|
class Swift_Plugins_RedirectingPlugin implements Swift_Events_SendListener
|
|
{
|
|
/**
|
|
* The recipient who will receive all messages.
|
|
*
|
|
* @var string
|
|
*/
|
|
private $_recipient;
|
|
|
|
/**
|
|
* List of regular expression for recipient whitelisting
|
|
*
|
|
* @var array
|
|
*/
|
|
private $_whitelist = array();
|
|
|
|
/**
|
|
* Create a new RedirectingPlugin.
|
|
*
|
|
* @param string $recipient
|
|
* @param array $whitelist
|
|
*/
|
|
public function __construct($recipient, array $whitelist = array())
|
|
{
|
|
$this->_recipient = $recipient;
|
|
$this->_whitelist = $whitelist;
|
|
}
|
|
|
|
/**
|
|
* Set the recipient of all messages.
|
|
*
|
|
* @param string $recipient
|
|
*/
|
|
public function setRecipient($recipient)
|
|
{
|
|
$this->_recipient = $recipient;
|
|
}
|
|
|
|
/**
|
|
* Get the recipient of all messages.
|
|
*
|
|
* @return int
|
|
*/
|
|
public function getRecipient()
|
|
{
|
|
return $this->_recipient;
|
|
}
|
|
|
|
/**
|
|
* Set a list of regular expressions to whitelist certain recipients
|
|
*
|
|
* @param array $whitelist
|
|
*/
|
|
public function setWhitelist(array $whitelist)
|
|
{
|
|
$this->_whitelist = $whitelist;
|
|
}
|
|
|
|
/**
|
|
* Get the whitelist
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getWhitelist()
|
|
{
|
|
return $this->_whitelist;
|
|
}
|
|
|
|
/**
|
|
* Invoked immediately before the Message is sent.
|
|
*
|
|
* @param Swift_Events_SendEvent $evt
|
|
*/
|
|
public function beforeSendPerformed(Swift_Events_SendEvent $evt)
|
|
{
|
|
$message = $evt->getMessage();
|
|
$headers = $message->getHeaders();
|
|
|
|
// save current recipients
|
|
$headers->addMailboxHeader('X-Swift-To', $message->getTo());
|
|
$headers->addMailboxHeader('X-Swift-Cc', $message->getCc());
|
|
$headers->addMailboxHeader('X-Swift-Bcc', $message->getBcc());
|
|
|
|
// Add hard coded recipient
|
|
$message->addTo($this->_recipient);
|
|
|
|
// Filter remaining headers against whitelist
|
|
$this->_filterHeaderSet($headers, 'To');
|
|
$this->_filterHeaderSet($headers, 'Cc');
|
|
$this->_filterHeaderSet($headers, 'Bcc');
|
|
}
|
|
|
|
/**
|
|
* Filter header set against a whitelist of regular expressions
|
|
*
|
|
* @param Swift_Mime_HeaderSet $headerSet
|
|
* @param string $type
|
|
*/
|
|
private function _filterHeaderSet(Swift_Mime_HeaderSet $headerSet, $type)
|
|
{
|
|
foreach ($headerSet->getAll($type) as $headers) {
|
|
$headers->setNameAddresses($this->_filterNameAddresses($headers->getNameAddresses()));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Filtered list of addresses => name pairs
|
|
*
|
|
* @param array $recipients
|
|
* @return array
|
|
*/
|
|
private function _filterNameAddresses(array $recipients)
|
|
{
|
|
$filtered = array();
|
|
|
|
foreach ($recipients as $address => $name) {
|
|
if ($this->_isWhitelisted($address)) {
|
|
$filtered[$address] = $name;
|
|
}
|
|
}
|
|
|
|
return $filtered;
|
|
}
|
|
|
|
/**
|
|
* Matches address against whitelist of regular expressions
|
|
*
|
|
* @param $recipient
|
|
* @return bool
|
|
*/
|
|
protected function _isWhitelisted($recipient)
|
|
{
|
|
if ($recipient === $this->_recipient) {
|
|
return true;
|
|
}
|
|
|
|
foreach ($this->_whitelist as $pattern) {
|
|
if (preg_match($pattern, $recipient)) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* 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
|
|
|
|
private function _restoreMessage(Swift_Mime_Message $message)
|
|
{
|
|
// restore original headers
|
|
$headers = $message->getHeaders();
|
|
|
|
if ($headers->has('X-Swift-To')) {
|
|
$message->setTo($headers->get('X-Swift-To')->getNameAddresses());
|
|
$headers->removeAll('X-Swift-To');
|
|
}
|
|
|
|
if ($headers->has('X-Swift-Cc')) {
|
|
$message->setCc($headers->get('X-Swift-Cc')->getNameAddresses());
|
|
$headers->removeAll('X-Swift-Cc');
|
|
}
|
|
|
|
if ($headers->has('X-Swift-Bcc')) {
|
|
$message->setBcc($headers->get('X-Swift-Bcc')->getNameAddresses());
|
|
$headers->removeAll('X-Swift-Bcc');
|
|
}
|
|
}
|
|
}
|